您的位置:首页 > 编程语言 > Java开发

Struts中的校验框架

2011-03-09 12:21 363 查看
使用Struts1.x中的validator-rules.xml规则验证表单,请看demo

首先是web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 	<servlet>
		<servlet-name>action</servlet-name>
		<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
		<init-param>
			<param-name>config</param-name>
			<param-value>/WEB-INF/struts-config.xml</param-value>
		</init-param>
		<init-param>
			<param-name>debug</param-name>
			<param-value>3</param-value>
		</init-param>
		<init-param>
			<param-name>detail</param-name>
			<param-value>3</param-value>
		</init-param>
		<load-on-startup>0</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>action</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
	
	<welcome-file-list>
		<welcome-file>validateFrame.jsp</welcome-file>
	</welcome-file-list>
</web-app>


然后是需要校验的前台页面validateFrame.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<html:form action="/validateFrame">
	uname : <html:text property="uname"/><html:errors property="uname"/><br/>
	email : <html:text property="email"/><html:errors property="email"/><br/>
	age : <html:text property="age"/><html:errors property="age"/><br/>
	tel : <html:text property="tel"/><html:errors property="tel"/><br/>
	<html:submit/><html:cancel/>
</html:form>


接着是校验成功后显示的validateFrameSuccess.jsp页面

<%@ page pageEncoding="UTF-8"%>
<%@ page import="com.jadyer.form.ValidateFrameForm"%>
<%
ValidateFrameForm vff = (ValidateFrameForm)session.getAttribute("validateFrameForm");
%>
<font color="blue"><%=vff.getUname()%></font>,登录成功


下面是Struts1.x中的核心配置文件struts-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
	<form-beans>
		<form-bean name="validateFrameForm" type="com.jadyer.form.ValidateFrameForm" />
	</form-beans>
	
	<action-mappings>
		<action path="/validateFrame"
      			attribute="validateFrameForm"
      			name="validateFrameForm"
      			input="/validateFrame.jsp"
      			type="com.jadyer.action.ValidateFrameAction">
      		<forward name="validateFrameSuccess" path="/validateFrameSuccess.jsp" redirect="true" />
    	</action>
	</action-mappings>
	
	<message-resources parameter="com.jadyer.util.ApplicationResources" />
	
	<!-- 此时需要将validator-rules.xml和validation.xml文件在WebRoot//WEB-INF//目录下 -->
	<!-- 其中validator.xml是我们自己编写的,而validator-rules.xml是由Struts1.x提供的 -->
	<!-- 在Struts1.2中,validator-rules.xml位于//WebRoot//WEB-INF根目录中 -->
	<!-- 在Struts1.3中,validator-rules.xml位于struts-core-1.3.8.jar中的org.apache.struts.validator包中 -->
	<!-- 然后将validator-rules.xml另存为validation.xml,并将该文件第12行<plug-in>拷贝到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>
</struts-config>


接着是用于校验表单字段的validation.xml文件

<!DOCTYPE form-validation PUBLIC
          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
          "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
	<formset>
		<!-- 指明所要验证的<form-bean>,其name属性必须与struts-config.xml的<form-bean>标记的name属性一致 -->
		<!-- 并且它所对应的validateFrameForm必须是支持验证的Form,即需要继承ValidatorForm -->
		<!-- 也就是说它必须是ValidatorForm的子类,而普通的ActionForm是不支持框架验证的 -->
		<form name="validateFrameForm">
		<!-- property的值对应前台页面validateFrame.jsp里的<html:text property="uname"/>中的property值 -->
		<!-- depends用于指定所使用的验证器,即具体的校验的方式,这里的required表示必填 -->
			<field property="uname" depends="required,mask">
				<!-- 当resource为TRUE时,表示使用来自国际化资源文件中的消息,反之则要显式的指定key属性的消息文本 -->
				<!-- 其中arg后的数字必须与资源文件中占位符的数字相同。若占位符为{2},那么這里必须写成agr2方可生效 -->
				<arg0 key="输入的用户名" resource="false"/>
				<var>
					<!-- mask验证也称为掩码验证 -->
					<var-name>mask</var-name>
					<!-- 限定输入的内容必须是字符串 -->
					<var-value>[A-Za-z]</var-value>
				</var>
			</field>
			<field property="email" depends="required,email">
				<arg0 key="lab.email"/>
			</field>
			<field property="age" depends="required,intRange">
				<arg0 key="lab.age" />
				<arg1 name="intRange" key="${var:min}" resource="false" />
				<arg2 name="intRange" key="${var:max}" resource="false" />
				<var>
					<var-name>min</var-name>
					<var-value>15</var-value>
				</var>
				<var>
					<var-name>max</var-name>
					<var-value>100</var-value>
				</var>
			</field>
			<field property="tel" depends="required,mask">
				<arg0 key="lab.tel"/>
				<var>
					<var-name>mask</var-name>
					<var-value>^/d{3}(-/d{8})?$</var-value>
				</var>
			</field>
		</form>
		
		<!-- 支持多表单验证 -->
		<!-- 
		<form name="enterForm">
			<field property="uname" depends="required,mask">
				<arg0 key="lab.name"/>
				<var>
					<var-name>mask</var-name>
					<var-value>[A-Za-z]</var-value>
				</var>
			</field>
			<field property="email" depends="required,email">
				<arg0 key="lab.email"/>
			</field>
		</form>
		 -->
	</formset>
</form-validation>

