struts2.0(20-30)

 

invalid.fieldvalue.age=age conversion error

invalid.fieldvalue.birthday=/u751f/u65e5/u65e5/u671f/u8f93/u5165/u9519/u8bef

invalid.fieldvalue.graduation=/u6bd5/u4e1a/u65f6/u95f4/u65e5/u671f/u8f93/u5165/u9519/u8bef

 

填写信息自动保存:第一

<td>

                     <input type="text" name="username"

                         value="${requestScope.username}">

                  </td>

第二使用from属性标签库

 

       <s:form action="register" theme="simple">

 

           <table align="center" width="40%" border="1">

              <tr>

                  <td>

                     username

                  </td>

                  <td>

                     <s:textfield name="username" label="username" id="usernameId"></s:textfield>

                  </td>

              </tr>

       </s:form>

 

上面是增加Flelt级别的错误信息,下面是增加Action级别的错误信息

修改的如下:

 

 

校验的实现:public class RegisterAction extends ActionSupport复写验证方法

 

 

 

@Override

    public void validate()

    {     

      

        //浏览器访问的方式可以有null的出现,其他情况没有Null出现

       if (null == username || username.length() < 6 || username.length() > 10)

       {

           this.addActionError("username invalid");

       }

       if (null == password || password.length() < 6 || password.length() > 10)

       {

           this.addActionError("password invalid");

       }

       else if (null == repassword || repassword.length() < 6

              || repassword.length() > 10)

       {

           this.addActionError("re-password invalid");

       }

       else if (!password.equals(repassword))

       {

           this.addActionError("two passwords not the same");

       }

//注意Age的改变用小于默认的小于0

       if (age <= 0 || age > 150)

       {

           this.addActionError("age should be between 1 and 150");

       }

//日期谁在前谁在后,可以通过DATEGETtIME方法的毫秒数,比较前后第二种方法如下

      

       if (null != birthday && null != graduation)

       {

           Calendar c1 = Calendar.getInstance();

           c1.setTime(birthday);

 

           Calendar c2 = Calendar.getInstance();

           c2.setTime(graduation);

 

           if (!c1.before(c2))

           {

              this.addActionError("birthday should be before graduation");

           }

       }

 

    }

 

页面调用:addFieldError 是放在map里边的,而addActionError放在list里边

cssStyle:定义样式,而cssClass引入CSS文件

 

<s:actionerror cssStyle="color:red" />

 

 解决两种情况addFieldError addActionError都出现的方案:

 

增加Theme 选择简单方式:将不用XHTML格式显示而用一般格式

 

<s:textfield name="age" label="age" theme = "simple"></s:textfield>

 

如果表单改为simple,则表单里边的所有内容都变成一般格式出现

 

<s:form action="register" theme="simple">

 

一般采用以上两种方式来处理页面错误信息

 

1配置dispatchAction 配置method 指定实例执行方法

 

Struts.xml配置

 

 

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

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

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

       </action>

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

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

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

       </action>

 

 

Action

public class RegisterAction extends ActionSupport

 

public String test() throws Exception

    {

       return SUCCESS;

    }

 

指定验证的做法在以上方法里面:validate+Abc(执行方法名第一个字母大写)

    public void validateAbc()

    {

       System.out.println("validateAbc() invoked");

    }

 

但还是在调用执行方法时先执行:validate方法,才执行test()方法。validate方法总是要执行的

 

解决办法一,去掉validate方法

方法二、:增加一个validateExcute方法去执行execute方法(如果有Excute方法时使用)

 

校验框架-字段校验

 

用于校验不复杂情况,如果校验复杂就用velidate方法校验

 

要验证RegisterAction

 

要在其同一个目录下:建立文件:Action+-validation.xml,实例在下载的war文件里边

 

RegisterAction-validation.xml

 

注意,dtd不是XML文档,shame才是xml文档所以它不能被IE浏览器打开。用Firefox打开

<?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 should not be blank!</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>

 -->  

