Struts框架与Servlet
我们知道Sun的Java Servlet作为一个基本的平台来为基于Java的Web应用程序提供了很多重要的功能。从Servlet API我们可以发现,Servlet提供了一个基本的接口来处理HTTP的请求和响应,而且我们可以用Session的上下文或其它的上下文(如请求上下文request)来作为跟踪应用程序的用户的重要的手段。其实大部分表现层框架都有一个共性的地方:以Servlet API为基础,封装一些那些经常要处理的而且是令人厌烦的、繁琐的实现细节,比如说:在一个Web应用中,表单数据的接收是一件经常要做的事,因为有大量的来自客户端用户提交的表单,然后针对这些表单,我们总是要详细分析Http请求来取出页面表单的值来。Struts是一个比较好的MVC体系结构的框架,提供了对开发MVC系统的底层支持,采用的主要技术是Servlet,JSP和Custom tag library。
Struts框架的组件结构图
从上面的组件结构图我们可以看出来,Struts的核心ActionServlet是一个MVC风格的控制器,它是连接应用程序的Model和View之间的一座桥梁。
Struts跟Model 2, MVC, 层层模式,在<<UML和模式应用>>第3版(Applying UML and Patterns)这本书讲到逻辑架构时说到了有关层模式的概念,其中有一个准则叫做:模型-视图分离原则。这个原则规定模型(领域)对象不应该直接与视图(UI)对象连接。Struts 通过提供一个控制器ActionServlet实现了Sun的 Model 2 架构,这个控制器可以用来管理JSP页面和ActionMapping来保证表现层之外的控制流决策来实现MVC/层模式,通过Struts的配置文件, JSP可以引用一个逻辑目标。控制器组件在运行时提供准确的URI。 供一个控制器Servlet实现了Sun的 Model 2 架构,其他表现设备之间的流程。Struts 通过使用ActionForward MVC/层 模式。
下表列出了Struts的核心类,即对应的经典的MVC组件职责。
核心Struts 类和MVC的对应
除了这些核心类,Struts使用一些配置文件和视图助手(view helpers)来沟通控制器和模型。下表列出了Struts 配置文件和描述了他们在架构中的角色。为将Struts配置数据暴露给视图,框架以JSP标签的形式提供了大量的助手类,这些都是struts自定义标签,如下表:
Strtuts配置文件
将以上内容放在一起,下表按层列出了Struts 组件:
Struts 组件,按层索引
在<<UML和模式应用>>这本书里提到了层模式中的组件应该只能和相同层和相邻层的组件交互。因此,Model 组件不能直接和View组件进行交互。我们还可以从上表中看出来,Struts中的大部分的组件其实是属于控制层的组件,因为Struts没有对模型层有严格的规定,我们可以用EJB或者其它的开源框架等。
实践中,控制器与视图的交互通过请求(request),会话(session)以及 Servlet平台提供的应用上下文进行(context)。 控制器和模型的交互通过文件和存储系统完成 (比如装入sturts的XML配置文档或者属性文件),或者通过其他服务,如TCP, 创建一个到JDBC数据库的连接。