Struts验证框架

首先建立Struts工程的时候要启动验证框架。
它称为Validator验证框架

主要依赖与两个.jar文件


Jakarta-oro.jar
Commons-validator.jar 

这个是在struts-config.xml文件中如下加入配置之后即代表该工程已经使用验证框架的插件了 

Xml代码

  1. <plug-in className="org.apache.struts.validator.ValidatorPlugIn">    
  2.         <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,    
  3.                                                   /WEB-INF/validation.xml"/>    
  4. </plug-in>  

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">

        <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,

                                                  /WEB-INF/validation.xml"/>

</plug-in>


完成好了之后以注册的例子说明它的主要使用方法
1.
建立一个注册的页面;包含用户名: 密码: 年龄: 邮箱:都不能为空。密码长度必须大于或等于8位,邮箱格式验证等

显示方式一:使用错误消息显示在相应的控件后面。

2.
建立注册页相对应的表单Bean(ActionForm),重点在这里,因为要使用验证框架的话该表单类需要修改

1)
修改该类的继承 

Java代码

  1. import org.apache.struts.validator.ValidatorForm;// 导入要继承的类    
  2. public class 表单类 extends ValidatorForm //修改继承类  

  import org.apache.struts.validator.ValidatorForm;// 导入要继承的类

  public class 表单类 extends ValidatorForm //修改继承类


2) //
修改该类且不包含validate()方法.
3
、在validation.xml 中配置验证规则

 
这个验证规则依赖与validator-rules.xml此文件已经配置好的验证类

 
大概介绍几种规则吧{}中的为参数

   errors.required={0} is required.     
必须的,或者不能为空的

   errors.minlength={0} can not be less than {1} characters. {
某某}不能小于{多少}

   errors.maxlength={0} can not be greater than {1} characters.{
某某}不能大于{多少}

  errors.range={0} is not in the range {1} through {2}.{0}
是不能在{1}{2}之间

Xml代码

  1. <form-validation>   <!--以下是配置一些常用的验证规则 -->  
  2.   <formset>    
  3. <form name="regActionForm">     
  4. <!--表单名,为验证哪个表单而配置,这里的name指定strutsform-bean的别名 -->  
  5.     <field property="username" depends="required">    
  6.       <arg0 key="tip.username"/>    
  7.     </field>         arg0指要为该规则传入的第一个参数    
  8. <!--property为表单中的属性,depends为要验证的规则key为消息资料文件中的配置键 -->  
  9. <!-- 验证密码最小长度不小于8 要一个控件属性验证两个规则的话真正以逗号分开, -->    
  10.   
  11. <field property="userpass" depends="required,minlength">    
  12.       <arg0 key="tip.userpass"/>    
  13.       <arg1 key="${var:minlength}" name="minlength" resource="false"/>    
  14.       <var>    
  15.         <var-name>minlength</var-name>    
  16.         <var-value>8</var-value>    
  17.       </var>    
  18.     </field>    
  19.     
  20.     <!--绿色的为变量名,好像定义也有规则,必须是那样而resource 则是配置是否从资源文件中查找key -->  
  21.        
  22.   
  23. <field property="email" depends="required,email">    
  24.       <arg0 key="tip.email"/>    
  25.     </field>    
  26.     
  27. <!-- 验证年龄在一定范围之内 -->  
  28.     <field property="age" depends="required,intRange">    
  29.       <arg0 key="tip.age"/>    
  30.       <arg1 key="${var:min}" name="intRange" resource="false"/>    
  31.       <arg2 key="${var:max}" name="intRange" resource="false"/>    
  32.        <var>    
  33.          <var-name>min</var-name>    
  34.          <var-value>1</var-value>    
  35.        </var>    
  36.        <var>    
  37.          <var-name>max</var-name>    
  38.          <var-value>100</var-value>    
  39.        </var>    
  40.     </field>    
  41.     </form>    
  42.   </formset>    
  43. </form-validation>   

