一、Struts2
1.1 Struts2的定义
Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
1.2 Struts2的工作原理
- 客户端提交一个
HttpServletRequest
请求(action
或JSP
页面)。 - 请求被提交到一系列
Filter
过滤器,如ActionCleanUp
和FilterDispatcher
等。 FilterDispatcher
是Struts2
控制器的核心,它通常是过滤器链中的最后一个过滤器。- 请求被发送到
FilterDispatcher
后,FilterDispatcher
询问ActionMapper
是否需要调用某个action
来处理这个Request
。 - 如果
ActionMapper
决定需要调用某个action
,FilterDispatcher
则把请求交给ActionProxy
进行处理。 ActionProxy
通过Configuration Manager
询问框架的配置文件struts.xml
,找到调用的action
类。ActionProxy
创建一个ActionInvocation
实例,通过代理模式调用Action
。action
执行完毕后,返回一个result
字符串,此时再按相反的顺序通过Intercepter
拦截器。- 最后
ActionInvocation
实例,负责根据struts.xml
中配置result
元素,找到与之相对应的result
,决定进一步输出。
1.3 Struts2的构成
FilterDispatcher
是整个Struts2的调度中心,根据ActionMapper
的结果来决定是否处理请求,如果ActionMapper
指出该URL应该被Struts2处理,那么它将会执行Action
处理,并停止过滤器链上还没有执行的过滤器。ActionMapper
提供了HTTP请求与action
执行之间的映射,简单点说,ActionMapper
会判断这个请求是否应该被Struts2处理,如果需要Struts2处理,ActionMapper
会返回一个对象来描述请求对应的ActionInvocation
的信息。ActionProxy
是一个特别的中间层,位于Action
和xwork
之间,使得我们在将来有机会引入更多的实现方式,比如通过WebService
来实现等。ConfigurationManager
是xwork
配置的管理中心,通俗的讲,可以把它看做struts.xml
这个配置文件在内存中的对应。struts.xml
是Stuts2的应用配置文件,负责诸如URL
与Action
之间映射的配置、以及执行后页面跳转的Result
配置等。ActionInvocation
:真正调用并执行Action
,它拥有一个Action
实例和这个Action
所依赖的拦截器实例。ActionInvocation
会执行这些拦截器、Action
以及相应的Result
。Interceptor
(拦截器):拦截器是一些无状态的类,拦截器可以自动拦截Action
,它们给开发者提供了在Action
运行之前或Result
运行之后来执行一些功能代码的机会。类似于我们熟悉的javax.servlet.Filter
。Action
:动作类是Struts2中的动作执行单元。用来处理用户请求,并封装业务所需要的数据。Result
:Result
就是不同视图类型的抽象封装模型,不同的视图类型会对应不同的Result
实现,Struts2
中支持多种视图类型,比如Jsp
,FreeMarker
等。Templates
:各种视图类型的页面模板,比如JSP
就是一种模板页面技术。Tag Subsystem
:Struts2的标签库,它抽象了三种不同的视图技术JSP
、velocity
、freemarker
,可以在不同的视图技术中,几乎没有差别的使用这些标签。
1.4 Struts2的特点
- POJO形式和POJO动作 - 已经摆脱了Struts2的动作表单的Struts框架的一个组成部分。Struts2可以使用任何的POJO接收的形式输入。同样的,你现在可以看到任何POJO的Action类。
- Tag支持 - Struts2的形式提高了标签的新标签让开发人员写更少的代码。
- AJAX支持- Struts2中已经认识到了Web2.0技术,并整合到产品中AJAX支持创建AJAX的标签,该功能非常相似的标准Struts2的标签。
- 容易整合 - 与其他框架如Spring,Tiles和SiteMesh的整合是现在更容易与各种集成Struts2。
- 模板支持 - 支持生成使用模板。
- 插件支持 - 核心Struts2行为,可以加强和扩大使用插件。大量的插件可供Struts2。
- 概要分析- Struts2的提供集成的配置,调试和分析应用程序。此外,Struts还提供了内置调试工具的帮助下,集成调试。
- 标签修改容易 - 在Struts2标签标记,可以调整使用FreeMarker模板。这并不需要JSP或Java知识。基本的HTML,XML和CSS知识是不够的修改的标签。
- 提升更少的配置 - Struts2的促进更少的配置与用于各种设置的帮助下,使用默认值。你没有的东西,除非它偏离由Struts2的默认设置的配置。
二、Struts2的简单配置
2.1 解压Struts2的压缩包
如图下所示
apps:应用示例
docs:文档资料
lib:库(*.jar)文件
src:源码资料
2.2 解压apps\struts2-blank.war(提供的空工程)
如图所示
![]()
示例空白工程源码
2.3 找到项目的配置文件
struts2-blank\WEB-INF\web.xml
拷贝过滤器的配置信息到自己的项目中(通过观察发现,该过滤器过滤项目中所有的请求)
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.4 拷贝项目中的jar包
struts2-blank\WEB-INF\lib路径下所有的jar包
2.5 拷贝struts2的核心配置文件(struts.xml
)
将struts2-blank\WEB-INF\classes\struts.xml
拷贝至src根目录
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<global-results>
<result name="error">/WEB-INF/jsp/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>
<action name="index">
<result type="redirectAction">
<param name="actionName">HelloWorld</param>
<param name="namespace">/example</param>
</result>
</action>
</package>
<include file="example.xml"/>
<!-- Add packages here -->
</struts>
2.6 创建一个普通的java类,然后再类中创建一个普通的方法
public class Hello {
public String helloStruts() {
System.out.println("Hello Struts " + this);
return null;
}
}
2.7 开始在struts.xml中配置java类
删除其他的配置信息
在package
标签中配置action
元素以及name
,class
,method
三个属性。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="shs" class="shs.hello.Hello" method="helloStruts"></action>
</package>
</struts>