这几天在忙着公司的一个module的validation的维护和Merge工作,我们公司用到的是Struts,在一个Release里面用到了validation的东西,似乎感觉这东西不错,于是好象在新的Release要沿用.
为了做好本职工作,我在网上搜集了一些Struts validation方面的资料,做了一个非常非常简单的例子,如果你对Struts的validation不熟悉, 那么这个‘弯路’我就帮你走了。呵呵。
废话少讲,我们进入正题:
1.什么是Validation框架?
http://www.oracle.com/technology/oramag/oracle/04-jan/o14dev_struts.html
先给一个link给你看看。
[我的理解] 先说句废话,他其实是用来验证的。呵呵。他属于服务器端的验证,为什么说它是服务器端的验证,是因为Struts Validation Framework是在服务器工作的。还有一个客户端的验证,一般来说都是用Javascript来实现的,这个是地球人都知道。为什么有时候要用服务器验证还要客户端验证呢? 因为这样更保险,因为这样更能保证产品的安全性(扯远啦.)
2. Struts验证的几种方式:
http://www.blogjava.net/iask/archive/2005/08/02/9056.aspx
我觉得他说得蛮好的.
3. 通过一个简单的例子学Struts Validation.
a. 在Eclipse(其他IDE)中弄一个空的Struts项目出来,然后在web/inf下面加两个配置文件:
validation.xml 和 validator-rules.xml . 你暂时可以不管它是个什么东西,我们先看看它长得什么样:
validation.xml:
----------------------------------------------------
<?xml version="1.0" encoding="ISO-8859-1"?>
<form-validation>
<formset>
<form name="logonForm"> //指定你要验证的哪个form,这个需要和struts-config.xml中的form的名字对应起来
<field property="username"
depends="required"> //很明显,这个的验证的标准是让username是Reqired,即username是必须的.
<arg0 key="prompt.username"/> // prompt.username需要到资源文件里面去配置
</field>
<field property="password"
depends="required"> //同username
<arg0 key="prompt.password"/>
</field>
</form>
</formset>
</form-validation>
-----------------------------------------------------
这就是validation,设想一下,我们用jsp制作了两个text,一个是username一个是password,然后这里的validation的意思是说在进入到action之前我们是不允许它是空的。如果是空的,我们得给用户友好的提示。其实你不用validation也可以的。对吧。
这里还有个<arg0 key="prompt.username"/>,<arg0 key="prompt.password"/> 象这样的东西,他是需要在资源文件中配置的,其意思是指一个text. 因为后来我们输出错误消息的时候,往往是这样提示的:
Password is required.
注意:在Struts validation framework里面对这种类型的错误进行了自己的一些配置,我们只需要在配置文件中输入:errors.required={0} is required. 不需要对每个元素的错误信息在资源文件里配置。因为required的错误validation framework是已经在validator-rules.xml 中封装好了的。那么真正的错误信息就是随着arg0 的变化而变化了,比如说username 出错, 而prompt.username在资源文件中的配置是username, like: prompt.username = username; 总结一下:对于同种类型的错误,我们只要在资源文件中配置一条message记录就可以了,恩,我想你已经初步感受到Struts validation framework的方便与快捷了。
-------------------------------------------------------------------------------------------------------------------------
validator-rules.xml
我用的是 Struts1.1,在加Struts项目到Eclipse的时候会自动生成,刚才我也说啦,它是定义一下Struts的错误类型,这样我们就可以综合治理了。
-------------------------------------------------------------------------------------------------------------------------
Struts-config.xml
------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<data-sources />
<form-beans >
<form-bean name="logonForm" type="com.webex.application.hut.form.LogonForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="logonForm"
input="/form/logon.jsp"
name="logonForm"
path="/logon"
scope="request"
type="com.webex.application.hut.action.LogonAction" />
</action-mappings>
<message-resources parameter="com.webex.application.hut.ApplicationResources" />
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/>
</plug-in>
// 注意这里就是在配置文件中添加validation的插件,立即插立即用.
</struts-config>
------------------------------------------------------------------------------------------------------------
Struts的基本配置,如果你不会,请用自动生成功能。
-------------------------------------------------------------------------------------------------------------------------
ApplicationResources.properties (资源文件)
--------------------------------------------------------------------------------
# Resources for parameter 'com.webex.application.hut.ApplicationResources'
# Project P/TestingWanglinghua
# For login message
loginlogic.username = Please enter your username:
loginlogic.password = Please enter your password:
prompt.username = username
prompt.password = password
errors.required ={0} is required.
--------------------------------------------------------------------------------
JSP文件 form/logon.jsp
--------------------------------------------------------------------------------
<%@ page language="java"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html " prefix="html"%>
<html>
<head>
<title>JSP for logonForm form</title>
</head>
<body>
<html:form action="/logon">
<bean:message key="loginlogic.username"/><html:text property = "username"/> <html:errors property="username"/><br>
<bean:message key="loginlogic.password"/><html:text property = "password"/> <html:errors property="password"/><br>
<html:submit/><html:reset/><html:cancel/>
</html:form>
</body>
</html>
--------------------------------------------------------------------------------
Form文件:LogonForm.java
----------------------------------------------------------------------------------------
// Created by MyEclipse Struts
// XSL source (default):
// platform:/plugin/com.genuitec.eclipse.cross.easystruts.eclipse_4.1.1/xslt/JavaClass.xsl
package com.webex.application.hut.form;
import org.apache.struts.validator.ValidatorForm;
/**
* MyEclipse Struts Creation date: 09-20-2006 XDoclet definition:
* @struts.form name="logonForm"
*/
public class LogonForm extends ValidatorForm {
// --------------------------------------------------------- Instance Variables
// --------------------------------------------------------- Methods
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
在validator-rules.xml,
<validator name="required" classname="org.apache.struts.validator.FieldChecks" method="validateRequired"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
msg="errors.required">
</validator>
//msg="errors.required"这句话是在资源文件里面定义的名字,为什么非在对某一种类型的错误指定这个名字是在validator-rules.xml里面定义的。 你应该可以看到validateRequired方法是用Validation Framework提供的。当然它还提供了更多基本的严整法则:
<validator name="requiredif" classname="org.apache.struts.validator.FieldChecks" method="validateRequiredIf"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
msg="errors.required">
</validator>
<validator name="minlength" classname="org.apache.struts.validator.FieldChecks" method="validateMinLength"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
depends="" msg="errors.minlength">