`

struts2第一回:validate框架使用

    博客分类:
  • J2EE
 
阅读更多
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" class="com.ValidateTestAction">
	<result name="input">/validate.jsp</result><!--使用验证框架则必须配置input -->
	</action>
</package>
</struts>
struts.xml

验证框架的配置(action类名+validate-xml的文件,放置于com包中,struts2会自动找到它)
<?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文档,这样会不会导致效率的降低,如果有影响,那么程度如何。




2
3
分享到:
评论
1 楼 虚客_zZ 2012-11-30  
利用基于注解的方式实现参数验证就行哈。 针对方法的验证

相关推荐

    [浪曦原创]Struts系列 第5讲 Struts的验证框架Validate使用续一(zk001)

    [浪曦原创]Struts系列 第5讲 Struts的验证框架Validate使用续一(zk001)

    struts2学习教程

    struts2学习教程包括:第一个Struts2程序,处理一个form多个submit,struts.xml常用配置解析,使用validate方法验证数据,使用Validation框架验证数据,在Action类中获得HttpServletResponse对象的四种方法,上传...

    struts2讲义_吴峻申

    第1章 Struts过时了吗? 10 1.1 Struts历史发展过程 10 1.2 Struts2的“简历” 13 1.2.1 标签库介绍 13 1.2.2 拦截器应用目的 14 1.2.3 FilterDispatcher和Action概述 14 1.2.4 Struts2配置文件处理 15 1.2.5 OGNL...

    struts2验证.pdf

    struts2验证 其中分为手动复写validate 和 使用框架验证

    Spring面试题

    8. Struts的validate框架是如何验证的? 在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。 9. 说下Struts的设计模式 MVC模式: web应用程序启动时就会加载并初始化ActionServler...

    Struts in Action中文版

    1. 介绍.........................................................................................................18 1.1. 关于本书..........................................................................

    struts in Action

    1. 介绍.........................................................................................................18 1.1. 关于本书...........................................................................

    dangdang和smartstruts2.rar

    第一步:数据库设计(详情见dangdang.sql) d_book:图书信息表 d_product:产品信息表(各种类型产品所具有的共同信息项) d_category:图书栏目(分类)表 d_category_product:栏目与产品对应关系表 d_order:订单...

    java面试题

    Struts的validate框架是如何验证的? 74 72.11. dispatchAction是用什么技术实现的? 74 72.12. struts2.0的mvc模式?与struts1.0的区别? 74 72.13. struts1.2和struts2.0的区别?如何控制两种框架中的单例模式? ...

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...

    Struts2从入门到精通2017视频教程

    本课程共21讲,课程课件,上课源代码等资料购买后可以直接下载,该课程是在学习完JSP课程后,SSH框架的第一部分,后续还有Hibernate,Spring课程及3大框架的整合

Global site tag (gtag.js) - Google Analytics