首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 企业软件 > 行业软件 >

struts2第一次:validate框架使用

2012-10-07 
struts2第一回:validate框架使用struts2总结第一回validate框架的使用以前在项目中对于表单字段的验证,基

struts2第一回:validate框架使用
struts2总结
                           第一回  validate框架的使用

以前在项目中对于表单字段的验证,基本都是在action具体方法中,也没有用到struts的validate,现在进入新公司了,我感觉有必要梳理一下前的做法。
这两天稍有空隙,对struts的验证框架使用进行了一些尝试总结,随后也打算对struts框架的各个方面都做一次比较详尽的开发级别的总结,方便将来的查看,避免因遗忘而导致的重复无谓的学习,网上有很多这方面资料,但我感觉,只有自己总结提炼出来的,才会理解深刻...


struts的验证可以有两种实现方式:
1.利用action名-validate.xml配置的方式。
2.在具体action中重写validate()方法。
首先看第一种(配置文件)代码示例:
jsp代码

<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>配置文件的错误验证处理</title><s:head/><body><s:form action="validate.action" validate="true"><s:textfield name="realName" /><s:fielderror fieldName="realName" /><!--令fieldName为响应的textfield名字,则可以单独分开显示各属性的验证结果,而不是把所有的验证结果都展示出来--><br/>                <s:textfield name="phone" ></s:textfield><s:fielderror fieldName="phone" /><br/><s:submit/></s:form></body></html>
validate.jsp

action代码:
package com;import com.opensymphony.xwork2.ActionSupport;public class ValidateTestAction extends ActionSupport {private String realName;private String phone;public String getRealName() {return realName;}public void setRealName(String realName) {this.realName = realName;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String toValidate() {       return SUCCESS;}public String doValidate() {System.out.println("realName:" + realName + "\tphone:" + phone);return SUCCESS;}}
ValidateTestAction.java

struts.xml配置:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"    "http://struts.apache.org/dtds/struts-2.1.dtd"><struts>   <constant name="struts.ui.theme" value="simple" /> <!-- 配置不要自动生成table元素 --><package name="abc" extends="struts-default" ><!-- struts校验框架测试类 --><action name="validate" name="code"><?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE validators PUBLIC  "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd" >          <validators >     <field name ="realName" >         <field-validator type ="requiredstring" > <!--requiredstring验证非空,验证顺序为自上而下,即同一个字段的多种提示信息不会同时展示于页面 -->            <message>真实姓名不能为空 </message>         </field-validator >         <field-validator type="stringlength"> <!--stringlength验证字符串长度 --><param name="maxLength">10</param><message>姓名必须在10字以内</message></field-validator>    </field>        <field name ="phone" >         <field-validator type ="requiredstring" >             <message>手机号码不能为空 </message>         </field-validator >     </field> </validators> 
ValidateTestAction-validation.xml

<!--在struts2中已经实现了很多常用验证,可以根据需要选用:
< validators >     < validator name ="required" class ="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator" />     < validator name ="requiredstring" class ="com.opensymphony.xwork2.validator.validators.RequiredStringValidator" /> 非空    < validator name ="int" class ="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator" /> 输入为int    < validator name ="double" class ="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator" /> 输入为double    < validator name ="date" class ="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator" /> 输入为date    < validator name ="expression" class ="com.opensymphony.xwork2.validator.validators.ExpressionValidator" />     < validator name ="fieldexpression" class ="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator" />     < validator name ="email" class ="com.opensymphony.xwork2.validator.validators.EmailValidator" />     < validator name ="url" class ="com.opensymphony.xwork2.validator.validators.URLValidator" />     < validator name ="visitor" class ="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator" />     < validator name ="conversion" class ="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator" />     < validator name ="stringlength" class ="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator" /> 字符串长度    < validator name ="regex" class ="com.opensymphony.xwork2.validator.validators.RegexFieldValidator" />     </validators >      -->


再看一下重写validate方法的代码实现
先区分一下几个不同的概念:
this.addFieldError("key",message);
一旦不为空将会跳转到input,用<s:fielderror/>标签显示.可以指定fieldname(集合中得key)属性来达到分开显示指定的验证信息。

this.addActionError("");
一旦不为空将会跳转到input,用<s:actionerror/>标签显示.

this.addActionMessage("");
这个只是一个提示信息,在下文页面中用<s:actionmessage/>展示集合中得全部message。

jsp代码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@ taglib prefix="s" uri="/struts-tags" %><html>  <head>    <title>验证数据</title>  </head>    <body>    <s:actionerror/>    <s:form action="overVali!doOverValidate.action">         hello:<s:textfield name="msg"/>         <s:fielderror name="msg" fieldName="msgMsg"/>         <br/>         phone : <s:textfield name="phone" />        <s:fielderror name="phone" fieldName="phoneMsg" /><br/>        <s:submit/>    </s:form>  </body></html>
overwritevalidate.jsp

java代码
package com;import com.opensymphony.xwork2.ActionSupport;public class OvenWriteValidateAction extends ActionSupport {private String msg;    private String phone;    public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;} /** * 这样做存在一个问题,即凡是进入该action类的请求都将强制验证。 */public void validate() {if (msg==null||"".equals(msg)) {System.out.println(INPUT);this.addFieldError("msgMsg", "必须输入msg!");this.addActionError("处理动作失败!");} if(phone==null||"".equals(phone)){this.addFieldError("phoneMsg", "必须输入手机号!");}else {this.addActionMessage("提交成功");}/** *  *  * 大家从上面的代码可以看出,Field错误需要一个key(一般用来表示是哪一个属性出的错误) * 而Action错误和Action消息只要提供一个信息字符串就可以了。 */}public String test() {return SUCCESS;}public String doOverValidate() {return SUCCESS;}}
OvenWriteValidateAction.java

struts.xml配置
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"    "http://struts.apache.org/dtds/struts-2.1.dtd"><struts>   <constant name="struts.ui.theme" value="simple" /> <!-- 配置不要自动生成table元素 --><package name="abc" extends="struts-default" ><global-results><result name="success">/success.jsp</result></global-results><!-- struts校验框架测试类 --><action name="overVali" class="com.OvenWriteValidateAction"><result name="input">/overwritevalidate.jsp</result><!--使用验证框架则必须配置input --></action></package></struts>
struts.xml

目前我有疑问的地方希望与有经验的朋友交流一下:
1.一旦做了validate的验证。
那么所以流经这个action类的请求都将经历一次验证,而实际上在一个action类中我只有一个方法需要验证,这就增添了麻烦。
2.利用上文中的第一种方式实现,致使每次进入action之前又多读取一个xml文档,这样会不会导致效率的降低,如果有影响,那么程度如何。




热点排行