Chinaunix首页 | 论坛 | 博客
  • 博客访问: 91885
  • 博文数量: 13
  • 博客积分: 1523
  • 博客等级: 上尉
  • 技术积分: 245
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-14 14:54
文章分类

全部博文(13)

文章存档

2011年(5)

2010年(6)

2009年(1)

2008年(1)

我的朋友

分类: Java

2011-12-27 09:30:33

    在进行Struts编程时,想到要实现内容过滤,经查发现在Filter中通过request.getAttribute无法请求参数,而通过request.getParameter可以获取请求参数,于是,想要通过更改setAttribute实现内容过滤,但是无法实现,可以setAttribute,但是转换成ActionForm时,还是读取的原页面的参数值,此问题正在进行分析中...

 以下是转自网友蓝小刀整理的内容,供参考用

  1. Struts 中定义了一些JavaBeans,主要是以ActionForm为父类扩展开来的,如下图:

  2. ① org.apache.struts.action包中

  3. public abstract class ActionForm implements Serializable

  4. public class DynaActionForm extends ActionForm implements DynaBean

  5. ② org.apache.struts.validator包中
  6. public class ValidatorForm extends ActionForm implements Serializable

  7. public class DynaValidatorForm extends DynaActionForm

  8. implements DynaBean, Serializable

  9. ③ org.apache.struts.validator包中

  10. public class ValidatorActionForm extends ValidatorForm implements Serializable

  11. public class DynaValidatorActionForm extends DynaValidatorForm

  12.     implements DynaBean, Serializable

  13. 1 . ActionForm中比较常用的两个方法是reset()和validator():

  14. // 恢复ActionForm属性的默认值,如把boolean型设为true/false,字符串设为null。

  15. public void reset( ActionMapping mapping, HttpServletRequest request ) { }
  16. // validate 只检查数据格式和语法,不检查数据是否符合业务逻辑。

  17. public ActionErrors validate( ActionMapping mapping, HttpServletRequest request ) { return (null); }

  18. 这两个方法的默认实现是不执行任何操作,我们可以重写这两个方法来实现相关逻辑。

  19. 注: 对于每个request,控制器都会先调用ActionForm的reset()方法,然后表单数据组装到ActionForm中。如ActionForm在request范围内,那么对于每个新的request请求都会创建新的ActionForm实例。新实例创建后,如果它的属性已经被初始化为默认值,那么接着再在reset()方法中把属性设为默认值不是很有必要,这时可以让reset()方法为空。

  20. 对于session范围内的ActionForm,同一ActionForm实例会被多个请求共享,reset()方法在这种情况下极为有用。

  21. 2 . 其中,ActionForm需要我们创建一个formbean类继承ActionForm,在ActionForm中可以定义一些property和get/set方法。

  22. ActionForm 的property必须声明然后才可以使用,不过在查询时我们常常需要输入一些查询条件,这些查询条件(property)其实不需要在formbean中声明,这时可以使用Map对象来封装整个查询表单提交的数据,如下:

  23. public class MapForm extends ActionForm {
  24.     private Map map = null;
  25.     public void setMap(Map map) {
  26.         this.map = map;
  27.     }
  28.     public Map getMap() {
  29.         return this.map;
  30.     }
  31.     // 增加查询条件(property)的get/set方法,并把数据放到Map中
  32.     public void setAttribute(String attributeKey, Object attributeValue) {
  33.         map.put(attributeKey, attributeValue);
  34.     }
  35.     public Object getAttribute(String attributeKey) {
  36.         Object keyValue = map.get(attributeKey);
  37.         return keyValue;
  38.     }
  39. }
  40. 在页面上可以通过
  41. <html:text property="attribute(id)"/>
  42. 来获取表单数据,这会调用getAttribute("id")方法。
  43. 3 . 其中,Dyna开头的动态ActionForm不需要创建具体的ActionForm类,只需通过Struts的配置文件就可以完成ActionForm的全部配置,如:
  44. <form-bean name="optionsForm" type="org.apache.struts.action.DynaActionForm">
  45.     <form-property name="fruit1" type="java.lang.String" initial="Pear" />
  46.     <form-property name="fruit2" type="java.lang.String" initial="Apple" />
  47. </form-bean>
  48. 4 . 其中,含有validator的ActionForm用来进行表单验证,验证方法有两种。
  49. ① 在struts-config.xml中设置action的validate属性为"true"(默认为"true"),
  50. <action path="/updateUser"
  51.         type="com.cn.lively.action.UpdateUserAction"
  52.         name="userForm"
  53.         scope="request"
  54.         input="/jsp/updateUser.jsp"
  55.         cancellable="true"
  56.         validate="true" >
  57.     <forward name="success" path="/jsp/validator/updateUserResults.jsp"/>
  58. </action>
  59. 并且在相应的formbean中重写其中的validate方法,在validate方法中实现自己的数据验证逻辑。
  60. ② 通过validation框架进行验证,这分为两步:
  61. ⑴ 在struts-config.xml中配置validation插件,
  62. <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
  63.     <set-property property="pathnames"
  64.                   value="/org/apache/struts/validator/validator-rules.xml,
  65.                          /WEB-INF/validation.xml" />
  66. </plug-in>
  67. ⑵ 配置formbean,有下面两种方法:
  68. ㈠ 使自己的formbean类继承含有validator的ActionForm
  69. public class UserForm extends ValidatorForm{
  70.     private String userName;
  71.     public String getUserName() {
  72.         return userName;
  73.     }
  74.     public void setUserName(String userName) {
  75.         this.userName = userName;
  76.     }
  77. }

  78. 并配置struts-config.xml文件:
  79. <form-bean name="userForm" type="com.cn.lively.formbean.UserForm">
  80. </form-bean>
  81. ㈡ 使自己的formbean类继承含有validator的DynaValidatorForm
  82. <form-bean name="userForm" type="org.apache.struts.validator.DynaValidatorForm">
  83.     <form-property name="userName" type="java.lang.String" />
  84. </form-bean>
  85. ⑶ 配置validation.xml文件:
  86. <formset>
  87.     <form name="userForm">
  88.         <field property="userName" depends="required">
  89.             <arg key="userForm.userName" />
  90.         </field>
  91.     </form>
  92. </formset>
  93. 注: 注意 validation.xml文件中的userForm是struts-config.xml文件中formbean的名字。
  94. 关于arg的几个属性如下:
  95. bundle :指定资源文件名,如不指定,则从默认资源文件中读取
  96. key :从资源文件 ActionResources.properties 中得到的值
  97. resource :key所指定的信息是否来自外部的资源文件,默认为true。如果为true,则代表key为buddle属性所指定的资源文件中的key。
  98. position ,这个arg中的值用来替换信息中的哪一部分, 需要替换的部分以{n}标志。
  99. 5 . 关于ValidatorForm/DynaValidatorForm与ValidatorActionForm/DynaValidatorActionForm之间的区别
  100. 对于一个actionform,可以被多个action所使用,而每个action可能需要的验证字段都不一样,而validation.xml中配置的验证方式(如<form name="userForm">)是对这个formbean进行的.
  101. ① 如果需要针对每个action来验证,则必须使formbean继承ValidatorActionForm(或者直接配置DynaValidatorActionForm)。如下两种方法:
  102. ㈠ 使自己的formbean类继承含有validator的ActionForm
  103. public class UserForm extends ValidatorActionForm{
  104.     ……
  105. }
  106. 并配置struts-config.xml文件:
  107. <form-bean name="userForm" type="com.cn.lively.formbean.UserForm">
  108. </form-bean>
  109. <action-mappings>
  110.     <action path="/createUser"
  111.             type="com.cn.lively.action.CreateUserAction"
  112.             name="userForm"/>
  113.     <action path="/updateUser"
  114.             type="com.cn.lively.action.UpdateUserAction"
  115.             name="userForm"/>
  116. </action-mappings>
  117. ㈡ 使自己的formbean类继承含有validator的DynaValidatorActionForm
  118. <form-bean name="userForm" type="org.apache.struts.validator.DynaValidatorActionForm">
  119.     <form-property name="userName" type="java.lang.String" />
  120. </form-bean>
  121. <action-mappings>
  122.     <action path="/createUser"
  123.             type="com.cn.lively.action.CreateUserAction"
  124.             name="userForm"/>
  125.     <action path="/updateUser"
  126.             type="com.cn.lively.action.UpdateUserAction"
  127.             name="userForm"/>
  128. </action-mappings>
  129. ② 配置validation.xml文件:
  130. <formset>
  131.     <form name="/createUser">
  132.         <field property="userName" depends="required">
  133.             <arg key="userForm.userName" />
  134.         </field>
  135.     </form>
  136.     <form name="/updateUser">
  137.         <field property="userName" depends="maxlength">
  138.             <arg key="userForm.userName" />
  139.             <arg key="prompt.max" position="0"/>
  140.             <arg name="maxlength" key="${var:maxlength}" resource="false" position="1" />
  141.             <var>
  142.                 <var-name>maxlength</var-name>
  143.                 <var-value>10</var-value>
  144.             </var>
  145.         </field>
  146.     </form>
  147. </formset>
  148. 注: 注意validation.xml文件中的/createUser和/updateUser是struts-config.xml文件中action的path路径。

  149. 如果我们查看struts源码,可以很清楚的看到ValidatorForm/DynaValidatorForm与ValidatorActionForm/DynaValidatorActionForm之间的区别

  150. ValidatorForm 中的方法

  151. * @return validation key - the form element's name in this case

  152. public String getValidationKey(ActionMapping mapping,

  153.         HttpServletRequest request) {

  154.         return mapping.getAttribute(); // 返回formbean的名字

  155. }

  156.   

  157. ValidatorActionForm 中的方法

  158. * @return validation key - the action element's 'path' attribute in this * case

  159. public String getValidationKey(ActionMapping mapping,

  160.         HttpServletRequest request) {

  161.         return mapping.getPath(); // 返回action的路径


  162. }




  163. 7 . 上面的验证是在服务器端进行,如需要在客户端进行js验证,需要在页面上配置:

  164. ① <html:form action="/ createUser" onsubmit="return validateUserForm(this);">

  165. 格式为 return validate + formbean名称(首字母大写) + (this)

  166. 用来在提交本页面时执行相应的js验证代码。

  167.   

  168. ② 用来生成本页面的 js 验证代码。 有两种方法:

  169. ⑴ 一是 在页面上声明

  170. <%@ taglib uri="" prefix="html" %>

  171. <html:javascript formName="userForm" dynamicJavascript="true" staticJavascript="true"/>

  172. 因为dynamicJavascript/staticJavascript在JavascriptValidatorTag.java中默认为true,所以上面也可以直接写:<html:javascript formName="userForm"/>

  173. struts-html.tld

  174. <tag>

  175. <name>javascript</name>

  176. <tag-class>org.apache.struts.taglib.html.JavascriptValidatorTag</tag-class>

  177. </tag>

  178.   

  179. 注: 在客户端执行的js验证如果不通过,会alert出对话框进行提示,服务器 端 的验证(在页面上可以用<html:errors/>来显示出错信息)就不会执行。

  180. 注意只有dynamicJavascript="true" + staticJavascript="true" 才能生成完整的 js 验证代码 ,如果把任何一个设为"false"提交页面时都会产生js错误,除非我们采用下面⑵的方法进行声明。

  181.   

  182. ⑵

  183. Ⅰ 在本页面上声明

  184. <%@ taglib uri="" prefix="html" %>

  185. <html:javascript formName="userForm" dynamicJavascript="true" staticJavascript="false"/>

  186. <script language="Javascript1.1" src="staticJavascript.jsp"/></script>

  187. Ⅱ 定义staticJavascript.jsp的内容为

  188. <%@ taglib uri="" prefix="html" %>

  189. <html:javascript dynamicJavascript="false" staticJavascript="true"/>

  190.   

  191. 注: dynamicJavascript 表示是否在页面内生成动态的js,staticJavascript属性代表是否在页面内生成静态js。 如staticJavascript设为"true",则validator-rules.xml文件中的规则检查生成的js代码都会生成到本页面内。这样本页面会越来越大,一般最好是将staticJavascript设为"false", 将validator-rules.xml生成的js代码填充到一个指定的jsp页面(staticJavascript.jsp)中去。

  192.   

  193.   

  194.   

  195. 附:

  196. 只有 dynamicJavascript="true" + staticJavascript="true" 才能生成完整的 js 验证代码 ,下面是⑵ Ⅰ 中dynamicJavascript="true"生成的参考代码:

  197. var bCancel = false;

  198. function validateUserForm(form) {

  199.     if (bCancel) {

  200.         return true;

  201.     } else {

  202.         var formValidationResult;

  203.         // 调用staticJavascript.jsp中staticJavascript="true"生成的js代码


  204.         formValidationResult = validateByte(form) && validateEmail(form);

  205.         return (formValidationResult);

  206.     }

  207. }

  208. // validator-rules.xml 中定义了


  209. // jsFunctionName=" ByteValidations "/>


  210. // 则生成js函数名称为 formbean 名称 + 下划线 + jsFunctionName


  211. function userForm_ByteValidations() {

  212.     this.a0 = new Array("byteValue", "Byte must be a byte.", new Function ("varName", " return this[varName];"));

  213. }

  214. // validator-rules.xml 文件中没有定义jsFunctionName,


  215. // 则生成js函数名称为 formbean 名称 + 下划线 + validator name


  216. function userForm_email() {

  217.     this.a0 = new Array("email", "Email is an invalid e-mail address.", new Function ("varName", " return this[varName];"));

  218. }

  219.   

  220. 下面 是⑵ Ⅱ 中 staticJavascript.jsp 中 staticJavascript="true" 生成的参考代码:

  221. function validateByte(form) {

  222.     // ……


  223.     // 调用 userForm_ ByteValidations ()


  224.     // ……


  225. }

  226. function validateEmail(form) {

  227.     // ……


  228.     // 调用 userForm_ email ()


  229.     // ……


  230. }


  231.   




  232. 版权所有:(xiaodaoxiaodao)蓝小刀 xiaodaoxiaodao@gmail.com
阅读(1974) | 评论(0) | 转发(0) |
0

上一篇:ByteArrayOutputStream和ByteArrayInputStream详解 转载

下一篇:没有了

给主人留下些什么吧!~~