[转载] 第三章 struts2校验

来源:互联网 发布:linux more命令 编辑:程序博客网 时间:2024/04/29 22:57

 

1、类型转换就是客户端用户输入的参数转化为服务器端java的对象,不管用户输入什么样的内容,到客户端都是以字符串的形式存在。
2
intDate的转换是struts2内置拦截器自动转换的。
3
、输入校验是验证用户输入的信息是否合法是否有效。
4
、输入校验是建立在类型转换的基础之上的误显示的功能,。
5
struts2的标签库已经内置了错但是必须使用struts2的标签
<s:fielderror></s:fielderror>才能显示错误信息
6
ActionSupportcom.opensymphony.work2下。ActionSupport实现的Action,而Action里面的常量代表的是与它相对应的小写字符串。
7
、如果返回页面没有input页面的话当类型转换或校验出错的时候会出现404No result defined for action action and result input错误。
8
struts2一但发现类型转换或输入校验失败它会去寻找一个名字叫做input的页面,然后转到这个页面。
9
、验证方法validateActionSupport实现接口Validateable里的方法。在ActionSupport里这个方法没有实现任何东西,是让子类重写此方法来实现自己想要的验证。
10
、为了防止用户直接从浏览器的地址栏里输入action地址,action里的属性就为null,所以要进行非空验证。
11
Calendar c1=Calendar.getInstance();
      c1.setTime(birthday);
      Calendar c2=Calendar.getInstance();
      c2.setTime(graduation);
     
让时间与Calendar关联起来。c1.before(c2)时间c1是否在c2之间。
12
、在HTML表单里可以用EL方式得到错误信息时返回用户原来的信息。
13
、在struts.xml<result>有一个转发的方式一般情况下是dispatcher,也是默认方式,它有很多种。
14
、如果用<s:fielderror>来显示错误信息,它会以<ul><li>的方式来显示错误的信息。
15
、遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面。
16
当年龄不可以转换的时候,struts2有内置的错误显示"Invalid field value for field 'age'"age对应表单里的数据,这种错误信息一定要被替换掉。
17
struts2提供一个资源文件来解决这个问题,用于类型转换的错误信息,这个文件是用于类型转换的。
18
全局:struts.xml里加上一个constant标签,它不在package里。它表示在struts整个框架里要使用那些常量就把它写进去。要替换struts2自带的错误信息应加上<constant name="struts.custom.i18n.resources" value="message"></constant>它就把struts里源有的资源文件替换成为message的资源文件,不需要加propertiesmessage.properties文件放在src目录下,即放在classes目录下。
19
、在建立的属性文件里定下xwork.default.invalid.fieldvalue={0} error它前面不变的,xwork.default.invalid.fieldvalue当任何的一个属性转换出问题的时候就会显示后面的信息,后面表示的是属性名 error显示在页面上。
20
、类型转换也有全局和局部的,上面的是全局的。局部的是验证某一个action里的局性。如果要验证某一个action里的属性,在action的包下建一个 “Action类名.properties”属性文件,内容格式:invalid.fieldvalue.属性名=要现实的信息  。显示信息若是中文时不能直接在文件中写中文,否则会出错,应该将中文转换为encoder的编码方式,可以用jdkbin目录下的native2ascii.exe工具进行转换。

21、当局部与全局转换同在的时候局部会替换掉全局的错误信息。
22
struts2里的表单默认提交方式为post,它默认的有自动显示错误信息功能,也可以保存用户原来输入的数据。
23
、当时间转换失败时给时间属性添加一个null值,所以就不需要添加null值判断。int类型的属性如果转换不成功将默认是0
24
类型转换与输入校验的流程
    1.
首先Struts2对客户端传来的数据进行类型转换
    2.
类型转换完毕后再进行输入校验
    3.
如果类型转换和输入校验都没有错误发生,那么进入execute方法(调用商业逻辑)
    
注意:如果类型转换不成功,也同样要进行输入校验
25、实际应用中从不用struts内置的错误信息。
26
addFieldError用于存放类型转换的错误信息或验证的错误信息。addFieldErrorActionSupport实现ValidationAware里的方法,还有一种addActionError方法,实现上action有两种错误级别一种是field级别的错误信息显示的时候用strutsform表单或<s:fielderror>标签,别一种是action级别的错误信息显示的时候只可以用<s:actionerror/>标签显示。
27
addFieldError是把错误信息存放在Map里面,addActionError是把信息存放到Collection里面去。
28
strutsform标签只可以显示field级别的信息,它不可以显示action级别的信息。
29
、有时会同时出现fieldaction级别的错误信息,如类型转换写验证同时出问题,解决这一个问题把每一个struts标签里加上一个theme="simple"表示不让struts对标签进行封装,它也不生成多于的代码,也就没有struts给的错误提示。theme=”simple”如果在<s:form>标签中,则会使struts的标签格式取出,自己生成的表格页消除,便于自定义格式。

