`
folie2006
  • 浏览: 33844 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts验证框架与一些技巧

阅读更多

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

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

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

<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)修改该类的继承 

  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}之间

<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的名字为该资源文件所配置

# 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:errors/> <!--显示所有消息 -->
<html:errors property="xx"/> <!--显示指定的消息-->


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

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

<%@ 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的属性

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

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

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

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

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

<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
原理是通过在请求里面加入一些身份标记,在请求的时候判断是否事先存放的标记,如果不是则是第二次非正常提交

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

<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

<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类中要写入相应的方法。

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(),在该方法内对提交按钮文字“键名”和“业务方法名”进行映射;

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

 
3、编写业务方法;

//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、表单中的提交按钮中,显示文字时使用

<bean:message key="xxx"/>

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

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

 
(5)ForwardAction

<action    
path = "/jsp1" 
type = "org.apache.struts.actions.ForwardAction" 
parameter ="/jsp1.jsp" 
/> 

<action    
path = "/jsp1" 
forward="/jsp1.jsp" 
/> 
分享到:
评论
18 楼 bailang3106 2009-09-10  
支持下 不过还是用js  哎 学习js中。
17 楼 duronshi 2009-04-11  
一个项目里至少有50个页面吧,试想下,光验证规则配置文件有多少行?
想想就怕
16 楼 walle1027 2009-04-10  
  struts的验证框架,看上去很美,用起来很痛苦。
15 楼 folie2006 2009-01-09  
其实Struts的验证已经到了服务器端的了,所以JS只能控制到前台,这个只是更深一层验证罢了,但实际中比较少用吧.
14 楼 zds625 2009-01-08  
都是只用JS验证,用这些验证框架感觉太复杂啦,也许有它的好处,但是在开发中还没发现到!
13 楼 witcheryne 2009-01-07  
感觉还是 js 验证直观点....
刚接触struts验证框架.. 看的人有点头晕...
12 楼 ddd0401 2008-11-17  
感觉用JS验证也不错啊,比如把常用的JS验证代码进行集中管理、引用也不失为一个好的方案,而且修改时也不用看配置文件到处找方法了,比较直观。暂时还没用过struts的验证框架。
11 楼 aws 2008-10-28  
倒是从来不自己写JS验证,那么多的页面
orz
10 楼 liucl_tiger 2008-10-28  
我也只是做过JS的验证!
9 楼 lkjust08 2008-10-28  
其实楼总结的东西,是一个很好的学习资料,但我想在实际的开发过程中,这些验证似乎不怎么实用,还是用JS验证要好。
8 楼 fenghai 2008-10-24  
总结的不错,谢谢!不过用验证框架更方便!!
7 楼 java365 2008-10-23  
楼主列出的这些,自己以前在项目中都用到过。
不管怎么样,楼主总结的都是在用struts 的过程中非常常用的。
6 楼 chbest 2008-10-22  
coder1982 写道
个人实践证明,无论struts1或struts2的验证框架,在复杂多变的业务系统开发中都是不可取的。


很支持
5 楼 孤魂一笑 2008-10-22  
这都04年的技术吧
4 楼 coder1982 2008-10-14  
个人实践证明,无论struts1或struts2的验证框架,在复杂多变的业务系统开发中都是不可取的。

3 楼 hantsy 2008-10-14  
我的博客也写过此类的文章。
http://blog.chinaunix.net/u/1096/showart_476630.html

另外这个系列也有包含tiles,国际化等内容的使用。
2 楼 ziyu_1 2008-10-14  
我喜欢直接写javascript校验
1 楼 iq527 2008-10-13  
为什么这篇文章都没人回复呢??/
做shoppingcart的时候没做过验证
本来想试下这个,可是不是很熟悉
时间又不够
看了这贴子倒是收获蛮多的

相关推荐

    Java Web整合开发实战:基于Struts 2+Hibernate+Spring(PDF)

    6章 Struts之数据校验与GJ化 7章 详解Struts之标签库 8章 Struts之拦截器使用技巧 9章 在Struts中应用Ajax技术 10章 Struts之项目实战 3篇 持久层框架Hibernate技术 11章 Hibernate快速上手 12章 精解...

    Struts使用技巧和注意事项

    ----Struts 使用技巧---- 1 Struts validate 1.1 使用ActionForm的validate()验证 总体思路:这个验证是没有添加验证框架的验证,而是直接通过ActionForm的validate()方法进行系统验证, 进行验证要处理三个方面的...

    深入浅出Struts2源码(1-5章).rar

    书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...

    深入浅出Struts 2.rar 源码 全部例子

    书中介绍了如何利用Struts2来解决Web应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts2应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax的支持,等等。书中概念清晰...

    《深入浅出Struts 2》电子版全书(PDF)

    这本书将带你一起探讨Struts 2应用的方方面面,如架构、配置、实现Actions和对验证与国际化的支持等。除了这些,本书还专注于实践,用大量的代码和技巧教你如何快速使用Struts 2。目的是为了帮助读者掌握Struts2框架...

    深入浅出Struts2

    书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...

    structs程序设计从入门到精通word文档

    13.1 使用Struts Bean标签保存与传输数据小实例 15 第14章 Struts Logic标签库 15 14.1 如何使用Logic标签进行基于值的条件显示 15 14.1 如何使用Logic标签进行字符串匹配 15 14.1 如何使用Logic标签来检测值是否...

    深入浅出strtus2

    书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...

    北京中科信软AJAX培训

    jax概述 Ajax的定义 Web应用程序的解决方案 Ajax的工作方式 基于各种Web解决方案的Ajax技术选择路线 Ajax核心技术-XML XML与Ajax 文档类型定义及声明 ...和现有Web框架Struts的集成 和Hibernate框架的集成

    JAVA程序开发大全---上半部分

    以及基于这些技术的商业化应用程序的开发技巧,在讲解过程中以目前最为流行的开发工具MyEclipse为载体,全面系统地介绍了如何在MyEclipse中开发基于Struts、Hibernate、Spring等主流框架的各种Java应用程序。...

    达内java培训目录

    Struts2 Struts2核心控制流程、Ognl、Action、Interceptor、Result、FreeMarker、Struts2标记库、Struts2扩展、Struts2应用技巧(输入验证、消息国际化、文件上传和下载、防止重复提交等)。 熟练掌握Struts2核心...

    j2ee 架构设计 (SSH典型结构解析)

    具体讲解每个层次的实现技巧 第二部分:介绍组织层次关联利器(Spring) 快速入门 Factory模式 IOC模式 AOP模式 演练Spring的威力 第三部分:介绍日志管理利器(Log4j) 快速入门 演练Log4j的优越性 第四部分:介绍...

    Eclipse开发入门与项目实践 源代码

    Eclipse开发入门与项目实践 Eclipse开发入门与项目实践 源代码 Eclipse开发入门与项目实践 源代码 Eclipse开发入门与项目实践 源代码 第一部分 开发入门 第1章 Eclipse概述及开发环境搭建 2 1.1 Eclipse概述 2...

    AnyFo - Struts 2_1爆胎易筋丸.pdf

    目录 1 入门..................................................................5.3 验证框架................................................................................................................17...

    毕业论文-基于MVC设计模式的图书管理系统

    页面使用JSP作为表示层,并使用JavaScript来进行表单验证。为了使页面更加友好、流畅,还结合了Struts标签和CSS。在页面的使用技巧上,本程序采用了动态包含的方式,使得页面之间可以动态同步的显示。以及Apache ...

    webx3框架指南PDF教程附学习Demo

    Webx也是如此 —— 它在某些方面有一些独到的设计,超越了同类框架。Webx有哪些优势呢? Webx的优势 成熟可靠性 这个优势主要是针对阿里巴巴及属下网站而言。因为Webx在阿里巴巴和淘宝用了很多年。对于这种超大...

Global site tag (gtag.js) - Google Analytics