Struts2 学习(1到11讲)

来源:互联网 发布:js 设置cookie 编辑:程序博客网 时间:2024/05/16 12:35

第一讲:
在 server.xml 中配置context 标签,来配置Tomcat。让它知道目录。
配置org.apache.struts2.dispatcher.FilterDispather类,来启动Struts2。

JSP EL表达式 ${requestScope.属性}

Struts.xml 配置文件
<struts>
    <package name = "struts2"  extends= "struts-default">
    <action name = "login" class = "com.test.action.LoginAction">
        <result name = "success">/result.jsp</result>
    </action>
    </package>
</struts>

第二讲 类型转换
Struts2 的标签
导入标签:<@ taglib prefix= "s" uri="/struts-tags">
<s:form action= "login">
<s:textfield name="username" label="username"></s:textfield>
</s:form>

Action类中要继承ActionSuppport类。它提供了一些便利方法。com.opensymphony.xwork2.ActionSupport
执行execute() throws Exception方法。
验证在类中的validate()方法完成。添加错误:addFieldError("username","username required");
注意:应该配置struts.xml文件,<result name ="input">/login2.jsp</result>。在Struts2中当FieldError中有错误信息时候,将请求转发到input指定的页面中。

struts2自定义了一些类型转换器 如 int 转化。一般的逻辑是对用户的输入我们先转化,在验证,如果转化不成功,则不需要验证。

第三讲 类型转化续
ognl.jar表达式语言 转换得用到这个jar 包
WebWork 网站:www.opensymphony.com
1 自定义转换类
我们的转化类可以实现 TypeConverter接口 来实现转换的功能;或者继承DefaultTypeConverter类
例子:继承DefaultTypeConverter重写convertValue(Map context, Object value, Class toType)。当从页面到服务器时,toType表示转换到什么。value是字符串的数组。
value是字符串的数组:因为jsp页面中的标签可以同名。
注:把字符串转化成整数:Interger.parseInt(string);
代码:
converterValue(Map context, Object value, Class toType){
    if(Point.class == toType){  //要从页面转化到服务器中的类
        Point point = new Point();
        String[] str = (String[])value;
        String[] paramValues = str[0].split(",");
        return point;
       
    }
}

2 配置,让Struts知道存在这个转换
A 当然要定义一个Action了。
B 配置struts.xml,定义返回页面,<s:property value="point"> Action 中的属性值。
C 定义一个属性文件,该属性文件和目标xxAction在同一包下,文件名为xxAction-conversion.properties  (这是局部转换)
文件格式:  point=com.test.converter.PointConverter  //表示对Action中的那个属性进行转换  point对应Action类中的属性


第四讲 类型转换
全局类型转换:
建立一个配置文件,在class目录下。名字固定。xwork-conversion.properties
com.test.bean.Point = com.test.converter.PointConverter        要转换的类 = 用这个类转换

转换者可以继承StrutsTypeConverter 类。

还有一种方法是对象的方式: <s:textfield name="point.x" label = "x">

 

第五讲  输入校验
当转换不成功,改变struts2页面标签的提示。
在Action中的validate()方法中进行验证。
可以调用addFieldError()方法来添加错误。可以在相应的Jsp中调用<s:fielderror></s:fielderror>来显示错误信息。也可以在<s:fielderror> 中定义子元素,来指定显示那个错误。

注:日期的用法: Calendar c1 = Calendar.getInstance();   c1.setTime(birthday); //birthday 是一个Date 类型的实例。c1.before(c2),//表示c1在c2前面返回true。


第六讲  输入校验续
遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面。
1 全局的错误信息提示
在struts2文件中 <constant name = "struts.custom.i18n.resources" value="message">  替换struts2的默认转换错误的提示信息。
文件为message.propertise。放在classpath目录下。
2 局部的错误信息提示
文件与要验证的Action类在同一目录下。
文件名为Action.properties 

资源文件的国际化:你可以用jdk 自带的 native2asvii 工具来转化
在struts2的核心包中有个default.properties 文件,里面定义了一些struts2的默认属性。
样式为:invalid.fieldvalue.age = age conversion error       //age 为Action 中的字段

类型转换与输入校验的流程
1 首先Struts2对客户端传来的数据进行类型转换
2 类型转换完成后在进行输入验证
3 如果类型转换和输入验证都没有错误发生,那么进入execute方法(调用业务逻辑)

 

第七讲  输入校验续
ActionSurport 实现了ValidationAware接口(验证知晓),里面有addFieldError();addActionError(String anErrorMessage)等方法。看来有两个级别的错误消息提示。
ActionError 是用一个Collection来维护的,添加信息一个一个的添加。
FieldError 是用Map来维护的,添加信息需要key和value。
页面上我们用的是Struts的标签库。别的不需要配置。但是标签库只能显示FieldError里面的错误信息。页面却一定返回到错误的页面。
当处理Action级别的错误时,要在页面中添加<s:actionerror/>。
Struts2中的每一个标签都有一个theme属性。当我们不需要时可以theme="simple"。这是Struts2 的验证的提示信息都不会自动显示了。

