Struts验证框架与一些技巧

还是通过一些步骤例子说明
首先建立Struts工程的时候要启动验证框架。
它称为Validator验证框架

主要依赖与两个.jar文件
Jakarta-oro.jar
Commons-validator.jar 

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

Xml代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cplug-in%20className%3D%22org.apache.struts.validator.ValidatorPlugIn%22%3E%20%0A%20%20%20%20%20%20%20%20%3Cset-property%20property%3D%22pathnames%22%20value%3D%22%2FWEB-INF%2Fvalidator-rules.xml%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2FWEB-INF%2Fvalidation.xml%22%2F%3E%20%0A%3C%2Fplug-in%3E"></embed>
  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代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%20%20import%20org.apache.struts.validator.ValidatorForm%3B%2F%2F%20%E5%AF%BC%E5%85%A5%E8%A6%81%E7%BB%A7%E6%89%BF%E7%9A%84%E7%B1%BB%20%0A%20%20public%20class%20%E8%A1%A8%E5%8D%95%E7%B1%BB%20extends%20ValidatorForm%20%2F%2F%E4%BF%AE%E6%94%B9%E7%BB%A7%E6%89%BF%E7%B1%BB"></embed>
  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代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cform-validation%3E%20%20%20%3C!--%E4%BB%A5%E4%B8%8B%E6%98%AF%E9%85%8D%E7%BD%AE%E4%B8%80%E4%BA%9B%E5%B8%B8%E7%94%A8%E7%9A%84%E9%AA%8C%E8%AF%81%E8%A7%84%E5%88%99%20--%3E%0A%20%20%3Cformset%3E%20%0A%3Cform%20name%3D%22regActionForm%22%3E%20%20%0A%3C!--%E8%A1%A8%E5%8D%95%E5%90%8D%EF%BC%8C%E4%B8%BA%E9%AA%8C%E8%AF%81%E5%93%AA%E4%B8%AA%E8%A1%A8%E5%8D%95%E8%80%8C%E9%85%8D%E7%BD%AE%EF%BC%8C%E8%BF%99%E9%87%8C%E7%9A%84name%E6%8C%87%E5%AE%9Astruts%E4%B8%ADform-bean%E7%9A%84%E5%88%AB%E5%90%8D%20--%3E%0A%20%20%20%20%3Cfield%20property%3D%22username%22%20depends%3D%22required%22%3E%20%0A%20%20%20%20%20%20%3Carg0%20key%3D%22tip.username%22%2F%3E%20%0A%20%20%20%20%3C%2Ffield%3E%20%20%20%20%20%20%20%20%20arg0%E6%8C%87%E8%A6%81%E4%B8%BA%E8%AF%A5%E8%A7%84%E5%88%99%E4%BC%A0%E5%85%A5%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%8F%82%E6%95%B0%20%0A%3C!--property%E4%B8%BA%E8%A1%A8%E5%8D%95%E4%B8%AD%E7%9A%84%E5%B1%9E%E6%80%A7%EF%BC%8Cdepends%E4%B8%BA%E8%A6%81%E9%AA%8C%E8%AF%81%E7%9A%84%E8%A7%84%E5%88%99key%E4%B8%BA%E6%B6%88%E6%81%AF%E8%B5%84%E6%96%99%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E9%85%8D%E7%BD%AE%E9%94%AE%20--%3E%0A%3C!--%20%E9%AA%8C%E8%AF%81%E5%AF%86%E7%A0%81%E6%9C%80%E5%B0%8F%E9%95%BF%E5%BA%A6%E4%B8%8D%E5%B0%8F%E4%BA%8E8%E4%BD%8D%20%E8%A6%81%E4%B8%80%E4%B8%AA%E6%8E%A7%E4%BB%B6%E5%B1%9E%E6%80%A7%E9%AA%8C%E8%AF%81%E4%B8%A4%E4%B8%AA%E8%A7%84%E5%88%99%E7%9A%84%E8%AF%9D%E7%9C%9F%E6%AD%A3%E4%BB%A5%E9%80%97%E5%8F%B7%E5%88%86%E5%BC%80%2C%20--%3E%20%0A%0A%3Cfield%20property%3D%22userpass%22%20depends%3D%22required%2Cminlength%22%3E%20%0A%20%20%20%20%20%20%3Carg0%20key%3D%22tip.userpass%22%2F%3E%20%0A%20%20%20%20%20%20%3Carg1%20key%3D%22%24%7Bvar%3Aminlength%7D%22%20name%3D%22minlength%22%20resource%3D%22false%22%2F%3E%20%0A%20%20%20%20%20%20%3Cvar%3E%20%0A%20%20%20%20%20%20%20%20%3Cvar-name%3Eminlength%3C%2Fvar-name%3E%20%0A%20%20%20%20%20%20%20%20%3Cvar-value%3E8%3C%2Fvar-value%3E%20%0A%20%20%20%20%20%20%3C%2Fvar%3E%20%0A%20%20%20%20%3C%2Ffield%3E%20%0A%20%0A%20%20%20%20%3C!--%E7%BB%BF%E8%89%B2%E7%9A%84%E4%B8%BA%E5%8F%98%E9%87%8F%E5%90%8D%2C%E5%A5%BD%E5%83%8F%E5%AE%9A%E4%B9%89%E4%B9%9F%E6%9C%89%E8%A7%84%E5%88%99%EF%BC%8C%E5%BF%85%E9%A1%BB%E6%98%AF%E9%82%A3%E6%A0%B7%E8%80%8Cresource%20%E5%88%99%E6%98%AF%E9%85%8D%E7%BD%AE%E6%98%AF%E5%90%A6%E4%BB%8E%E8%B5%84%E6%BA%90%E6%96%87%E4%BB%B6%E4%B8%AD%E6%9F%A5%E6%89%BEkey%20--%3E%0A%20%20%20%20%0A%0A%3Cfield%20property%3D%22email%22%20depends%3D%22required%2Cemail%22%3E%20%0A%20%20%20%20%20%20%3Carg0%20key%3D%22tip.email%22%2F%3E%20%0A%20%20%20%20%3C%2Ffield%3E%20%0A%20%0A%3C!--%20%E9%AA%8C%E8%AF%81%E5%B9%B4%E9%BE%84%E5%9C%A8%E4%B8%80%E5%AE%9A%E8%8C%83%E5%9B%B4%E4%B9%8B%E5%86%85%20--%3E%0A%20%20%20%20%3Cfield%20property%3D%22age%22%20depends%3D%22required%2CintRange%22%3E%20%0A%20%20%20%20%20%20%3Carg0%20key%3D%22tip.age%22%2F%3E%20%0A%20%20%20%20%20%20%3Carg1%20key%3D%22%24%7Bvar%3Amin%7D%22%20name%3D%22intRange%22%20resource%3D%22false%22%2F%3E%20%0A%20%20%20%20%20%20%3Carg2%20key%3D%22%24%7Bvar%3Amax%7D%22%20name%3D%22intRange%22%20resource%3D%22false%22%2F%3E%20%0A%20%20%20%20%20%20%20%3Cvar%3E%20%0A%20%20%20%20%20%20%20%20%20%3Cvar-name%3Emin%3C%2Fvar-name%3E%20%0A%20%20%20%20%20%20%20%20%20%3Cvar-value%3E1%3C%2Fvar-value%3E%20%0A%20%20%20%20%20%20%20%3C%2Fvar%3E%20%0A%20%20%20%20%20%20%20%3Cvar%3E%20%0A%20%20%20%20%20%20%20%20%20%3Cvar-name%3Emax%3C%2Fvar-name%3E%20%0A%20%20%20%20%20%20%20%20%20%3Cvar-value%3E100%3C%2Fvar-value%3E%20%0A%20%20%20%20%20%20%20%3C%2Fvar%3E%20%0A%20%20%20%20%3C%2Ffield%3E%20%0A%20%20%20%20%3C%2Fform%3E%20%0A%20%20%3C%2Fformset%3E%20%0A%3C%2Fform-validation%3E%20%0A%0A"></embed>
  1. <form-validation>   <!--以下是配置一些常用的验证规则 -->  
  2.   <formset>   
  3. <form name="regActionForm">    
  4. <!--表单名,为验证哪个表单而配置,这里的name指定struts中form-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指定struts中form-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代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%23%20errors.required%3D%7B0%7D%E4%B8%8D%E8%83%BD%E4%B8%BA%E7%A9%BA.%20%0A%23%20tip.username%3D%E7%94%A8%E6%88%B7%E5%90%8D%20%0A%23%20tip.userpass%3D%E5%AF%86%E7%A0%81%20%0A%23%20errors.minlength%3D%7B0%7D%E4%B8%8D%E8%83%BD%E5%B0%91%E4%BA%8E%7B1%7D%E4%B8%AA%E5%AD%97%E7%AC%A6.%20%0A%23%20errors.email%3D%7B0%7D%20%E6%A0%BC%E5%BC%8F%E4%B8%8D%E5%90%88%E6%B3%95.%20%0A%23%20tip.email%3D%E9%82%AE%E7%AE%B1%20%0A%23%20tip.age%3D%E5%B9%B4%E9%BE%84%20%0A%23%20errors.range%3D%7B0%7D%20%E5%BF%85%E9%A1%BB%E5%9C%A8%20%7B1%7D%20-%20%7B2%7D%20%E4%B9%8B%E9%97%B4.%20%0A%0Aerrors.required%3D%7B0%7D%5Cu4e0d%5Cu80fd%5Cu4e3a%5Cu7a7a.%20%0Atip.username%3D%5Cu7528%5Cu6237%5Cu540d%20%0Atip.userpass%3D%5Cu5bc6%5Cu7801%20%0Aerrors.minlength%3D%7B0%7D%5Cu4e0d%5Cu80fd%5Cu5c11%5Cu4e8e%7B1%7D%5Cu4e2a%5Cu5b57%5Cu7b26.%20%0Aerrors.email%3D%7B0%7D%20%5Cu683c%5Cu5f0f%5Cu4e0d%5Cu5408%5Cu6cd5.%20%0Atip.email%3D%5Cu90ae%5Cu7bb1%20%0Atip.age%3D%5Cu5e74%5Cu9f84%20%0Aerrors.range%3D%7B0%7D%20%5Cu5fc5%5Cu987b%5Cu5728%20%7B1%7D%20-%20%7B2%7D%20%5Cu4e4b%5Cu95f4.%20%0A"></embed>
  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\u4e3a\u7a7a.   
  11. tip.username=\u7528\u6237\u540d   
  12. tip.userpass=\u5bc6\u7801   
  13. errors.minlength={0}\u4e0d\u80fd\u5c11\u4e8e{1}\u4e2a\u5b57\u7b26.   
  14. errors.email={0} \u683c\u5f0f\u4e0d\u5408\u6cd5.   
  15. tip.email=\u90ae\u7bb1   
  16. tip.age=\u5e74\u9f84   
  17. errors.range={0} \u5fc5\u987b\u5728 {1} - {2} \u4e4b\u95f4.   
