Struts2 学习笔记
*FilterDispatcher是整个Struts2的调度中心,根据ActionMapper的结果来决定是否处理请求,如果ActionMapper指出该URL应该被Struts2处理,那么它将会执行Action处理,并停止过滤器链上还没有执行的过滤器。
注意:在新的版本中(>2.1.3)使用StrutsPrepareAndExecuteFilter代替了FilterDispather充当核心处理器。
org.apache.struts2.dispatcher.FilterDispatcher
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
*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.action可以是一个普通的pojo,包含execute方法,实现Action接口或继承ActionSupport(也实现Action接口)类皆是为了拥有更多的功能。
例如ActionSupport除了继承Action接口外还实现了Validateable,Validateaware等接口提供如验证功能等。
2.数据绑定: 属性驱动,直接域对象(页面需要加前缀,如user.age),模型驱动(实现ModelDriven接口,省写setter/gettter,且页面不需要加前缀)
3.Action的配置(struts.xml)
<struts>
<package name="base" namespace="/base" extends="struts-default">
<action name="userAction" class="com.company.demo.UserAction">
<result name="success">/main.jsp</result>
<result name="input">/main.jsp</result>
</action>
</package>
</struts>
<package>元素还有abstract属性,定义包为抽象,即不能包含Action元素,可选项,struts-default就是一个抽象包。
action中有method属性,指定具体Action中的哪个方法,不指定就默认是execute方法,另外也可以通过在请求的URL中直接指定,这样就不需要在struts.xml中配置,方式是,在URL后加感叹号和方法名。例如:/base/userAction!add.action
某些情况下class属性可以不写(默认是ActionSupport)
4.result
预定义的result常量:
SUCCESS:表示Action执行成功,显示结果视图给用户,值为字符串"success"
NONE:表示Action执行成功,不需要显示视图给用户,值为字符串"none"
ERROR:表示Action执行失败,显示错误页面给用户,值为字符串"error"
INPUT:表示执行Action需要更多的输入信息,回到input对应的页面,值为字符串"input"
LOGIN:表示因用户没有登录而没有正确执行,将返回登录视图,值为字符串"login"
result还有type属性,即ResultType,表示使用何种视图技术。不配置时,默认值为"dispatcher",表示页面跳转,相当于Servlet中的RequestDispather,此外还有chain,freemarker,redirect,redirectAction,stream,velocity,xslt,plainText
可以配置全局的result,例如异常页面,登录页面等。通过<global-result>来配置:
<global-result>
<result name="login">/login.jsp</result>
<result name="500">/error/500.jsp</result>
</global-result>
5.struts2异常映射
在<action>元素中配置<exception-mapping>元素
<action name="" class="">
<exception-mapping name="math-exception">java.lang.ArithmeticException</exception-mapping>
<exception-mapping name="math-exception">java.lang.Exception</exception-mapping>
<result name="math-exception">/error/error.jsp</result>
</action>
在execute()方法的异常捕获中只需要返回 "math-exception"即可。
此外还可以配置全局异常映射。
<global-exception-mappings>
<exception-mapping ....>...
</global-exception-mappings>
可以在页面通过<s property value="exception"/> <s: property value="exceptionStack"/>方式实现
6.拦截器
struts2通过拦截器(interceptor)实现了AOP。struts2的拦截器有点类似与Filter,但比Filter更强大,如与Servlet的API无关,可以访问到值栈等。action的数据绑定就是通过预定义拦截器实现的。
struts2有很多预定义拦截器,定义在struts-default.xml中。
7.值栈和OGNL
<s:property value="userName"/>就是通过OGNL表达式访问当前值栈中Action的userName属性值。
可以通过#方式访问除值栈之外的值。
如<s:property value="#parameters.userName"/>
#request.userName #session.userName,#application.userName和#attr.userName
还可以通过关键字@访问静态方法和静态变量,
如<s:property value="@com.company.action.UserAction@DEFAULT_NAME"/>
<s:property value="@com.company.action.UserAction@getDefaultName()"/>
强大的OGNL还可以访问list,array,map相关属性及元素。如<s:property value="userMap.size"/>
也可以构建相关list和map等。如<s:property value="{1,2,3}"/><s:property value="{1,2,3}[0]"/>
<s:property value="#{'name':'zhangsan','age':'25'}"/>
Action类可以通过实现ServletActionContext访问Servlet的API来获取相关request,response等对象
8.Struts2的标签库Taglib
<%@ taglib prefix="s" uri="/struts-tags" %>
struts2标签按功能可分为四类:数据标签,控制标签,UI标签,杂项标签
<1>数据标签
property标签 :<s:property value=""/>,其他属性有default,escape,escapeJavaScript
set标签:
<s:set var="tempUser" value="#session.user"/><s:property value="#tempUser"/>
<s:set var ="i" value="1"/><s:set var="i" value="#i+1"/>
set标签的其他属性有scope,可取值application,session,request,page,action
push标签,用来将对象的引用压入值栈中
<s:push value="#session.user"/>
<s:property value="name"/>
<s:property value="age"/>
</s:push>
其他一些常用数据标签有bean,param,date,debug,url,a,include等
<2>控制标签
if、elseif与else标签
<s:if test="#request["listSize"]>20">
</s:if>
<s:elseif test="#request["listSize"]>10">
</s:elseif>
<s:else>
</s:else>
iterator标签,用来遍历数组,Set和List等集合对象
<s:iterator var="i" begin="1" end="10" step="1">
<s:property value="#i"/>
</s:iteraror>
<s:iterator value="#request.userList" status="state">
索引=<s:property value="#status.index"/>
<s:property value="userId"/>
<s:property value="userName"/>
</s:iterator>
status用来返回循环的各种信息,可以返回的信息有:count,index,even,odd,first,last
append标签,用来将已存在的多个集合合并成一个集合
<s:set value="{1,2,3}" var="list1"/>
<s:set value="{4,5,6}" var="list2"/>
<s:append var="list3">
<s:param value="#list1"/>
<s:param value="#list2"/>
</s:append>
<s:iterator value="#list3">
<s:property/>
</s:iterator>
generator标签,用来切分字符串,并把切分的结果组成一个集合
<s:generator separator="," val="'a,b,c,d'" var="myList"/>
<s:iterator value="#myList">
<s:property/>
</s:iterator>
merge标签,和append标签相似,区别是合并后的大集合中原有集合元素顺序发生改变。
其他控制标签有sort,subset
<3>UI标签
struts2标签分为Form Tags,Non-Form UI Tags,Ajax Tags
模板和主题:struts2标签是通过模板渲染成相应的HTML代码的,模板是通过freemarker定义的。每个标签都有自己对应的模板。模板在struts2的core包中
struts2提供内建4个主题,包括simple,xhtml,css_html,ajax
struts2以xhtml为默认主题,可以通过<constant name="struts.ui.theme" value="simple"/> 改变默认主题
表单标签有很多通用属性,包括name,value,cssClass,cssStyle,cssErrorClass,cssErrorStyle,onBlur,onChange...
表单标签除了常见的textfield,textarea,hidden,submit,,password,radio,checkbox,label,select,optgroup,file等之外,
还有checkboxlist,head,combobox,updownselect,optiontransferselect,doubleselect等
9.验证框架
通过添加Action名称-validation.xml,如RegisterAction-validation.xml
内容类似如下:
<validators>
<field name="user.name">
<field-validator type="requiredstring">
<message>请填入姓名</message>
</field-validator>
</field>
<field name="user.age">
<field-validator type="int">
<param name="min">18</param>
<message>年龄必须在18岁以上</message>
</field-validator>
</field>
</validators>
struts2提供了很多内置验证器,如required,requiredstring,email,date,url,int,double,regex,expression等等
在页面显示验证错误信息方式是通过<s:actionerror/><s:fielderror/>或<s:fielderror fieldName="user.name"/>来实现。
10.注解
需要struts2-convention-plugin-*.jar包支持
public class HelloWorldAction extends ActionSupport{
@Action(value="/annoAction",
params={"str","param1","str2","param2"},
results={
@Result(name="success",location="/anno/success.jsp"),
@Result(name="another",location="/anno/another.jsp")
},
interceptorRefs={
@InterceptorRef("timer"),
@InterceptorRef("defaultStack")
},
exceptionMappings={
@ExceptionMapping(exception="java.lang.NullPointerException",result="nullError"),
@ExceptionMapping(exception="java.lang.Exception",result="error")
}
)
public String method1() throws Exception {
System.out.println("now is HelloWorld=="+str+" , str2="+str2);
return this.SUCCESS;
}
private String str,str2;
//…setter/getter
}
此外,还有一些放在类上的注解,如@Result,@Results,@Namespace,@InterceptRef,@InterceptRefs,
@ExceptionMapping,@ExceptionMappings,@ParentPackage等。
参考:http://rubbing-struts2.iteye.com/blog/1661482