<form-validation>   <!--以下是配置一些常用的验证规则 -->

  <formset>

<form name="regActionForm"> 

<!--表单名,为验证哪个表单而配置,这里的name指定strutsform-bean的别名 -->

    <field property="username" depends="required">

      <arg0 key="tip.username"/>

    </field>         arg0指要为该规则传入的第一个参数

<!--property为表单中的属性,depends为要验证的规则key为消息资料文件中的配置键 -->

<!-- 验证密码最小长度不小于8位 要一个控件属性验证两个规则的话真正以逗号分开, -->

 

<field property="userpass" depends="required,minlength">

      <arg0 key="tip.userpass"/>

      <arg1 key="${var:minlength}" name="minlength" resource="false"/>

      <var>

        <var-name>minlength</var-name>

        <var-value>8</var-value>

      </var>

    </field>

 

    <!--绿色的为变量名,好像定义也有规则,必须是那样而resource 则是配置是否从资源文件中查找key -->

   

 

<field property="email" depends="required,email">

      <arg0 key="tip.email"/>

    </field>

 

<!-- 验证年龄在一定范围之内 -->

    <field property="age" depends="required,intRange">

      <arg0 key="tip.age"/>

      <arg1 key="${var:min}" name="intRange" resource="false"/>

      <arg2 key="${var:max}" name="intRange" resource="false"/>

       <var>

         <var-name>min</var-name>

         <var-value>1</var-value>

       </var>

       <var>

         <var-name>max</var-name>

         <var-value>100</var-value>

       </var>

    </field>

    </form>

  </formset>

</form-validation>

 

 

4、编写消息资源文件

验证规则的配置文件中所用key的名字为该资源文件所配置

Python代码

  1. # errors.required={0}不能为空.    
  2. # tip.username=用户名    
  3. # tip.userpass=密码    
  4. # errors.minlength={0}不能少于{1}个字符.    
  5. # errors.email={0} 格式不合法.    
  6. # tip.email=邮箱    
  7. # tip.age=年龄    
  8. # errors.range={0} 必须在 {1} - {2} 之间.    
  9.   
  10. errors.required={0}/u4e0d/u80fd/u4e 3a /u 7a 7a .    
  11. tip.username=/u7528/u6237/u540d    
  12. tip.userpass=/u5bc6/u7801    
  13. errors.minlength={0}/u4e0d/u80fd/u 5c 11/u4e8e{1}/u4e 2a /u5b57/u7b26.    
  14. errors.email={0} /u 683c /u 5f 0f /u4e0d/u5408/u6cd5.    
  15. tip.email=/u90ae/u7bb1    
  16. tip.age=/u5e74/u 9f 84    
  17. errors.range={0} /u5fc5/u987b/u5728 {1} - {2} /u4e4b/u 95f 4.   

# errors.required={0}不能为空.

# tip.username=用户名

# tip.userpass=密码

# errors.minlength={0}不能少于{1}个字符.

# errors.email={0} 格式不合法.

# tip.email=邮箱

# tip.age=年龄

# errors.range={0} 必须在 {1} - {2} 之间.

 

errors.required={0}/u4e0d/u80fd/u4e3a/u7a7a.

tip.username=/u7528/u6237/u540d

tip.userpass=/u5bc6/u7801

errors.minlength={0}/u4e0d/u80fd/u5c11/u4e8e{1}/u4e2a/u5b57/u7b26.

errors.email={0} /u683c/u5f0f/u4e0d/u5408/u6cd5.

tip.email=/u90ae/u7bb1

tip.age=/u5e74/u9f84

errors.range={0} /u5fc5/u987b/u5728 {1} - {2} /u4e4b/u95f4.

 

 

5.struts-config.xml中配置Action验证失败跳转页面,属性为input指向的地方

二、手工验证;

1
、用户名、密码不能为空;

2
、密码长度不能小于8位;


1)验证代码写在哪儿?