# 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代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Chtml%3Aerrors%2F%3E%20%3C!--%E6%98%BE%E7%A4%BA%E6%89%80%E6%9C%89%E6%B6%88%E6%81%AF%20--%3E%0A%3Chtml%3Aerrors%20property%3D%22xx%22%2F%3E%20%3C!--%E6%98%BE%E7%A4%BA%E6%8C%87%E5%AE%9A%E7%9A%84%E6%B6%88%E6%81%AF--%3E"></embed>
  1. <html:errors/> <!--显示所有消息 -->  
  2. <html:errors property="xx"/> <!--显示指定的消息-->  
<html:errors/> <!--显示所有消息 -->
<html:errors property="xx"/> <!--显示指定的消息-->


三、生成JavaScript
(1)ActionForm继承 org.apache.struts.validator.ValidatorForm;
(2)ActionForm中无 validate() 方法;
(3)表单JSP页中加:
<html:form .... οnsubmit="return validateRegForm(this);">颜色字体一致,首字母大写
<html:javascript formName="regForm"/>
(4)在validation.xml中配置验证规则;

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

Html代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3C%25%40%20taglib%20uri%3D%22%2FWEB-INF%2Fstruts-nested.tld%22%20prefix%3D%22nested%22%20%25%3E%20%0A%3Ch1%3E%E7%94%A8%E6%88%B7%E6%B3%A8%E5%86%8C%3C%2Fh1%3E%20%0A%3Chtml%3Aform%20action%3D%22reg.do%22%20method%3D%22post%22%3E%20%0A%20%20%3Cnested%3Anest%20property%3D%22user%22%3E%20%20%20%0A%20%20%20%20%E7%94%A8%E6%88%B7%E5%90%8D%3A%3Cnested%3Atext%20property%3D%22username%22%2F%3E%3Cbr%2F%3E%20%0A%20%20%20%20%E5%AF%86%E7%A0%81%3A%3Cnested%3Atext%20property%3D%22userpass%22%2F%3E%3Cbr%2F%3E%20%0A%20%20%3C%2Fnested%3Anest%3E%20%0A%20%20%3Chtml%3Asubmit%20value%3D%22%E6%8F%90%E4%BA%A4%22%2F%3E%20%0A%3C%2Fhtml%3Aform%3E%20%0A"></embed>
  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代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Chr%3E%20%0A%3Ch1%3E%E7%94%A8%E6%88%B7%E6%B3%A8%E5%86%8C%3C%2Fh1%3E%20%0A%3Chtml%3Aform%20action%3D%22reg.do%22%20method%3D%22post%22%3E%20%0A%20%20%20%20%E7%94%A8%E6%88%B7%E5%90%8D%3A%3Chtml%3Atext%20property%3D%22user.username%22%2F%3E%3Cbr%2F%3E%20%0A%20%20%20%20%E5%AF%86%E7%A0%81%3A%3Chtml%3Atext%20property%3D%22user.userpass%22%2F%3E%3Cbr%2F%3E%20%0A%20%20%3Chtml%3Asubmit%20value%3D%22%E6%8F%90%E4%BA%A4%22%2F%3E%20%0A%3C%2Fhtml%3Aform%3E%20"></embed>
  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代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Ctiles%3Ainsert%20page%3D%22header.jsp%22%20flush%3D%22true%22%2F%3E%3C!--%E6%A0%87%E5%A4%B4%E5%86%85%E5%AE%B9%20--%3E"></embed>
  1. <tiles:insert page="header.jsp" flush="true"/><!--标头内容 -->  
