在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个参数视为整数。所以我有两个选择:
在这种情况下,这是控制器代码:
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) {
...
}
}
在这种情况下,这是控制器代码:
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)我确信它应该在控制器中。
答案 0 :(得分:0)
您应该考虑在您的域中最有意义的表示形式,并将其用于您的模型。让控制器将其接收的字符串表示调整为模型数据类型。
因此,在您的示例中,控制器应负责转换为int,并在未收到int的情况下返回格式错误的请求。
更新: 根据经验,您希望将域对象构造为有效,因此我会在域边界之前执行所有这些检查。从某种意义上说,他们是世界的一部分"在外面"你的域名。它们链接到模型的外部表示,在本例中为http参数