论坛首页 Java企业应用论坛

拒绝XML,让STRUTS2支持易用的表单验证

浏览 4020 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-12  

本以为struts2的验证框架可以抛开struts1.x的验证鸡肋,没想到一样不尽如人意,仍然要搞N多XML配置来配置去。。。十分影响开发效率。索性把以前用过的超级表单验证JS拿来用。
 
JS的代码我就不贴了,附件带着(不是我写的,拿来主义。。。)----很强大,通过正则表达式默认支持几乎所有的表单元素,这样还不够,我们还可以自己写正则表达式来让它验证。。。SO。。。几乎能满足您的任何需求,太强大了 :D
 
FE:

java 代码
  1. 〈 input "Name" dataType="Chinese" msg="真实姓名只允许中文">  


======================================================================
 
但是这个JS需要很多额外的属性来支持,比如上面的 dataType 和 msg 。这难不倒我们,只要我们在STRUTS的UI标签里面加上一个属性,让STRUTS不解析这个属性直接把属性里的内容原样输出就能满足我们的需求。
 
FE:

java 代码
  1. 〈s:textarea name="chat.code" cdata=" require='false' dataType='Chinese'  msg='只允许中文"  label="code"/>  

只要让STRUTS标签解析别的属性,原样输出 cdata 属性即可。

======================================================================

让我们开始改造吧,很简单:先下个STRUTS2原码,把STRUTS2 JAR包用RAR解开里面的TLD和template下面会用到。

第一步:在struts-tags.tld中所有UI标签里加上 cdata 属性。--这个文件在JAR包的META-INF目录下

xml 代码
  1. <attribute>  
  2.   <name> cdata name>  
  3.   <required>falserequired>  
  4.   <rtexprvalue>truertexprvalue>  
  5.   <description>description>  
  6. attribute>  

  第二步:在BEAN里加上这个属性,需要改造的文件有两个
1)org.apache.struts2.components. UIBean.java

java 代码
  1.     //这个类是所有UI BEAN的父类,改了这个类所有的UI就都具有CDATA这个属性了。   
  2.     //设置属性   
  3. protected String cdata;   
  4.     public void setCdata(String cdata) {   
  5.         this.cdata = cdata;   
  6.     }   
  7.    //在evaluateParams方里中加上这段,把CDATA加到模板参数里面 。evaluateParams 方法会在标签 doEndTag 时被调用(end方法),目的是把所有存在的属性放到一个 LinkedHashMap 中,最后由 freemarker 解析出相应的HTML代码。   
  8.     if (cdata != null) {   
  9.        addParameter("cdata", findString(cdata));   
  10. }  


2)org.apache.struts2.views.jsp.ui. AbstractUITag.java 

java 代码
  1. //这个类是所有UI标签的父类,只要改了这个类那所有的UI标签就都能读到cdata这个属性了。   
  2. //同样的,加入 cdata 属性   
  3. protected String cdata;   
  4.     public void setCdata(String cdata) {   
  5.     this.cdata = cdata;   
  6. }     
  7. //在 populateParams 方法里加上下面这小句。 populateParams 方法在标签 doStartTag 时被调用。 可以看一下 ComponentTagSupport 这个类--- AbstractUITag的父类 。   
  8. uiBean.setCdata(cdata);   

 把新改的两个类和struts-tags.tld覆盖过去然后重新打包,当然最简单的是用RAR打开STRUTS的JAR包直接把这3个文件按目录覆盖过去。
好了,经过上面这两步STRUTS就能识别CDATA标签,并能读取这个标签数据把数据放到MAP中等待freemarker 来解析了。
 
第三步:创建自己的模板
 在classes 下建立 template 目录,再在下面建 mytheme 目录。
1) 加入 theme.properties 文件 文件内容 :

java 代码
  1. parent = simple   

(这个就不多解释了,网上资料很多)
2) 加入response-cdata.ftl ,用来原样输出cdata,很简单,文件内容:

java 代码
  1. <#if parameters.cdata?exists>   
  2.  ${parameters.cdata} <#rt/>   
  3. if>  

 3)重写UI标签(其实也不是重写,只是把SIMPLE目录下的标签拿过来改该:)),以textarea标签为例。STRUTS 模板的 simple 目录下把textarea.ftl文件拷到我们的 mytheme 目录下打开。找个合适的位置(这个应该会找吧) 把这句
 <#include "/${parameters.templateDir}/mytheme/response-cdata.ftl" /> 加上就OK啦。

======================================================================

大功告成啦,赶快测试一下,别忘了在JSP里引用一下 js(也可以改一下 head.ftl。。。),也别忘了指定使用mytheme模板(也可以建立struts. Properties把默认模板改成mytheme)

   发表时间:2007-09-12  
你说的这些功能,实际上在zk、jsf里面都有,甚至mootools里面也有,完全没有必要重写
0 请登录后投票
   发表时间:2007-09-12  
还不如自己写一些Struts标签来实现,更好用,而且可以移植到其它项目中。
常用的text和textarea有就可以了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics