最近这两个星期加班都比较晚,12点左右吧。现在项目的问题都处理的差不多了,抽空写下对前段时间遇到问题的思考。
这段时间参与的这个项目,在jsp与action之间交互使用VO(value object 值对象),java与数据库之间使用PO(persistant object 持久对象)。vo就是po的简化版,只有po的部分属性。此前自己做的项目都是使用同一个pojo来实现页面与action和java与数据库之间的数据传递。这引发了我的一个思考,有没有必要创建独立的vo对象?
我猜测原开发人员创建vo对象的初衷就是减少不必要属性的暴露,减少传输数据。但是,jsp在运行时会被编译成servlet,是在服务器端运行的,输出的是符合http协议的报文,使用vo减少不必要属性的暴露,减少传输数据的说法是不成立的。为了验证想法,有必要弄清楚web服务器处理一次请求的流程。先来分析下web服务器是怎么工作的,以tomcat处理一次servlet请求为例。
Tomcat的结构
tomcat的结构很复杂,但是Tomcat也非常模块化。下面是tomcat的总体架构图:
从上图可以看出Tomcat的核心是两个组件:连接器(Connector)和容器(Container)。Connector组件是负责生成请求对象和响应对象的,Tomcat默认的是HttpConnector,负责根据收到的Http请求报文生成Request对象和Response对象,并把这两个对象传递给Container,然后根据Response中的内容生成相应的HTTP报文。
Container是容器的父接口,所有子容器都必须实现这个接口,简单来说就是服务器部署的项目是运行在Container中的。Container里面的项目获取到Connector传递过来对应的的Request对象和Response对象进行相应的操作。
Connector可以根据不同的设计和应用场景进行替换。一个Container可以选择对应多个Connector。多个Connector和一个Container就形成了一个Service,有了Service就可以对外提供服务了。
Tomcat处理请求流程
Tomcat要为一个Servlet的请求提供服务,需要做三件事:
1、创建一个request对象并填充那些有可能被所引用的Servlet使用的信息,如参数,头部、cookies、查询字符串等。一个request对象就是javax.servlet.ServletRequest或javax.servlet.http.ServletRequest接口的一个实例。
2、 创建一个response对象,所引用的servlet使用它来给客户端发送响应。一个response对象是javax.servlet.ServletRequest或javax.servlet.http.ServletRequest接口的一个实例。
3、 调用servlet的service方法,并传入request和response对象。这里servlet会从request对象取值,给response写值。
4、根据servlet返回的response生成相应的HTTP响应报文。
最后,回到原来的那个问题——在页面与action层之间创建vo来传递数据真没必要。
参考资料:http://blog.csdn.net/beijiguangyong/article/details/7439352
http://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/index.html