<!--
===================================================================================================
在Struts1.x使用自带的框架验证前台表单字段时,需要用到validator-rules.xml和validation.xml文件
在Struts1.2中,validator-rules.xml位于//WebRoot//WEB-INF根目录中
                另存该文件为validation.xml,并将该文件中第12行的<plug-in>拷贝到struts-config.xml中
在Struts1.3中,validator-rules.xml位于struts-core-1.3.8.jar中的org.apache.struts.validator包中
                复制该文件中的内容,然后粘贴到新建的//WebRoot//WEB-INF//validation.xml中即可
===================================================================================================
其中validator-rules.xml是加载Struts1.x框架的时候就已经出现的文件
在validator-rules.xml的第23行左右有一个#Struts Validator Error Messages的说明
说明该文件中所包含的是Struts中的验证的错误提示信息,在它下面列举了各种错误类别以及它们的具体内容和所在包等等
这个validator-rules.xml文档其实就是我们俗称的验证框架,但validator-rules.xml只是一个标准,不能直接使用
而我们必须利用这个标准撰写出一个设计准则,也就是我们自定义的validation.xml文件
===================================================================================================
当Struts运行的时候,它会把一个标准和一个具体的使用规则同时加载到框架中。然后接收从客户端发过来的信息
再按照我们指定的validation规则,使用validator-rules标准去验证数据的合理性
所以,真正的验证需要写在validation.xml文件中
===================================================================================================
-->

<!-- 下面以age的判断为例,简单说明一下它的用法 -->

<!--
=========================================================================================================
关于age这里设定了两种验证方式:required和intRange,即必填和整数大小限制。二者以逗号间隔
我们可以在validator-rules.xml文件的第61行查找到<validator name="required"/>
它的msg值为errors.required,然后在该文件的从第24行可以发现errors.required={0} is required.
所以,我们就可以在国际化的资源文件中建立一个名为errors.required的属性
注意,此时国际化资源文件中新增的errors.required属性名要与validator-rules.xml的第61行的msg的值相同
然后可以把"{0} is required"作为errors.required属性的英文显示值,把"{0} 不能为空"作为它的中文显示值
=========================================================================================================
其中{0}代表占位符。然后在国际化资源文件中新增lab.age属性,设定该属性的英文值为"age",中文值为"姓名"
接着可以在validation.xml中新增<arg0 key="lab.age"/>,这里key值应与资源文件中lab.age属性名相同
而{0}显示的实际值则由arg0的key值决定。所以,这里面{0}占位符所显示的实际值其实就是lab.age的具体值
所以,应用运行时,如果用户提交时没有输入age,那么就会提示"age is required"或者"年龄 不能为空"
=========================================================================================================
然后参阅validator-rules.xml第234行和第37行,以同样的方式在国际化资源文件中新增errors.range属性
将"{0} is not in the range {1} through {2}"作为该属性在英文状态下显示的文本
将"{0} 的取值必须位于 {1} 与 {2} 之间"作为该属性在中文状态下显示的文本
=========================================================================================================
接着回到validation.xml中。在这里对年龄的限定范围,进行区间判断
这里新增的<arg1>和<arg2>分别代表errors.range属性的占位符的值
由于这是对年龄范围进行设置,所以新增的<arg1>的name值应为depends中设定的intRange
最好,还要注意一下key的书写形式:key="${var:min}"
=========================================================================================================
所以,应用运行时,如果用户提交时所输入的年龄不再15和100区间中
那么,就会显示"age is not in the range 15 through 100"或者"年龄 的取值必须位于 15 与 100 之间"
=========================================================================================================
-->


然后是用到的Struts1.x中的ActionForm类

package com.jadyer.form;

import org.apache.struts.validator.ValidatorForm;

//只有ValidatorForm的子类才支持Struts1.x中的validate校验框架的验证
@SuppressWarnings("serial")
public class ValidateFrameForm extends ValidatorForm {
	private String email;
	private String uname;
	private String tel;
	private Integer age;
	/*--四个属性的setter和getter略--*/
}


然后是用到的Struts1.x中的Action类

package com.jadyer.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.jadyer.form.ValidateFrameForm;

public class ValidateFrameAction extends Action {
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		ValidateFrameForm vff = (ValidateFrameForm) form;
		System.out.println("uname:" + vff.getUname());
		System.out.println("email:" + vff.getEmail());
		return mapping.findForward("validateFrameSuccess");
	}
}


最后是用到的国际化资源文件ApplicationResources.properties

errors.email    = {0} is an invalid e-mail address
errors.invalid  = {0} is invalid
errors.range    = {0} is not in the range {1} through {2}
errors.required = {0} is required
lab.age   = Age
lab.email = Email
lab.name  = Name
lab.tel   = Tel

#下面是ApplicationResources_zh_CN.properties文件的内容

errors.email    = {0} /u4E0D/u662F/u5408/u6CD5/u7684Email/u5730/u5740
errors.invalid  = {0} /u8F93/u5165/u7684/u5185/u5BB9/u4E0D/u5408/u7406
errors.range    = {0} /u7684/u53D6/u503C/u5FC5/u987B/u4F4D/u4E8E {1} /u4E0E {2} /u4E4B/u95F4
errors.required = {0} /u4E0D/u80FD/u4E3A/u7A7A
lab.age   = /u5E74/u9F84
lab.email = /u7535/u5B50/u90AE/u4EF6
lab.name  = /u59D3/u540D
lab.tel   = /u7535/u8BDD
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: