Struts2 学习笔记

 

1

 

*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,可以在不同的视图技术中,几乎没有差别的使用这些标签。

Image

 

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

posted @ 2013-03-18 12:46  一片相思林  阅读(1605)  评论(0编辑  收藏  举报