zoukankan      html  css  js  c++  java
  • Struts2学习笔记

     

    一 概述 

           1  struts2是webwork和struts1的结合,其核心来自webwork。比struts1更灵活,更优雅。

           2  struts2的核心控制器是dispafliter 和action,而struts2的核心是拦截器Interceptor。

           3  <constant name="struts.action.extension" value="htm"/>可以完成请求后缀为htm。

    二 数据类型转换(converter)和数据校验(validate)

          1  基本数据转换是struts2自动完成的,对于对象其他复杂类型转换,可继承StrutsTypeConverter类重写convertvalue()来完成,但是还需要配置放在校验action同目录的xxxAction-conversion.properties文件,其写法如下:   

                       被校验属性=包名.校验器名

    全局的文件名称则为: xwork-converter.properties

    其实StrutsTypeConverter类是继承了ognl.dufaultTypeConverter这个类,当然我们也可以直接来实现convertvalue()来完成。

         2  数据校验 在单独的方法里可使用validate()来校验,但是往往在开发中一个action类中有很多方法,这时候validate()就成了全局的校验,导致每个方法都校验,这并不是我们想要的,Struts2有个解决的方法就是用validatexxx()来校验xxx()方法,从而使每个校验对应一个方法。

         3   用struts2的标签的时候会自动给出错误提示,但是有时候并不是我们想要的,我们可以在表单中增加 theme="simple" 让表单的当前html样式失效,从而我们自己定义样式。错误提示有两种 <s:actionerror> 和 <s:fielderror> ,在validat()的时候由我们自己选择,把错误信息放入actionerror还是:fielderror。

        4  如果我们用fielderror级别的输出,最好配置 :

                    <constant name="struts.custom.i18n.resources" value="message"></constant>

    然后再写个message.properties文件 里面写这样的xwork.default.invalid.fieldvalue={0} error,

    来说明我们那个属性输入有误,或者用局部的xxx.properties,其中xxx是action名字。里面配置如下面这样的内容

             invalid.fieldvalue.age=年龄输入不正确

             invalid.fieldvalue.birthday=生日输入有误

             invalid.fieldvalue.graduation=毕业日期输入有误

    其中前面是校验的属性,后面是中文字符的unicode编码,至于这个怎么来的,看看jdk给我们提供了native2ascii 这个工具 可以直接在自己安装的jdk bin目录下找到,运行后输入汉字,回车就可以看到unicod编码了,同时支持文件转换。

         5 除了编码方式校验外,struts2还提供了xml配置文件的校验,更得情况下我们采用配置文件的校验,配置文件的校验和编码方式的校验一样有两种方式,全局的和局部的,全局的就是对整个action校验,局部的则只对某个方法校验,写如下配置文件,都放在action相同的目录下:

               a.全局的如:RegisterAction-validation.xml

               b.局部的如:RegisterAction-test-validation.xml

    第一个事对RegisterAction中的所有方法都校验,第二个则只对RegisterAction中的test方法做校验,大多数情况下我们的一个action类中又很多业务所以一般都做局部校验。xml的校验分字段校验和非字段校验两种,其实不管哪种底层实现都是一样的。具体配置可查看dtd文档和default.xml,如下,

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

    <validators>

       

        <!-- 非字段校验 -->  

        <validator  type="requiredstring">

             <param name="fieldName">username</param>

             <message>username requred!</message>

        </validator>

       

        <validator type="stringlength">

             <param name="fieldName">username</param>

             <param name="minLength">6</param>

             <param name="maxLength">10</param>

             <message>username should be between ${minLength} and ${maxLength} !</message>

        </validator>

         <!-- 字段校验 -->

     

        <field name="username">

            <field-validator type="requiredstring">

                <message>username requred!</message>

            </field-validator>

           

            <field-validator type="stringlength">

                <param name="minLength">6</param>

                <param name="maxLength">10</param>

                <message>username should be between ${minLength} and ${maxLength} !</message>

            </field-validator>

        </field>

    <validators>

     

           6 数据校验总结,struts2的数据校验是xwork来的,我们可以通过查看源码得到,field级别的错误是封装在一个LinkedHashMap里的,而Action级别的错误是封装在一个ArrayList里的,并且LinkedHashMap得key是Stirng,value是一个ArrayList。校验顺序是先从xml配置校验开始到编码校验,从全局校验到局部校验。

     

     

     

    三 拦截器(interceptor)和监听器(listener)

         1 Struts2的拦截其是基于动态代理实现的,和spring的aop机制很像,源于xwork,所有的父接口com.opensymphony.xwork.interceptor,结构和servlet的过滤器一样,有个init(),destroy() ,主要的就是String interceptor(ActionInvocation invation)方法。ActionInvocation中有个invocke(),用于链式调用,com.opensymphony.xwork2.interceptor.AbstractInterceptor和com.opensymphony.xwork2.interceptor.MethodFilterInterceptor抽象方法部分实现了父接口。MethodFilterInterceptor方法用于在拦截的时候过滤某些方法,excludeMethods和includMethods用来设置包含和排除那些方法,包含优先于排除的设置。

         2 所有的系统默认拦截器都定义在了struts-default.xml中,我们可以重新定义缺省配置,如果我们在action中引入自己定义的拦截器,那么系统默认拦截器将不再引入,所以要手动引入,在实际开发中,更多的是把默认拦截器引入我们自己定义的拦截器中,再使用我们自定义的拦截器,从而达到目的。拦截器栈里配置引入的拦截器是有顺序的,那个在前那个先执行,在特定的情况下会影响结果。

         3 拦截器在Struts2中的配置如下:

            <interceptors>

                 <interceptor name="interceptor" class="com.shunwang.test.interceptor.Interceptor">

                 </interceptor>

                 <interceptor name="interceptor2" class="com.shunwang.test.interceptor.Interceptor2">

                </interceptor>

                 <interceptor name="interceptor3" class="com.shunwang.test.interceptor.Interceptor3">

                </interceptor>

                 <interceptor-stack name="myStack">

                     <interceptor-ref name="interceptor"></interceptor-ref>

                     <interceptor-ref name="interceptor2"></interceptor-ref>

                     <interceptor-ref name="interceptor3"></interceptor-ref>

                     <interceptor-ref name="defaultStack"></interceptor-ref>

                 </interceptor-stack>

                

           </interceptors>

           

          <action name="register" class="com.shunwang.test.action.RegisterAction" method="test">

              <result name="success">/success.jsp</result>

              <result name="input">/register2.jsp</result>

              <interceptor-ref name="myStack"></interceptor-ref>

          </action>

     

    都放在struts.xml中的<package>元素里面。和action并列。具体配置可查看Struts2.0 dtd文件,在

    <interceptor-ref name="myStack"></interceptor-ref>和    <interceptor name="interceptor3" class="com.shunwang.test.interceptor.Interceptor3"></interceptor>里还可以配置参数,在运行时送到interceptor中。

          4 监听器是通过时拦截器注册实现的,要实现接口PreResultListener,来实现接口

    void beforeResult(ActionInvation Invoation, String resultCode); 来完成某些动作的,在action方法后在试图渲染前执行。

     

     

    四 文件上传和下载

          1 Struts2的文件上传是基于Apache自己的组件common-fileupload-1.x和common-io-1.x来实现的,而Struts2封装了相关的API,使得上传更简单,更方便。

  • 相关阅读:
    Windows Form -----内容(3)
    Windows Form -----内容(2)
    Windows Form -----内容(1)
    C#与数据库链接---小练3--插入语句的验证
    C#与数据库链接---小练2--查询
    连接数据库--小练---简单增删改
    SQL简短汇总
    面向对象---4
    面向对象--3
    面向对象----类2
  • 原文地址:https://www.cnblogs.com/alaricblog/p/3278569.html
Copyright © 2011-2022 走看看