<tiles:insert page="header.jsp" flush="true"/><!--标头内容 -->

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

Html代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Ch1%3Et1.jsp%3C%2Fh1%3E%20%0A111111111111111%20%0A%3Chr%3E%20%0A%3C!--page%E8%A1%A8%E7%A4%BA%E6%89%80%E8%A6%81%E6%8F%92%E5%85%A5%E7%9A%84%E7%BD%91%E9%A1%B5%EF%BC%8Cflush%E6%98%AF%E5%90%A6%E5%8F%8A%E6%97%B6%E6%9B%B4%E6%96%B0%20--%3E%0A%3Ctiles%3Ainsert%20page%3D%22footer.jsp%22%20flush%3D%22true%22%2F%3E%3C!--%E6%9C%AB%E5%B0%BE%E5%86%85%E5%AE%B9%20--%3E"></embed>
  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代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Ctiles%3Ainsert%20attribute%3D%22header%22%2F%3E%20%0A%3Ctiles%3Ainsert%20attribute%3D%22footer%22%2F%3E%20%0A%0A%3Ctiles%3Ainsert%20page%3D%22template1.jsp%22%20flush%3D%22true%22%3E%20%20%20%3C!--%E5%B7%B2%E7%BB%8F%E5%AD%98%E5%9C%A8%E4%B8%80%E4%B8%AAtemplate1.jsp%E6%A8%A1%E6%9D%BF%20--%3E%0A%3Ctiles%3Aput%20name%3D%22header%22%20value%3D%22header.jsp%22%2F%3E%20%20%3C!--%E5%BE%80%E5%B1%9E%E6%80%A7header%E8%AE%BE%E7%BD%AE%E5%B5%8C%E5%85%A5%E9%A1%B5%E9%9D%A2%20--%3E%0A%3Ctiles%3Aput%20name%3D%22footer%22%20value%3D%22footer.jsp%22%2F%3E%20%20%20%20%3C!--%E5%BE%80%E5%B1%9E%E6%80%A7footer%E8%AE%BE%E7%BD%AE%E5%B5%8C%E5%85%A5%E9%A1%B5%E9%9D%A2%20--%3E%0A%3C%2Ftiles%3Ainsert%3E%20%0A"></embed>
  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代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=this.saveToken(request)%3B%20%20%20%20%20%20%20%20%2F%2F%E5%9C%A8%E7%AC%AC%E4%B8%80%E6%AC%A1%E7%82%B9%E5%87%BB%E8%AF%B7%E6%B1%82%E7%9A%84%E6%97%B6%E5%80%99%E5%AD%98%E5%85%A5%E7%84%B6%E5%90%8E%E5%AD%98%E8%BD%AC%E5%8F%91%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AAJSP%E9%A1%B5%E9%9D%A2%20%0A%2F%2F%E5%88%A4%E6%96%AD%E4%BB%A4%E7%89%8C%E6%98%AF%E5%90%A6%E6%9C%89%E6%95%88%EF%BC%9B%20%0Aif(!%20this.isTokenValid(request)%20)%7B%20%20%20%20%20%2F%2F%E5%A6%82%E6%9E%9C%E6%98%AF%E5%88%9A%E6%89%8D%E7%9A%84%E9%A1%B5%E9%9D%A2%E8%BD%AC%E5%8F%91%E8%BF%87%E6%9D%A5%E7%9A%84%E8%AF%9D%E5%88%99%E5%AE%83%E8%BF%94%E5%9B%9E%E7%9C%9F%20%0AsaveToken(request)%3B%20%0Areturn%20(%20new%20ActionForward(mapping.getInput())%20)%3B%20%20%0A%2F%2F%E8%B7%B3%E8%BD%AC%E5%88%B0Action%E9%85%8D%E7%BD%AE%E7%9A%84input%E4%B8%AD%E7%9A%84%E9%A1%B5%E9%9D%A2%20%0A%7D%20%0A%2F%2F%E6%9C%80%E5%90%8E%E6%AD%A3%E5%B8%B8%E6%89%A7%E8%A1%8C%E5%AE%8C%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91%E5%B0%B1%E6%8A%8A%E5%85%88%E5%89%8D%E5%AD%98%E7%9A%84Token%E5%88%A0%E9%99%A4%20%0Arequest.removeAttribute(mapping.getAttribute())%3B%20%0Athis.resetToken(request)%3B%20%0A"></embed>
  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代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cform%20action%3D%22dynaReg.do%22%20method%3D%22post%22%3E%20%0Ausername%3A%3Cinput%20size%3D10%20name%3D%22username%22%3E%3Cbr%3E%20%0Auserage%3A%3Cinput%20size%3D10%20name%3D%22userage%22%3E%3Cbr%3E%20%0A%3Cinput%20type%3D%22submit%22%20value%3D%22%20OK%20%22%3E%20%0A%3C%2Fform%3E%20%0A"></embed>
  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代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cform-bean%20name%3D%22dynaRegForm%22%20dynamic%3D%22true%22%20type%3D%22org.apache.struts.action.DynaActionForm%22%3E%20%3C!--%E6%8C%87%E5%AE%9A%E8%AF%A5bean%E4%B8%BA%E5%8A%A8%E6%80%81%E7%9A%84%EF%BC%8C%E5%B9%B6%E7%B1%BB%E5%9E%8B%E6%98%AF%E8%AF%A5%E7%B1%BB%20%0A%E5%A6%82%E6%9E%9C%E4%BD%BF%E7%94%A8%E4%BA%86%E5%8A%A8%E6%80%81FORMBEAN%E4%B9%9F%E6%83%B3%E7%94%A8%E9%AA%8C%E8%AF%81%E6%A1%86%E6%9E%B6%E7%9A%84%E8%AF%9D%E8%BF%99%E9%87%8C%E7%9A%84TYPE%E5%B0%B1%E8%A6%81%E6%8C%87%E5%AE%9ADynaValidatorActionForm%20--%3E%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%20%3Cform-property%20name%3D%22username%22%20type%3D%22java.lang.String%22%2F%3E%20%0A%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%26nbsp%3B%20%3Cform-property%20name%3D%22userage%22%20type%3D%22java.lang.Integer%22%20initial%3D%220%22%2F%3E%20%0A%3C%2Fform-bean%3E%20%0A%20%20"></embed>
  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代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=public%20ActionForward%20add(ActionMapping%20mapping%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ActionForm%20form%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20HttpServletRequest%20request%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20HttpServletResponse%20response)%20%0A%20%20%20%20throws%20Exception%20%7B%20%0A%20%20%20%20System.out.println(%22add....%22)%3B%20%0A%20%20%20%20request.setAttribute(%20%22mathresult%22%2C%22add....%22%20)%3B%20%0A%20%20%20%20return%20mapping.findForward(%20%22success%22%20)%3B%20%0A%20%20%20%20%7D%20"></embed>
  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代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=protected%20Map%20getKeyMethodMap()%7B%20%0AMap%20map%3Dnew%20HashMap()%3B%20%0Amap.put(%22%E9%A1%B5%E9%9D%A2%E6%98%BE%E7%A4%BA%E7%9A%84%E6%8C%89%E9%92%AE%22%2C%22%E6%9C%AC%E7%B1%BB%E4%B8%AD%E7%9A%84%E4%B8%9A%E5%8A%A1%E6%96%B9%E6%B3%95%E5%90%8D%22)%3B%20%0Amap.put(%22button.add%20%22%2C%22add%22)%3B%20%0Areturn%20map%3B%20%0A%7D%20"></embed>
  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代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%2F%2Fadd%20%0A%20%20%20%20public%20ActionForward%20add(ActionMapping%20mapping%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ActionForm%20form%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20HttpServletRequest%20request%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20HttpServletResponse%20response)%20%0A%20%20%20%20throws%20Exception%20%0A%20%20%20%20%7B%20%0A%0A%20%20%20%20%20%20%20%20int%20num1%20%3D%20((Math2Form)%20form).getNum1()%3B%20%0A%20%20%20%20%20%20%20%20int%20num2%20%3D%20((Math2Form)%20form).getNum2()%3B%20%0Arequest.setAttribute(%20%22math2Result%22%2C%20%22%22%2B(num1%2Bnum2)%20)%3B%20%0A%20%20%20%20%20%20%20%20request.removeAttribute(mapping.getAttribute())%3B%20%0A%20%20%20%20%20%20%20%20return%20(mapping.findForward(%22success%22))%3B%20%0A%20%20%20%20%7D%20"></embed>
  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代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Cbean%3Amessage%20key%3D%22xxx%22%2F%3E"></embed>
  1. <bean:message key="xxx"/>  
<bean:message key="xxx"/>

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

Html代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Chtml%3Asubmit%20property%3D%22action%22%3E%20%0A%3Cbean%3Amessage%20key%3D%22button.add%22%2F%3E%20%0A%3C%2Fhtml%3Asubmit%3E%20%0A"></embed>
  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代码 <embed height="15" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" allowscriptaccess="always" quality="high" flashvars="clipboard=%3Caction%20%20%20%20%0Apath%20%3D%20%22%2Fjsp1%22%20%0Atype%20%3D%20%22org.apache.struts.actions.ForwardAction%22%20%0Aparameter%20%3D%22%2Fjsp1.jsp%22%20%0A%2F%3E%20%0A%0A%3Caction%20%20%20%20%0Apath%20%3D%20%22%2Fjsp1%22%20%0Aforward%3D%22%2Fjsp1.jsp%22%20%0A%2F%3E%20%0A"></embed>
  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. />   
<action    
path = "/jsp1" 
type = "org.apache.struts.actions.ForwardAction" 
parameter ="/jsp1.jsp" 
/> 

<action    
path = "/jsp1" 
forward="/jsp1.jsp" 
/> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值