zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    迭代器、生成器、装饰器(转)
    Python小数据池
    接阿里云oss有感
    VSCode快捷键
    前端跨域调请求 nginx反向代理
    Git生成密钥
    【westorm系列之二】配置格式化
    钉钉安卓端无法渲染数据
    express 写接口
    js正则匹配身份证号 有坑
  • 原文地址:https://www.cnblogs.com/huligong1234/p/2965785.html
Copyright © 2011-2022 走看看