Controller 设计

本贴最后更新于 2709 天前,其中的信息可能已经时移世改

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 来完成请求-响应的映射关系,配置简化
  • 泛化参数和返回值的含义

  • 设计
    115 引用 • 797 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...