扩展execute()方法,在struts.xml中指定Action类的方法来完成execute()的功能。这样一个Action可以处理不同的业务逻辑。
方法:在struts2中的struts.xml中,<action name="xxname" class="yyclass" method="zzmethod">则指定了yyclass中的zzmethod来处理。validateZzmethod来验证。
zzmethod和validateZzmethod方法都在yyclass类中我们自己编写,就是方法名字不一样,其他都要和execute和validate方法一样。

还可以通过XML格式的验证。下节课讲解。


第八讲  校验框架(用XML来完成输入校验)

Struts2的校验框架,该框架是基于XML的。针对每个Action提供一个相应的校验配置文件。
对校验配置文件的名字有要求,xxAction-validation.xml(可以参照Struts2下载包中提供的例子来写该文件)
还可以写成xxAction-test-validation.xml,其中test为xxAction类中的一个方法,这表明xxAction-test-validation.xml校验只对test方法生效,即只有执行了test方法,才校验。当两个文件都提供时,struts2先执行xxAction-validation.xml,在执行xxAction-test-validation.xml,两个都要执行。错误信息添加到fielderror里。所以页面要调用fielderror级别的现实
该校验文件支持两种校验格式:
1 field 校验  可以简述为:先定义我要校验谁,在定义怎么校验。
<validators>
    <field name="username">    //表示对相应类的对应字段进行验证,本例中对username字段检验。
          <field-validator type="requiredstring">    //对该字段的校验方式(可以有多种),本例中表示“必须有”。requiredstring对应了一个类的名字。
                 <param name="trim">true</param>     //对应string的trim()方法,trim对应类中的set方法(set注入)。
                 <message>username should not be blank!</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>  //在运行时,会用6、10替换${minLength}和${maxLength}。
          </field-validator> 
    </field>
</validators>

xwork.jar中的com.opensymphony.xwork2.validator.validators包中的每个类。其中有个default.xml文件,配置了校验器对应的名字和相应的java类。
注意:requiredstring 是要求字符串必须有,required 是要求其他类型必须有。expression和fieldexpression是表达式验证。regex是正则表达式验证。

2 validation 校验

第九讲  validation 校验
strust2 支持javascript 客户端验证(这里的form当然只的是Struts2的form)
1 form的主题(theme)一定不能设定为simple。
2 将form的validate属性设置为true
struts2 自动的根据xxAction-validation.xml文件来产生javascript代码,在客户端验证。真正工程中,很少用。

validation 校验  简述为:先定义我用那个校验器来校验,再定义校验那个字段。
    <validator type = "requiredstring">    //指定校验器
         <param name="fieldName">username</param>    //指定校验的字段为username,fieldName不变。
         <message>username should not be blank!</message>
    </validator>
    <validator type = "stringlength">    //指定校验器
         <param name="fieldName">username</param>    //指定校验的字段为username,fieldName不变。
         <param name="minLength">6</param>
         <param name="maxLength">10</param>
         <message>username should not be blank!</message>
    </validator>
   
第十讲  拦截器
1. 真正存放field级别错误信息的对象是LinkedHashMap

2. 该LinkedHashMap的key是String类型的,value是ArrayList类型的

3. 对于Action级别的错误信息,实际上是放置在ArrayList中的

4 拦截器:Interceptor:在Action之前,之后做些事情,当然可以阻止Action运行。主要是应用Java的动态代理来实现的。
    1  拦截谁
    2  拦截器  : 就是一个Java类。
    3  代理对象

第十一讲  拦截器
1 定义拦截器
在xwork.jar中的com.opensymphony.xwork2.interceptor包中的Interceptor类。
该Interceptor接口中有三个方法:
    1  init()  只在服务器初始化时候执行一次,且只执行一次
    2  destroy()
    3  intercept(ActionInvocation invocation) throws Exception
拦截器可以组成拦截器栈

2 配置拦截器
    1 在struts.xml中定义拦截器
    <interceptors>
         <interceptor name="myInterceptor" class="com.test.intercepor.MyInterceptor">
               <para name="">value</para>    //为拦截器的相应参数赋值
         </interceptor>
    </interceptors>
    2 在Action中配置拦截器
    <action name="">
         <result name=""></result>
         <interceptor-ref name="myInterceptor">
              <para name="">value</para>
         </interceptor-ref>
    </action>
struts2.core.jar中的struts2-default.xml中定义了struts2的默认拦截器栈。
注意:
1 可以为struts.xml的每个包定义一个默认拦截器栈。
2 当你为某个Action定义了拦截器后,默认拦截器将失效,必须手工添加。
3 可以在定义拦截器时设置参数,也可以在配置拦截器时设置参数
4 一般我们开发中拦截器继承AbstractInterceptor类
5 struts2提供一个方法拦截器,可以指定拦截器将拦截的方法,可以参见MethodFilterInterceptor。
  例子如下: 1) class MyInterceptor3 extends MethodFilterInterceptor{
                    protected String doIntercept(ActionInvocation invocation) throws Exception{}
                   }
             2) 定义MyInterceptor3 拦截器 <interceptor name="" class=""></interceptor>
             3)添加拦截器  <interceptor-ref name = "">
                                 <param name="includeMethods">test,execute</param>   //拦截器将拦截test,execute方法
                            </interceptor-ref>
Struts2 框架还提供了监听器。如PreResultListener接口,它提供了Action执行完,返回结果前的那一时刻的监听。