我想知道您将在哪里处理 MVC 框架中的表单提交?您是否有一个模型来处理逻辑或直接在控制器中处理它?
假设这是一个注册表单,最终将在数据库中创建一个用户。
你会如何处理这样的事情?
我将采取的方法是验证控制器中的表单数据,使用数据创建用户模型并将其保存到数据库中。但是,我已经看到专门处理表单数据的模型(控制器加载了一个表单模型,将 $_POST 数据传递给它),我想知道是否有必要
谢谢
我想知道您将在哪里处理 MVC 框架中的表单提交?您是否有一个模型来处理逻辑或直接在控制器中处理它?
假设这是一个注册表单,最终将在数据库中创建一个用户。
你会如何处理这样的事情?
我将采取的方法是验证控制器中的表单数据,使用数据创建用户模型并将其保存到数据库中。但是,我已经看到专门处理表单数据的模型(控制器加载了一个表单模型,将 $_POST 数据传递给它),我想知道是否有必要
谢谢
以下是Struts 2
(最好的 MVC 框架之一)如何处理典型的用户注册。
Registration Page --Submit-->
Filter Dispatcher (Controller) --Struts-->
Interceptor --Stack--> Validator --Passed-->
Action (Model)
--Invokes--> Service/DAO Layer --Persists--> Database
Result <--returns-- Action
JSP (View) (selected based on result)
Interceptor (any post-processing)
Registration Success HTML
不像Servlets
你实际上没有写任何控制器;您只需使用声明式配置框架Struts.xml
,然后它会按照配置编排整个 MVC 流程。
它Controller
通过拦截器执行验证,并将预填充和验证的数据对象传递给模型以持久保存到数据库中。
public class UserRegistrationAction {
private User user = new User();
public User getModel() { // Struts Callback
return user; // automatically gets populated with validated values
}
// This will seem incorrect to someone used to Spring's setter injection but
// Struts injects in reverse; pulls the model onto a ValueStack to inject properties
public String execute() {
// already validated; simply persist
UserRegistrationService.getInstance().persist(getUser());
return Action.SUCCESS;
}
...
}
所以,是的,你在控制器中实现验证是正确的。
但是,话虽如此,对数据的任何处理都应始终在模型本身中进行。假设您还询问了您的用户是否愿意导入他们的 Facebook 好友列表或 GMail 联系人列表,并且他们同意并提供了必要的详细信息:
public String execute() {
user.setContactsList(
thirdPartyService.getInstance(getPartyCode()).fetchContacts(user.getAuthInfo())
);
UserRegistrationService.getInstance().persist(getUser());
return Action.SUCCESS;
}
使用第三方服务进行身份验证和获取其他详细信息以更新您的用户对象(在您持久化之前)的逻辑也将进入您的模型。这是因为这构成了您的业务逻辑,并且应该封装在独立的可重用模型类中,而与您用于实现控制器(Servlet、Stuts 或 Spring MVC)的技术无关。
因此,理想情况下,您只需将横切关注点(如验证、身份验证、缓存等)分解到控制器中,并将核心业务逻辑留在模型中。
关注点分离是这里的关键。话虽如此,您的控制器不应该知道表单数据。事实上,控制器根本不需要任何 html 表单的概念。
您的模型应该封装您打算通过某种形式提供的值。您的控制器对模型执行操作(例如,将数据从模型加载到数据库)。
每个 MVC 框架在使用的约定上都会略有不同,但在一般意义上,我上面所说的应该适用于任何 MVC 框架。
更新(回应您的评论):
不,恰恰相反。您的表单数据应该由传递给控制器的模型/视图模型封装,控制器插入/更新您的底层数据存储(即您的数据库)。将 MVC 视为高速公路系统。您的模型是沿着路径行驶的汽车,控制器指挥交通。模型通常是包含数据字段的简单对象,控制器使用该数据执行操作。模型/视图模型与您的数据库数据是分开的;模型是您愿意呈现给视图(表示层)的内容。您的数据库是与您的视图/模型/控制器分开的层/层,尽管您的控制器负责将模型转换为您的底层数据库。