从整个B/S程序的运行结构来看,J2EE的表示层解决方案实际上是对“请求-响应”模式的一种实现。既然谓之“请求-响应”也就势必存在着两大沟通角色: 请求对象和响应对象。Servlet、SpringMVC、Struts2对请求-响应的实现是分别基于参数-参数模式、参数返回值、和POJO模式的,由于这两大角色的承载载体和编程语言实现基础都不同,因此三种模式的可谓风格迥异。
参数-参数模式 | 参数-返回值模式 | POJO模式 | |
请求方 | 方法参数 | 方法参数 | 属性变量 |
响应方 | 方法参数 | 返回值 | 属性变量 |
【参数-参数模式】
Servlet对象是运行在行为模式(只有一系列方法的定义,而不包含属性的定义),在Servlet中请求的内容和响应的内容分别被封装在HttpServletRequest对象中和HttpServletResponse对象中,也就是说请求和响应均存在于方法的参数列表中,因此Servlet对象又叫“无状态对象”。这
里实际上有一点“数据与行为分离”的意味。也就是说,在Servlet处理请求的过程中,其实也是Servlet中响应方法内部的逻辑执行过程中,如果需
要处理请求数据或者返回数据,那么我们需要和HttpServletRequest打交道;如果需要处理执行完毕之后的响应结果,那么我们需要和
HttpServletResponse打交道。 基于这种模式的请求-响应模式称为参数-参数模式。参数-参数模式是一种最为基础的请求响应实现机制,也是底层规范不得不采用的一种机制。也就是无论参数-返回值、POJO模式的实现都是依赖于依赖于参数-参数模式。
【参数-返回值模式】
而在SpringMVC的Controller使用的是使用参数-返回值实现模式,参数-返回值模式是一种最为直观的请求-响应实现模式,SpringMVC中对于Controller的定义如下:
方
法的参数(email和password)被视作是Http请求参数的概括。而在这里,它们已经被SpringMVC的框架有效处理并屏蔽了内在的处理细
节,呈现出来的是与请求参数名称一一对应的参数列表。而返回值ModelAndView则表示Http的响应是一个数据与视图的结合体,表示Http的处
理结果。 而方法体本身,再其内部包含了逻辑处理的整个过程。
【POJO模式】
最后Struts2对请求-响应的实现是通过POJO对象,请求参数和响应内容全部以POJO内部属性而存在,传统Servlet模式中的禁地Controller中的属性变量被合理利用了起来作为请求处理过程中的数据部分。POJO模式颠覆了前两种实现模式以java类中的方法的语法特性为原型基础进行请求响应的的传统模式。POJO模式是对Servlet模式的一个重大改进。POJO实现模式是一种具有革命性意义的模式,因为它能够把解耦合这样一个观点发挥到极致。从面向对象的角度来看,POJO模式无疑也是所有程序员所追求的一个目标。这也就是Struts2那么多年来经久不衰的一个重要原因。
三种不同实现模式存在着一些分歧,他们之间的主要分歧在于:不同的实现模式使用了不同的编程元素(方法参数、方法返回值、类的属性)来表达请求-响应模式中不同的逻辑语义。
Servlet、SpringMVC、Struts2对请求-响应模式实现