在哪里执行请求参数数据类型转换:控制器还是模型?

时间:2015-03-28 01:53:19

标签: java servlets model-view-controller model controller

在MVC应用程序中,在哪里执行请求参数数据类型转换:Controller或Model?

例如,我有3个带有请求的参数:user_name,password,role_id。所以我在控制器中收到了所有3个字符串。例如,控制器代码:

public class MyServlet extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      String userName = request.getParameter("user_name");
      String password = request.getParameter("password");
      String roleId = request.getParameter("role_id");
   }
}

必须将第3个参数视为整数。所以我有两个选择:

  1. 首先在控制器中将其转换为整数,然后将其传递给模型
  2. 在这种情况下,这是控制器代码:

    public class MyServlet extends HttpServlet {
       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          String userName = request.getParameter("user_name");
          String password = request.getParameter("password");
          String roleId = request.getParameter("role_id");
          int roleIdN = Integer.parseInt(roleId);
          MyService myService = new MyService();
          boolean result = myService.login(userName, password, roleIdN);
          ...
       }
    }
    

    这是模型代码:

    public class MyService {
       public boolean login(String userName, String password, int roleId) {
          ...
       }
    }
    
    1. 将其作为字符串传递给模型; 模型会在使用之前将其转换为整数。
    2. 在这种情况下,这是控制器代码:

      public class MyServlet extends HttpServlet {
         protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String userName = request.getParameter("user_name");
            String password = request.getParameter("password");
            String roleId = request.getParameter("role_id");
            MyService myService = new MyService();
            boolean result = myService.login(userName, password, roleId);
            ...
         }
      }
      

      这是模型代码:

      public class MyService {
         public boolean login(String userName, String password, String roleId) {
            int roleIdN = Integer.parseInt(roleId);
            ...
         }
      }
      

      最有意义的地方?我试图找出控制器模型的界限。如果第3个参数不包含数字怎么办?

      更新

      AFAIK这些是检查:
      (a)请求中存在参数 (b)参数不为空或空 (c)参数可以转换为各自正确的数据类型 (d)参数存在于正确的范围内,例如role_id应该是1到4之间的数字。

      哪些检查应该在控制器中,哪些应在模型? 仅适用于(a)我确信它应该在控制器中。

1 个答案:

答案 0 :(得分:0)

您应该考虑在您的域中最有意义的表示形式,并将其用于您的模型。让控制器将其接收的字符串表示调整为模型数据类型。

因此,在您的示例中,控制器应负责转换为int,并在未收到int的情况下返回格式错误的请求。

更新: 根据经验,您希望将域对象构造为有效,因此我会在域边界之前执行所有这些检查。从某种意义上说,他们是世界的一部分"在外面"你的域名。它们链接到模型的外部表示,在本例中为http参数