ActionForm
validate()方法中,如果该方法返回的ActionErrors中没有包含错误消息,认为验证通过。


2)错误集合存在哪儿?

RequestProcessor 将错误集合存储在 Request 中,键名为

Globas.ERROR_KEY


3)如何显示错误消息? 

Html代码

  1. <html:errors/> <!--显示所有消息 -->  
  2. <html:errors property="xx"/> <!--显示指定的消息-->  

<html:errors/> <!--显示所有消息 -->

<html:errors property="xx"/> <!--显示指定的消息-->



三、生成JavaScript
1ActionForm继承 org.apache.struts.validator.ValidatorForm

2ActionForm中无 validate() 方法;

3)表单JSP页中加:

<html:form .... οnsubmit="return validateRegForm(this);">
颜色字体一致,首字母大写

<html:javascript formName="regForm"/>
4)在validation.xml中配置验证规则;




另外再说一个不怎么常用的标签,它的作用一般就是方便表单Bean对象的重复代码

Html代码

  1. <%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" %>    
  2. <h1>用户注册</h1>    
  3. <html:form action="reg.do" method="post">    
  4.   <nested:nest property="user">      
  5.     用户名:<nested:text property="username"/><br/>    
  6.     密码:<nested:text property="userpass"/><br/>    
  7.   </nested:nest>    
  8.   <html:submit value="提交"/>    
  9. </html:form>   

<%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" %>

<h1>用户注册</h1>

<html:form action="reg.do" method="post">

  <nested:nest property="user">  

    用户名:<nested:text property="username"/><br/>

    密码:<nested:text property="userpass"/><br/>

  </nested:nest>

  <html:submit value="提交"/>

</html:form>

 

要使用该配置,在ActionForm中要实例化一个user对象才可以通过以上配置使用对象中username的属性

Html代码

  1. <hr>    
  2. <h1>用户注册</h1>    
  3. <html:form action="reg.do" method="post">    
  4.     用户名:<html:text property="user.username"/><br/>    
  5.     密码:<html:text property="user.userpass"/><br/>    
  6.   <html:submit value="提交"/>    
  7. </html:form>   

<hr>

<h1>用户注册</h1>

<html:form action="reg.do" method="post">

    用户名:<html:text property="user.username"/><br/>

    密码:<html:text property="user.userpass"/><br/>

  <html:submit value="提交"/>

</html:form>



上面的代码也可以实现刚才的功能,但是在验证框架中就不能那么使用了

Tiles标签

Html代码

  1. <tiles:insert page="header.jsp" flush="true"/><!--标头内容 -->  

<tiles:insert page="header.jsp" flush="true"/><!--标头内容 -->


作用与嵌套网页,可以定制好一个模板,然后在模板中使用相应的可编辑内容

Html代码

  1. <h1>t1.jsp</h1>    
  2. 111111111111111    
  3. <hr>    
  4. <!--page表示所要插入的网页,flush是否及时更新 -->  
  5. <tiles:insert page="footer.jsp" flush="true"/><!--末尾内容 -->  

<h1>t1.jsp</h1>

111111111111111

<hr>

<!--page表示所要插入的网页,flush是否及时更新 -->

<tiles:insert page="footer.jsp" flush="true"/><!--末尾内容 -->



第二种情况是以一个定制了的模板生成个新的网页

Html代码

  1. <tiles:insert attribute="header"/>    
  2. <tiles:insert attribute="footer"/>    
  3.   
  4. <tiles:insert page="template1.jsp" flush="true">   <!--已经存在一个template1.jsp模板 -->  
  5. <tiles:put name="header" value="header.jsp"/>  <!--往属性header设置嵌入页面 -->  
  6. <tiles:put name="footer" value="footer.jsp"/>    <!--往属性footer设置嵌入页面 -->  
  7. </tiles:insert>   

<tiles:insert attribute="header"/>

<tiles:insert attribute="footer"/>

 

<tiles:insert page="template1.jsp" flush="true">   <!--已经存在一个template1.jsp模板 -->

