class="manning.chapterTwo.HelloWorld">.....
d)配置结果:
/chapterTwo/HelloWorld.jsp
e)配置拦截器:
f)配置全局结果:
g)配置全局异常:
三、常用Result类型:
1.chain:
动作链(转发方式),从一个动作转到另一个动作上去执行。
实现类:
com.opensymphony.xwork2.ActionChainResult
2.dispatcher(默认结果类型):
转发,使用RequestDispatcher来转发或包含。
实现类:
org.apache.struts2.dispatcher.ServletDispatcherResult
3.redirect:
重定向,实际上调用response.sendRedirect(..)完成,这样意味着会丢失当前请求中的数据,必要时需要URL编码来传参。
实现类:
org.apache.struts2.dispatcher.ServletRedirectResult
4.redirectAction:
类似redirect结果类型,但比redirect结果要好,因为在struts.xml配置文件中无需去编码URL,建义使用该结果类型而不用redirect类型。
实现类:
org.apache.struts2.dispatcher.ServletActionRedirectResult
5.stream:
流结果类型,可供用户下载文件,有多个参数配置。
实现类:
org.apache.struts2.dispatcher.StreamResult
6.plaintext:
无格式文本,通常用于显示原文件(JSP,HTML)的内容。
7.等等
有关各种Result的配置参照:
API中com.opensymphony.xwork2.Result接口各实现类的详细说明。
结果类型
配置参数
chain
动作链
∙dashboard
∙/secure
∙list-usedtospecifyanothermethodontargetactiontobeinvoked.Ifnull,thisdefaultstoexecutemethod
dispatcher
转发(默认)
∙location(default)-thelocationtogotoafterexecution(ex.jsp).
∙parse-truebydefault.Ifsettofalse,thelocationparamwillnotbeparsedforOgnlexpressions.
redirect
重定向
∙location(default)-thelocationtogotoafterexecution.
∙parse-truebydefault.Ifsettofalse,thelocationparamwillnotbeparsedforOgnlexpressions.
redirectAction
重定向到动作
∙actionName(default)-thenameoftheactionthatwillberedirectto
∙namespace-usedtodeterminewhichnamespacetheactionisinthatwe'reredirectingto.Ifnamespaceisnull,thisdefaultstothecurrentnamespace
∙method-usedtospecifyanothermethodontargetactiontobeinvoked.Ifnull,thisdefaultstoexecutemethod
stream
流结果类型,文件下载
∙contentType-thestreammime-typeassenttothewebbrowser(default=text/plain).
∙contentLength-thestreamlengthinbytes(thebrowserdisplaysaprogressbar).
∙contentDispostion-thecontentdispositionheadervalueforspecifingthefilename(default=inline,valuesaretypicallyfilename="document.pdf".
∙inputName-thenameoftheInputStreampropertyfromthechainedaction(default=inputStream).
∙bufferSize-thesizeofthebuffertocopyfrominputtooutput(default=1024).
参照如下配置:
plaintext
显示原文件内容
∙location(default)=locationofthefile(jsp/html)tobedisplayedasplaintext.
∙charSet(optional)=charactersettobeused.Thischaractersetwillbeusedtosettheresponsetype(eg.Content-Type=text/plain;charset=UTF-8)andwhenreadingusingaReader.SomeexampleofcharSetwouldbeUTF-8,ISO-8859-1etc.
四、拦截器
1.工具拦截器:
h)timer拦截器:
记录执行所花的时间。
在拦截器栈中的位置决定了它实际测量什么时间,可用于性能测试。
i)logger拦截器:
提供简单的日志记录机制
2.数据转移拦截器:
j)params拦截器:
将请求参数转移到通过ValueStack公开的属性上,再将ValueStack中的数据转移到Action属性上。
k)staticParams拦截器:
将参数转移到ValueStack公开的属性上,不同的是参数的来源定义在声明性桇构的动作元素中。
l)autowiring拦截器:
为使用Spring管理应用程序资源提供了一个集成点。
m)servletConfig拦截器:
提供了一种将来源于ServletAPI的各种对象注入到动作的简洁方法(如将请求,会话注入到动作中),要求动作必须实现相应的接口(ServletContextAware、ServletRequestAware、ServletResponseAware、SeesionaAware等)。
n)fileUpload拦截器:
将文件和元数据从多重请求转换为常规的请求参数,以便能够将它们像普通参数一样设置到动作上。
3.工作流程拦截器:
o)workflow拦截器:
它与动作协作,提供数据验证以及验证错误发生时改变后续工作流程的功能。
p)validation拦截器:
是Struts2验证框架的一部分,提供了声明性的方式(XML或注解)验证你的数据。
q)prepare拦截器:
该拦截器执行时,它在动作上查找prepare()方法。
实际上是检查动作是否实现了Prepareable接口。
r)modelDriven拦截器:
通过将模型(而不是Action)放在ValueStack上从而改变工作流。
在不使用该拦截器时,参数会被params拦截器直接转移到动作上。
4.其它拦截器:
s)exception拦截器:
defaultStack栈中的第一个拦截器,exception拦截器捕获异常,并且根据类型将它们映射到用户自定义的错误里面。
t)token和tokenSession拦截器:
通过检查请求中唯一的令牌是否有效,可以避免表单重复提交。
u)scopeModelDriven拦截器:
为动作的模型对象提供跨请求的向导式的持久性。
例如允许将模型对象存储到会话作用域。
v)execAnWait拦截器:
用于处理长时间请求,并给于用户一些反馈信息。
w)i18n拦截器:
用于支持国际化应用。
x)conversionError拦截器:
在请求数据转移到动作属性上时,数据类型转换错误被存储到ActionContext中。
5.可以将多个拦截器组合在一起从而形成拦截器栈,拦截器栈又可以组合成一个更大的拦截器栈,可将拦截器栈看成一个大的拦截器,通过这样的组合出来的拦截器栈能更加灵活同时可以满足不同的功能需求。
如框架中的struts-default.xml文件中的默认拦截器栈。
6.自定义拦截器的两种实现方式:
y)实现接口:
com.opensymphony.xwork2.interceptor.Interceptor接口。
zz)(推荐使用方式)继承:
com.opensymphony.xwork2.interceptor.AbstractInterceptor类。
五、ActionInvocation:
总指挥
a)框架不直接调用动作的execute()或其它动作方法,而是创建一个ActionInvocation对象,通过ActionInvocation对象调用Action的动作方法。
ActionInvocation封装了动作和一系列被配置在Action之前或之后触发的拦截器。
这些拦截器会按照递归的方式进行调用。
b)ActionInvocation封装了与特定动作执行相关的所有处理细节(如拦截器、result等)。
当框架收到一请求时,它首先必须决定这个URL映射到哪个动作。
这个动作的一个实例被加入到一个新创建的ActionInvocation实例中。
接着,框架咨询XML配置文件,以发现哪些拦截器应该触发,及按照什么样的顺序触发。
指向这些拦截器的引用被加入到ActionInvocation中。
除了这些核心元素,ActionInvocation也拥有对其它重要信息(如:
Servlet请求、Result结果映射)的引用。
六、ActionContext和OGNL:
2)ActionContext(Action上下文):
a)ActionContext包含了框架的请求处理过程可以访问的所有数据,包含内容从应用程序数据到会话作用域或者应用程序作用域的映射。
所有特定应用程序的数据(例如Action公开的属性),都存储在ValueStack上,ValueStack是ActionContext中的一个对象。
b)ActionContext是OGNL在其上求值的更广泛的一系列对象(ValueStack,parameters,attr,request,session,application)的容器。
在Struts2中,每一个OGNL表达式必须从ActionContext包含的对象中选择初始对象(默认是ValueStack)进行求值,即一个OGNL表达式必须选择ActionContext中的一个对象作为它的根对象(默认是ValueStack)来求值。
c)黙认情况下,没有明确指定根对象名字的所有OGNL表达式都使用ValueStack作为根对象。
3)ActionContext(Action上下文)结构:
取HttpServletRequest、HttpSession、ServletContext(application)中的数据时Ognl表达式前都需要加一个#号。
propertyvalue=”#request.key”/>
propertyvalue=”#session.key”/>
c)ValueStack值栈:
当Struts2接收到一个请求时,它立即创建一个ActionContext、一个ValueStack、和一个动作对象。
作为应用程序数据的承载者,动作被马上放到ValueStack中,以便框桇可以通过OGNL访问它的属性。
d)Ognl表达式语言特点:
1)引用JavaBean属性:
user.order.orderName。
2)设置和取得数据(类型转换):
textfieldname=”username”label=“用户名”/>。
3)使用List和数组:
定义列表:
{1,3,5};
访问:
list[0],array[0];
调用方法:
list.size(),list.isEmpty()。
4)使用Map:
定义:
#{“foo”:
”bar”,”baz”:
“whazzit”};#{1:
”one”,2:
”two”},访问关键字key访问Map的KEY,value访问Map的VALUE。
--listKey:
生成option的value;listValue:
生成option的text。
-->
selectlabel=”最高学历”name="education"listKey="key"listValue="value"
list=”#{1:
'高中',2:
'大学',3:
'硕士',4:
'博士'}”/>
listKey:
产生的value。
listValue:
产生的text。
5)过滤与投影(?
:
所有匹配的元素;^:
选取第一个匹配的元素;$:
选取最后一个匹配的元素):
1.过滤:
就是选取集合中元素的部分属性;投影的结果为选取属性的集合。
语法:
collectionName.{?
表达式}。
示例:
users.{?
#this.age>30}this表示当前元素,结果为年龄大于30的用户列表。
2.投影:
指获取满足某个条件的结果,通常用来对集合进行过滤。
语法:
collectionName.{表达式}。
示例:
users.{#this.username}选取用户列表中所有用户的用户名,结果为一个用户名的列表。
6)算术运算:
+,-,*,/,%,<,>,==,++,--
7)逻辑运算符:
true,false,and,or,not,!
&&,||
8)静态方法调用:
Struts2.3.X版本后出于安全性的考虑已不支持静态方法调用了,框架默认配置不允许调用静态方法:
1.如要用静态方法调用需将加入到struts.xml配置文件中(struts2.1.x及以下版本可用)。
2.访问java.lang.Math类:
propertyvalue=”@@random()”/>。
3.静态方法:
@包名.类名@静态方法名。
如:
@com.lanqiao.vo.User@test()
4.常量:
@包名.类名@常量。
如:
@com.lanqiao.vo.User@XXX
5.实例方法:
对象.方法(参数……)。
6.如果一个请求请发经过多个Action处理时,而这两个Action如果具相同名称的属性时:
1)基本类型属性同名(包括String):
ognl会视为两个Action中的不同属性。
2)对象(JavaBean)类型属性同名:
ognl会视这两个Action中的Bean属性为同一个Bean对象。
七、类型转换和消息处理
1)内置转换器:
框架默认情况下支持的类型转换。
a)String
b)boolean/Boolean
c)char/Character
d)int/Integer
e)float/Float
f)long/Long
g)double/Double
h)date:
yyyy-MM-dd,MM/dd/yyyy(2.3.20不支持些格式),是两个默认可自动转换的格式
i)数组和集合(List,Map,Set)
2)集合类型属性的的转换:
如果项目使用的是JDK5.0以上版本包括JDK5.0版本,那么可以使用泛型。
若使用的是JDK5.0以下版本,则需要作类型转换配置:
ActionClass-conversion.properties。
a)泛型集合类型的转换:
Struts2框架可根据泛型的类型自动的推断出集合元素的类型并进行相应的类型转换。
1.List,Map集合类型不需要:
YourActionClass-conversion.properties这样的类型转换配置文件。
2.数组属性的话要先初始化;privateString[]skills=newString[10];。
3.Action中Set类型集合属性特殊需要创建一个属性文件(ActionClass-conversion.properties)。
并有这个属性文件中进行如下配置:
a)Set类型属性:
#指定Set集合元素类型
Element_skillSet=com