// short-circuit是短路,只要前面验证不通过,后面就不进行验证了

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

 

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

    //下面用requiredstring,表示字符串必须要出现,而required表示不是字符串出现

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

 

验证的依据是,在源文件的xwork下的default.xml的要求

 

页面调用:

<s:fielderror cssStyle="color:red" />

 

注意避免校验混交,要么就在配置文件里面校验,要么就在代码里面(validator方法)校验

 

 

 

校验框架-非字段校验

注意可以通过HTTP底层协议来跳过校验

 

客户端验证

1、去掉

theme="simple"

2validate = "true" //它自己会去调用相应的RegisterAction-validation.xml

进行校验

 

如:<s:form action="register" validate = "true">

 

调用就是:标签的调用。最好不要使用:由于只要验证失败,再次验证通过,验证信息依然保留在页面上。使用一下验证:

 

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>

<%@ taglib prefix="s" uri="/struts-tags"%>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

    <head>

       <title>My JSP 'register2.jsp' starting page</title> 

    <script type="text/javascript">

    function validate()

    {

       var usernameValue = document.getElementById("usernameId").value;//通过加ID获取不然通过name获取到得是一个数组

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

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

      

       if(usernameValue.length == 0)

       {

           alert("username should not be blank!");

           return false;

       }

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

       {

           alert("length of username should be between 6 and 10!");

           return false;

       }

      

       if(passwordValue.length == 0)

       {

           alert("password should not be blank!");

           return false;

       }

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

       {

           alert("length of password should be between 6 and 10!");

           return false;

       }

      

       if(repasswordValue.length == 0)

       {

           alert("repassword should not be blank!");

           return false;

       }

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

       {

           alert("length of repassword should be between 6 and 10!");

           return false;

       }

      

       if(passwordValue != repasswordValue)

       {

           alert("password and repassword should be same!");

           return false;

       }

       return true;

    }

    </script>

    </head>

    <body>

       <table align="center" width="40%">

           <tr>

              <td>

 

                  <s:fielderror cssStyle="color:red" />

 

              </td>

           </tr>

       </table>

       <s:form action="register" theme="simple" onsubmit = "return validate();">

           <table align="center" width="40%" border="1">

              <tr>

                  <td>

                     username

                  </td>

                  <td>

                     <s:textfield name="username" label="username" id="usernameId"></s:textfield>

                  </td>

              </tr>

              <tr>

                  <td>

                     password

                  </td>

                  <td>

                     <s:password name="password" label="password" id="passwordId"></s:password>

                  </td>

              </tr>

              <tr>

                  <td>

                     re-password

                  </td>

                  <td>

                     <s:password name="repassword" label="repassword" id="repasswordId"></s:password>

                  </td>

              </tr>

           </table>

       </s:form>

    </body>

</html>

 

 

根据方法提供校验方式的解决:

配置文件就要写成,action-方法名-validation.xml

如:registerAction-test-validation.xml

但如果也提供了registerAction-validation.xml的话,它会先调用:registerAction-validation.xml才调用:registerAction-test-validation.xml

 

最好的办法就是提供局部的校验就行

 

注意父类和子类的校验,方法名相同,就会先校验父类,在校验子类就不方便了

 

非字段校验:我用谁去校验,我去校验谁而字段校验呢是:我校验谁,我用谁来校验

<validator type="requiredstring">

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

       <message>username should not be blank!</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>

 

校验的顺序,先执行校验文件xml的,才去校验validate方法:

 

真正存放field级别错误信息的对象是LinkedHashMap

 

2. LinkedHashMapkeyString类型的,valueArrayList类型的

 

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

 

//只增加到它的一个副本,只能读,不用写也不能修改进去了。下面的操作在读取的时候是取不到的

       this.getFieldErrors().put("username","bbbbbbbbbbbbb");

 

拦截器:Interceptor

 

对象接口

package com.interceptor;

 

public interface TargetInterface

{

    public void doSomething();

}

 

目标对象:

package com.interceptor;

 

public class Target implements TargetInterface

{

    public void doSomething()

    {

       System.out.println("do something");

    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章