以下是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)无关。
因此,理想情况下,您只需将横切关注点(如验证、身份验证、缓存等)分解到控制器中,并将核心业务逻辑留在模型中。