<tiles:put name="header" value="header.jsp"/>  <!--往属性header设置嵌入页面 -->

<tiles:put name="footer" value="footer.jsp"/>    <!--往属性footer设置嵌入页面 -->

</tiles:insert>


1)防止重复提交;  Action
原理是通过在请求里面加入一些身份标记,在请求的时候判断是否事先存放的标记,如果不是则是第二次非正常提交

Java代码

  1. this.saveToken(request);        //在第一次点击请求的时候存入然后存转发到另一个JSP页面    
  2. //判断令牌是否有效;    
  3. if(! this.isTokenValid(request) ){     //如果是刚才的页面转发过来的话则它返回真    
  4. saveToken(request);    
  5. return ( new ActionForward(mapping.getInput()) );     
  6. //跳转到Action配置的input中的页面    
  7. }    
  8. //最后正常执行完业务逻辑就把先前存的Token删除    
  9. request.removeAttribute(mapping.getAttribute());    
  10. this.resetToken(request);   

this.saveToken(request);        //在第一次点击请求的时候存入然后存转发到另一个JSP页面

//判断令牌是否有效;

if(! this.isTokenValid(request) ){     //如果是刚才的页面转发过来的话则它返回真

saveToken(request);

return ( new ActionForward(mapping.getInput()) ); 

//跳转到Action配置的input中的页面

}

//最后正常执行完业务逻辑就把先前存的Token删除

request.removeAttribute(mapping.getAttribute());

this.resetToken(request);



2)动态ActionForm(对应的JAVA类是动态产生的,JAVA类中的属性在struts-config.xml文件中动态配置)
1.
配置Struts-config.xml中的 <form-bean/>,在其中声明

表单中要包含的字段元素;

----------------------------------------
例如页面上有以下一个表单 ,分别有属性username userage

Html代码

  1. <form action="dynaReg.do" method="post">    
  2. username:<input size=10 name="username"><br>    
  3. userage:<input size=10 name="userage"><br>    
  4. <input type="submit" value=" OK ">    
  5. </form>   

<form action="dynaReg.do" method="post">

username:<input size=10 name="username"><br>

userage:<input size=10 name="userage"><br>

<input type="submit" value=" OK ">

</form>

 

那么对应这个表单就要在Struts-config.xml中配置一个与其对应的form-bean

Xml代码

  1. <form-bean name="dynaRegForm" dynamic="true" type="org.apache.struts.action.DynaActionForm"> <!--指定该bean为动态的,并类型是该类    
  2. 如果使用了动态FORMBEAN也想用验证框架的话这里的TYPE就要指定DynaValidatorActionForm -->  
  3.         <form-property name="username" type="java.lang.String"/>    
  4.         <form-property name="userage" type="java.lang.Integer" initial="0"/>    
  5. </form-bean>    
  6.     

<form-bean name="dynaRegForm" dynamic="true" type="org.apache.struts.action.DynaActionForm"> <!--指定该bean为动态的,并类型是该类

如果使用了动态FORMBEAN也想用验证框架的话这里的TYPE就要指定DynaValidatorActionForm -->

        <form-property name="username" type="java.lang.String"/>

        <form-property name="userage" type="java.lang.Integer" initial="0"/>

</form-bean>

 

 ----------------------------------------------------
2.
配置Struts-config.xml中的 <action/>,将动态ActionForm
与某个Action结合起来
;
只要name属性名称一致就可以了

Action中的业务方法有些改动,因为它自动生成表单bean,所以取值的时候要像这样取,get中填写xml配置中的属性名字,form强转换成DynaActionForm类对象,使用.get方法,返回Object,所以相应的再强转成想要的类型

String username=(String)((DynaActionForm)form).get("username");
Integer userage=(Integer)((DynaActionForm)form).get("userage");
3.
客户使用表单,表单中名称与<form-bean>中声明的相同;


最后在使用完表单bean之后要删除掉刚才生成的bean;方法如下

