本文对Struts做了一个简单的综述性的叙述,用Struts时浏览一遍便可以知道Struts2提供的大部分功能。具体细节没有介绍。
一 Struts2处理流程和体系结构
体系结构:
一个请求在Struts2框架中的处理大概分为以下几个步骤:
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。
处理流程:
二 Struts2配置
1配置web.xml
主要配置struts2的全局应用信息。
2配置struts.properties
用来定义Struts2的一些属性。
3配置struts.xml
Struts.xml文件主要负责管理Action的映射以及Action包含的result定义。除此之外,还负责Bean配置,常量配置,包配置、命名空间配置和包含配置。
包配置是对某包中所有的Action的统一管理,如配置拦截器。在配置包是,可以配置包的命名空间(namespace属性),则Action处理的URL应该是”URL+命名空间/Action”。
包含配置主要是为了更好地管理讲不同的Action配置到不同的xml文件中。
三 拦截器
1拦截器工作原理
拦截器是一种面线切面编程(AOP)的实现���略,将一些常用的功能重用,如输入校验、上传文件等。
2拦截器配置
定义拦截器:<interceptor name=”拦截器名字” class=”拦截器对应的java类”>
将多个拦截器合并在一起组成拦截器栈,可一起被附加到Action。
1
2
3
4
5
6
7
8
9
<interceptor-stack name="拦截器栈名">
<interceptor-ref name="拦截器名1"/>
<interceptor-ref name="拦截器名2"/>
<interceptor-ref name="拦截器名3"/>
</interceptor-stack>
拦截器栈里可以为每个拦截器制定参数,也可以同一指定。
使用拦截器栈:
可以使用<interceptor-ref>在Action中配置拦截器或配置器栈。
系统存在默认拦截器栈,可实现大部分的功能。
同时,也可以在package中配置默认拦截器栈。
3自定义拦截器
实现拦截器类(Interceptor接口),定义拦截器并使用。
4 拦截器方法过滤
有些Action中包含不同的方法,可以通过配置,设置需要和不需要拦截的方法。
5内建拦截器
四 Action和类型转换
1 访问ActionContext
ActionContext是Action的上下文对象,Action运行期间的所有数据都保存在此,可以通过该类访问Servlet API。
使用以下代码来创建使用ActionContext:
ActionContext ac= ActionContext.getContext();
通过ActionContext的常用方法可以访问或设置application上下文和session值等。
2 直接访问Servlet API
上一种只能获得request,而直接访问可以访问response。直接访问分为IoC方式和非IoC方式,一般推荐第二种,比较方便。
3 配置Action
配置Action时,result标签有不同的类型,如chain、redirect等。Redirect用来重定向。
若某一结果的视图多次使用,可以配置为全局结果,如:
<global-results>
<result name=”error”>/error.jsp</result>
</global-results>
注:局部视图可覆盖全局视图。
配置时可以使用通配符,使用通配符可以减少很多配置编码量。(实习时george曾问我这个问题,当时我竟然不知道,全部都硬编码….)
4 简单类型转换
简单类型系统会自动转换,同时,也可以使用一个JavaBean来封装客户端请求参数,在文本框中使用OGNL表达式。
5 集合类型转换
对于Action中的List,form表单也可以传入相应的数值。
五 标签库
Struts2的标签的分类如下:
1控制标签
主要有if-else以及对集合的操作的标签。
主要介绍一下集合操作标签。
Iterator:可对集合类型进行迭代输出,包括List、Set、数组、Map等。
Append:将多个集合对象链接起来。
Merge:同append一样,但是连接后的新集合中,元素的排序方式不同。
Generator:通过指定的分隔符将字符串分割成多个子串。
Sort:对集合进行排序,排序规则实现Comparator实例。
2 数据标签
Action:直接在页面中调用一个Action,增加重用性。
Bean:在页面中创建一个JavaBean实例对象。
Debug:辅助调试,可以看到ValueStack和StackContext中的信息。
Include:将JSP或Servlet包含到当前页面。在include标签中可以使用param标签传入参数。
Param:与其他标签结合使用,提供参数。
Property:显示输出指定的value属性。
Set:定义一个新变量,并可以为其指定范围。
url:生成一个URL地址。
Date:按指定格式输出一个日期。
3 表单UI标签
Checkboxlist:创建复选框。
Radio:单选框。
Combobox:下拉框和单行文本框。下拉框辅助输入。
Select:下拉框。
Doubleselect:两个相关联的下拉列表框。
Optgroup:生成选项组,在select中使用。
Datetimepicker:生成日历。
Token:防止用户多次提交表单。
Updownselect:上移、下移和全选。
Optiontransferselect两个列表框。
4 非表单UI标签
Actionerror&actionmessage:输出Action的消息。在action中使用addActionError(“string”)和addActionMessage(“string”)设置返回内容。
Component:使用自定义组件。同时可以使用param传入参数。(翻页组件我觉得就可以)
Tree和treenode:生成一个树状结构。必须设置theme=”ajax”
五 输入校验
Struts2校验主要分为两种,第一种是重写validate()方法,第二种通过配置action-validation.xmla文件使用内置校验器进行校验。
Struts2默认为服务器端校验,但是在form表单标签中使用属性validate=”true”可添加客户端校验。
1 重写validate()方法
在此方法中,如果校验没有通过可记录fileError属性,框架在执行execute之前会自动判断是否有fieldError属性,如果有的话则返回结果为input。
如果只需要校验Action中的某一方法,则可以重写validateXxx方法。
2 内置器校验
内置校验器可使用字段校验器配置风格和校验器类型配置风格。
常见的内置校验器有:必填校验器、字符串长度校验器、整数范围校验器、日期校验器、以及:
表达式校验器:非字段验证器,要求OGNL表达式的返回值为true。
字段表达式验证:制定字段必须满足一个逻辑表达式。
邮件地址校验器
网址校验器
转换验证器
正则表达式校验器
3 自定义校验器
六 Struts2高级技巧
1 国际化
目前用不到,以前用过,用到再说。
2 异常处理
Struts2异常处理可在struts.xml文件中配置,而在Action中不需要编写任何异常处理代码。
Struts.xml文件中使用<exception-mapping>元素进行异常映射,包括两个属性:
Exception:指定异常的类型。
Result:指定异常出现时,返回给用户的视图名称。
异常映射范围分为两种:
全局异常映射,使用<global-exception-mapping>元素配置,内部使用异常标签。映射范围是package中的所有action。
局部异常映射:在Action配置内部使用异常标签,范围是他所在的action。局部映射可覆盖全局映射。
3 OGNL
OGNL是一种方便操作对象属性的语言。如果熟练使用需要一大篇篇幅介绍,这里只介绍三种符号的基本用途。
#:
访问OGNL上下文和Action上下文,相当于ActionContext.getContext()。如#session.userNmae.
过滤和投影集合。如newsList.{?#this.id==1}.{title}[0]
构造Map。如#{‘book’:’23′,’book2′:’25′}
%
计算OGNL的表达式
$
国际化文件中使用OGNL表达式。
配置文件中使用OGNL表达式。(一般是制定URL路径中需要带有参数)
eg:<result type=”redirect”>/myOGNL.action?id=${id}</result>
4 文件上传和下载
没啥好说的,很简单,用的时候对着书看看就行了。