MVC模型中,浏览器端和服务器端的交互总是以一个明确的URL作为中心,辅之以参数请求,我们可以非常明确地获取到一次交互中所有的Http信息,Controller层的设计差异是不同MVC框架之间最主要的差异,也就是Controlle如何响应页面请求,下面介绍几种常见MVC的Controller设计
Servlet
参数列表 —— Http请求被封装为一个HttpServletRequest对象(或者ServletRequest对象),而Http响应封装为一个HttpServletResponse对象(或者ServletResponse对象)
返回值 —— 方法不存在返回值
Servlet为参数-参数(Param-Param)实现模式
Struts1
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response);
- 保留了HttpServletRequest和HttpServletResponse这两大接口作为参数
- 将返回值改为ActionForward,并由Struts1.X框架通过处理ActionForward完成对响应结果的处理
- 增加了ActionMapping和ActionForm两大参数,前者表示Http请求的一个简要概括,后者表示一个数据模型,用以承载整个请求生命周期中的数据
Struts1为参数-返回值(Param-Return)实现模式
Struts2
public class UserController {
private User user
public String execute() {
// 这里加入业务逻辑代码
return "success";
}
// 这里省略了setter和getter方法
}
- 在Controller中彻底杜绝引入HttpServletRequest或者HttpServletResponse这样原生Servlet对象
- 将请求参数和响应数据都从响应方法中剥离到了Controller中的属性变量
Struts2的Controller看起来更像是一个POJO,整个Controller类彻底与Web容器解耦,摆脱了Servlet束缚,可以方便地进行单元测试
SpringMVC
@Controller
@RequestMapping
public class UserController {
@RequestMapping("/register")
public ModelAndView register(String email, String password) {
// 在这里调用具体的业务逻辑代码
return new ModelAndView("register-success");
}
}
- 使用参数-返回值(Param-Return)实现模式来打造Controller。SpringMVC屏蔽了内在的处理细节,呈现出来的是与请求参数名称一一对应的参数列表。而返回值ModelAndView则表示Http的响应是一个数据与视图的结合体,表示Http的处理结果
- 引入Annotation来完成请求-响应的映射关系,配置简化
- 泛化参数和返回值的含义