request.removeAttribute(mapping.getAttribute());//
删除
FormBean


(3)DispatchAction
类,可以在一个Action中编写多个业务方法
;
1
、编写Action,要继承DispatchAction,且无execute()方法;

2
、在Action类中提供多个业务方法;

3
、在表单/超链接中生成请求时,用URL
xxxxx.do?method=XX
4
、使用该类,可以节省Action的个数
;

测试DispatchAction(一个Action处理多种业务
):
math.do?method=add
math.do?method=dec
math.do?method=mul

Action类中要写入相应的方法。

Java代码

  1. public ActionForward add(ActionMapping mapping,    
  2.                             ActionForm form,    
  3.                             HttpServletRequest request,    
  4.                             HttpServletResponse response)    
  5.     throws Exception {    
  6.     System.out.println("add....");    
  7.     request.setAttribute( "mathresult","add...." );    
  8.     return mapping.findForward( "success" );    
  9.     }   

public ActionForward add(ActionMapping mapping,

                            ActionForm form,

                            HttpServletRequest request,

                            HttpServletResponse response)

    throws Exception {

    System.out.println("add....");

    request.setAttribute( "mathresult","add...." );

    return mapping.findForward( "success" );

    }


其他几个以此类推。。。。。。。。。。。。

(4)
一个表单实现多种业务(计算器)
----LookupDispatchAction;
LookupDispatchAction(
一个表单对应多个处理方法
):

1
、编写Action,继承LookupDispatchAction类;

2
、重写LookupDispatchAction类的getKeyMethodMap(),在该方法内对提交按钮文字键名业务方法名进行映射;

Java代码

  1. protected Map getKeyMethodMap(){    
  2. Map map=new HashMap();    
  3. map.put("页面显示的按钮","本类中的业务方法名");    
  4. map.put("button.add ","add");    
  5. return map;    
  6. }   

protected Map getKeyMethodMap(){

Map map=new HashMap();

map.put("页面显示的按钮","本类中的业务方法名");

map.put("button.add ","add");

return map;

}


3
、编写业务方法;

Java代码

  1. //add    
  2.     public ActionForward add(ActionMapping mapping,    
  3.                                  ActionForm form,    
  4.                                  HttpServletRequest request,    
  5.                                  HttpServletResponse response)    
  6.     throws Exception    
  7.     {    
  8.   
  9.         int num1 = ((Math2Form) form).getNum1();    
  10.         int num2 = ((Math2Form) form).getNum2();    
  11. request.setAttribute( "math2Result", ""+(num1+num2) );    
  12.         request.removeAttribute(mapping.getAttribute());    
  13.         return (mapping.findForward("success"));    
  14.     }   

//add

    public ActionForward add(ActionMapping mapping,

                                 ActionForm form,

                                 HttpServletRequest request,

                                 HttpServletResponse response)

    throws Exception

    {

 

        int num1 = ((Math2Form) form).getNum1();

        int num2 = ((Math2Form) form).getNum2();

request.setAttribute( "math2Result", ""+(num1+num2) );

        request.removeAttribute(mapping.getAttribute());

        return (mapping.findForward("success"));

    }


4
、表单中的提交按钮中,显示文字时使用

Html代码

  1. <bean:message key="xxx"/>  

<bean:message key="xxx"/>


5
、使用该类,可以出现许多避免重复性表单;(如下为前台表单显示的内容)

Html代码

  1. <html:submit property="action">    
  2. <bean:message key="button.add"/>    
  3. </html:submit>   

<html:submit property="action">

<bean:message key="button.add"/>

</html:submit>


(5)ForwardAction

Html代码

  1. <action       
  2. path = "/jsp1"    
  3. type = "org.apache.struts.actions.ForwardAction"    
  4. parameter ="/jsp1.jsp"    
  5. />    
  6.   
  7. <action       
  8. path = "/jsp1"    
  9. forward="/jsp1.jsp"    
  10. />   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值