30struts生成的控件id是:formaction_控件名。
31
struts2里没有像struts1里的dispatchaction类,它是在struts.xml里的action里加一个method属性,它的值就是对应的逻辑方法名,如果有多个业务逻辑方法,就把这个类写成多个<action>标签。当method出现时就不走execute方法。如:
<action name="register"

           class="com.test.action.RegisterAction" method="abc">

32、应该是一个业务逻辑方法对应一个验证方法,它是用validate+业务逻辑方法,方法名的第一个字母大写。其中在action类中不管有多少个验证方法都会执行validate方法。如:public void validateAbc()
33
、当多个验证方法时validate是验证所有。而validateExecute方法是专用于来验证execute方法的。
34
、校验也可以用xml来校验,xml是通用的,建议在一般情况下用xml验证,只有当业务校验非常非常复杂时才用validate来校验。

35xml校验方法:

    action包下建xml文件,程序运行时会自动寻找此xml校验文件,命名规则为“Action类名-validation.xml,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>

 

    <field name="username">

       <field-validator type="requiredstring">

           <param name="trim">true</param>

           <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>

       </field-validator>

    </field>

 

    <field name="password">

       <field-validator type="requiredstring">

           <message>password should not be blank!</message>

       </field-validator>

      

       <field-validator type="stringlength">

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

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

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

       </field-validator>

    </field>

   

    <field name="repassword">

       <field-validator type="requiredstring">

           <message>repassword should not be blank!</message>

       </field-validator>

      

       <field-validator type="stringlength">

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

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

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

       </field-validator>

    </field>

   

    <field name="age">

       <field-validator type="required">

           <message>age should not be blank!</message>

       </field-validator>

   

       <field-validator type="int">

           <param name="min">1</param>

           <param name="max">150</param>

           <message>age should be between ${min} and ${max}</message>

       </field-validator>

    </field>

   

    <field name="birthday">

       <field-validator type="required">

           <message>birthday should not be blank!</message>

       </field-validator>

      

       <field-validator type="date">

           <param name="min">2001-01-01</param>

           <param name="max">2003-12-31</param>

           <message>birthday should be between ${min} and ${max}</message>

       </field-validator>

    </field>

   

    <field name="graduation">

       <field-validator type="required">

           <message>graduation should not be blank!</message>

       </field-validator>

      

       <field-validator type="date">

           <param name="min">2005-01-01</param>

           <param name="max">2007-12-31</param>

           <message>graduation should be between ${min} and ${max}</message>

       </field-validator>

    </field>

   

</validators>

36struts2也支持客户端的js验证,但比较弱,进行客户端验证的同时也必须进行服务器端验证,因为如果用户直接从地址栏中输入action请求,则客户端失效!

37、客户端js验证的方法:

    1form(一下都是说的struts的标签form)的主题(theme)不能为simple

    2)将formvalidate属性设为true

    建议最好不要使用struts给定客户端校验,了解即可。我们可以自己写js进行客户端验证,方法是:

    struts2标签form中加入onsubmit=”return validate();”,待验证的每个struts标签中都加入一个唯一标志id,通过id获得提交的属性值

Javascript代码如下:

    <script type="text/javascript">

    function validate(){

       var usernameValue=document.getElementById("usernameId").value;

       var passwordValue=document.getElementById("passwordId").value;

        var repasswordValue=document.getElementById("repasswordId").value;

      

       if(usernameValue.length==0){

           alert("用户名不能为空");

           return false;

       }

       else if(usernameValue.length<6||usernameValue.length>10){

           alert("用户名必须在610位之间");

           return false;

       }

       if(passwordValue.length==0){

           alert("请输入密码");

           return false;

       }

       else if(passwordValue.length<6||passwordValue.length>10){

           alert("密码必须在610位之间");

           return false;

       }

       if(repasswordValue.length==0){

           alert("密码不能为空");

           return false;

       }

       else if(repasswordValue.length<6||repasswordValue.length>10){

           alert("密码必须在610位之间");

           return false;

       }

    }

    </script>

38xml校验也有全局校验和局部校验,上面说的就是全局校验,校验的xml文件是: Action类名-validation.xml”。也可以对一个Action类的某一个方法进行校验,如对 public String test(){ return SUCCESS;}校验,则xml文件名应写为:”Action类名-test-validation.xml”.当一个类中有多个需要校验的方法是应对每个方法写一个校验文件,而不必再去写全局校验文件,否则,程序会先执行全局校验在执行局部校验,造成混乱。局部xml校验文件与全局校验文件书写方式一样。

39xml校验器分为字段校验器(field)和非字段校验器(validator),两者的功能是一样的,所以学会一种即可,建议是用字段校验器,他更直观,就是上边说的那种。

39short-circuit=true”表实校验短路,当校验出错时不再执行下边的校验,如:

<field name="username">

       <field-validator type="requiredstring" short-circuit=”true”>

           <param name="trim">true</param>

           <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>

       </field-validator>

    </field>