Struts2提供了基于MVC应用程序的开发模式,从而使应用程序结构更加清晰,同时也简化了Web应用程序的开发。
Struts2的组成结构
主要包括控制器组件(包括核心控制器StrutsPrepareAndExecuteFilter、业务控制器Action)、模型组件(包括业务逻辑组件和数据库访问组件)和视图组件。
- 模型组件:实现业务逻辑的模块,由JavaBean或EJB构成。
- 视图组件:主要有HTML、JSP和Struts2标签等视图技术。
- 控制器组件:控制器组件主要由核心控制器和业务控制器Action组成。
Struts2框架结构
- StrutsPrepareAndExecuteFilter是整个Struts2的核心控制器,根据ActionMapper的结果来决定是否处理请求,如果ActionMapper指出该URL应该被Struts2处理,就执行Action处理,并停止过滤器链上还没有执行的过滤器。
- ActionMapper提供了HTTP请求与Action执行之间的映射,即ActionMapper判断请求是否应该被Struts处理。若需要Struts2处理,ActionMapper返回一个对象来描述请求对应的ActionInvocation的信息。(注意不是返回ActionInvocation的对象)
- ActionProxy是一个特别的中间层,位于Action和xwork之间,可以根据需求引入更多的实现方式,比如通过WebService来实现等。
- ConfigurationManager是xwork配置的管理中心,可以理解为struts.xml配置文件在内存中的对应。
- struts.xml是Struts2的应用配置文件,负责URL与Action之间映射的配置,以及执行后页面跳转的Result配置等。
- ActionInvocation:调用并执行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。
- Interceptor(拦截器):自动拦截Action,提供了在Action运行之前或Result运行之后可能需要执行的某功能代码。类似javax.servlet.Filter。
- Action:是Struts2中的动作执行单元(执行类),用来处理用户请求,并封装业务所需要的数据。
- Result:是不同视图类型的抽象封装模型,不同的视图类型会对应不同的Result实现,Struts2中支持多种视图类型,比如JSP、FreeMarker等。
- Templates:各种视图类型的页面模板,比如JSP就是一种模板页面技术。
- TagSubsystem:Struts2的标签库,它抽象了3种不同的视图技术:JSP、velocity和freemarker,可以在不同的视图技术中直接使用这些标签。
工作流程
Struts2框架的核心控制器负责拦截由<url-pattern>/*</url-pattern>指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。当请求转入Struts2框架处理时会先经过一系列的拦截器,然后再到Action。Struts2对用户的每一次请求都会创建一个Action并运行,根据其运行返回的值,按Result配置信息,跳转到新的服务(进入视图或Action)。
具体流程:
- 客户发送请求给StrutsPrepareAndExecuteFilter。
- StrutsPrepareAndExecuteFilter询问ActionMapper,该请求是否是一个Struts2请求(即是否返回一个非空的ActionMapping对象)。
- 若ActionMapper认为该请求是一个Struts2请求,则StrutsPrepareAndExecuteFilter把请求交给ActionProxy处理。
- ActionProxy通过Configuration Manager询问框架的配置文件,确定需要调用的Action类及Action方法。
- ActionProxy创建一个ActionInvocation的实例,并进行初始化。
- ActionInvocation实例在调用Action的过程前后,涉及相关拦截器(Interceptor)的调用。
- Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。调用结果的execute()方法(或配置指定的方法),渲染结果。
- 执行各个拦截器Invocation.invoke()之后的代码。
- 把结果发送到客户端。
在开发基于Struts2的Web应用程序,开发者主要的任务就是设计Action、在配置文件内配置Action信息,以及编写视图的工作。
必须的配置信息
1)在配置文件web.xml中配置Struts2的启动信息
Struts2通过StrutsPrepareAndExecuteFilter过滤器来启动,即需要在web.xml文件中添加Struts2的启动配置信息。
<!--定义Struts2的核心控制器Filter--> <!--这里是用过滤器作为控制器--> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsAndexecuteFilter </filter-class> </filter> <!--配置Struts2可以处理的Action请求--> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2)在当前Web应用的classpath下添加struts2的配置文件struts.xml。
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <!--配置文件的头信息--> <struts> <!--各种配置信息--> </struts>