`

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的验证框架Validate使用[2]

    Struts的验证框架Validate是Java Web开发中一个关键的组件,尤其在构建MVC(Model-View-Controller)架构的应用程序时。这个框架主要用于确保用户输入的数据满足预定义的业务规则,从而提升应用的安全性和数据的准确...

    Struts2讲义-作者:吴峻申

    - 第一代Struts(Struts 1)采用MVC设计模式,将业务逻辑与视图分离,极大地简化了Web应用的开发过程。 - 随着Web应用需求的不断增长和技术的发展,第一代Struts逐渐显露出一些不足之处,如强耦合性等。 - 为了...

    struts1和struts2区别

    Struts1和Struts2是两个非常著名的Java Web框架,它们在处理MVC(Model-View-Controller)架构方面有着显著的区别。以下是关于这两个框架在关键特性上的对比: 1. **Action类**: - **Struts1**:要求Action类继承...

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

    Struts是Java Web开发中的一款经典MVC框架,它的验证框架Validate是用于处理用户输入验证的重要组件。在Struts的第六讲中,我们主要探讨了如何有效地利用Validate进行数据校验,以确保用户提交的信息符合应用程序的...

    转:struts1与struts2的区别

    为了解决这一问题,社区开发了第三方工具如Struts TestCase,它提供了一套用于模拟Struts1环境的组件。 - **Struts2**: 在Struts2中,可以通过初始化、设置属性和调用方法等方式轻松地测试Action。依赖注入的支持...

    Struts1与Struts2本质区别

    - **Struts 2**:使用更强大的OGNL(Object Graph Notation Language)表达式语言,支持复杂的数据结构操作,如遍历集合、获取嵌套属性等,大大提高了数据访问的灵活性和便利性。 #### 7. 绑定值到视图的对比 - **...

    struts1与struts2本质区别

    - **Struts1**:使用Commons-Beanutils进行类型转换,每个类一个转换器,转换器不可配置。 - **Struts2**:使用OGNL进行类型转换,支持基本数据类型和常用对象之间的转换,并且具有更高的灵活性。 #### 九、数据...

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

    在Struts中,验证框架Validate是实现业务数据验证的重要工具,它帮助开发者确保用户输入的数据符合预设的规则,从而提高应用的安全性和用户体验。 在Struts的验证框架中,验证过程通常分为两部分:客户端验证和...

    struts1与struts2的区别

    Struts1和Struts2是两个非常著名的Java Web框架,它们在处理MVC(Model-View-Controller)架构方面有着显著的区别。以下是关于这两个框架差异的详细解释: 1. **Action类**: - **Struts1**:要求Action类继承自一...

    Struts1和Struts2的比较

    Struts1和Struts2是两个非常著名的Java Web框架,它们在处理MVC(Model-View-Controller)架构方面有着不同的实现方式。以下是对这两个框架的详细比较: 1. **Action类** - **Struts1**:在Struts1中,Action类...

    Struts,Spring,Hibernate三大框架的面试&笔试题

    Struts是基于MVC设计模式的开源Web应用框架,主要分为Struts1和Struts2。Struts1使用JSP和Servlet,它通过web.xml和struts-config.xml配置文件来管理和调度请求。请求从客户端浏览器出发,被ActionServlet接收,接着...

    Struts2.0框架技术详解

    1. **通过ActionContext**:使用`ActionContext.getContext().get(ServletActionContext.HTTP_RESPONSE)`。 2. **通过ServletActionContext**:直接使用`ServletActionContext.getResponse()`。 3. **通过拦截器**:...

    Struts2和Struts1的什么区别

    在探讨Struts2与Struts1的区别时,我们需深入理解这两个框架的设计理念、架构模式以及它们在实际应用中的表现差异。以下将从多个角度详细分析这两种流行Java Web框架的不同之处。 ### 1. **Action类的区别** #### ...

    struts2学习教程

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

    Struts1和Struts2的区别和对比

    Struts1和Struts2是两个非常著名的Java Web框架,它们在设计模式、可测试性、输入处理和表现层等方面存在显著的区别。 首先,Action类的设计有所不同。在Struts1中,Action类需要继承一个抽象基类,这限制了Action...

    struts1与2区别

    Struts1和Struts2是两个非常著名的Java Web开发框架,它们都在MVC(Model-View-Controller)设计模式的基础上提供了强大的功能。然而,两者在设计和实现上有显著的差异,下面将详细阐述它们的区别。 1. **Action类...

    Struts2学习笔记2012

    5. **编写第一个示例程序:** - 在`struts.xml`文件中添加如下配置: ```xml &lt;struts&gt; &lt;constant name="struts.devMode" value="true"/&gt; &lt;package name="default" namespace="/" extends="struts-default"&gt; ...

    struts2新特性预览

    Struts2是一个流行的Java Web框架,它在Struts1的基础上进行了很多改进,提供了更多的灵活性和可测试性。本文将深入探讨Struts2的一些关键新特性。 1. **Action类的改变**: 在Struts1中,Action类需要继承自一个...

Global site tag (gtag.js) - Google Analytics