在struts中用validator作伺服器端驗證
作者:未知 文章來源:轉載 點擊數: 183 更新時間:2007-3-13
這個例子用的是struts1.2.4內建的,但願能給你學習帶來協助。例子的目錄結構和所有用到的檔案,請從本站下載。
一、Form bean與jsp頁面
先看jsp頁面的表單,內容有姓名,地址,省(市),縣,郵編,電話,E-mail。
下面是Form bean,它在struts-config.xml中的命名是registrationForm。一定要繼承ValidatorForm,注意這個CityStateZip屬性,它用來存放:省(市),縣,郵編三項內容。
package org.apache.struts.webapp.validator;
import java.io.Serializable;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.validator.ValidatorForm;
public final class RegistrationForm extends ValidatorForm implements Serializable {
private String action = null;
private String sFirstName = null;
private String sLastName = null;
private String sAddr = null;
private CityStateZip csz = new CityStateZip();
private String sPhone = null;
private String sEmail = null;
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public String getFirstName() {
return sFirstName;
}
public void setFirstName(String sFirstName) {
this.sFirstName = sFirstName;
}
public String getLastName() {
return sLastName;
}
public void setLastName(String sLastName) {
this.sLastName = sLastName;
}
public String getAddr() {
return sAddr;
}
public void setAddr(String sAddr) {
this.sAddr = sAddr;
}
public CityStateZip getCityStateZip() {
return csz;
}
public void setCityStateZip(CityStateZip csz) {
this.csz = csz;
}
public String getPhone() {
return sPhone;
}
public void setPhone(String sPhone) {
this.sPhone = sPhone;
}
public String getEmail() {
return sEmail;
}
public void setEmail(String sEmail) {
this.sEmail = sEmail;
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
action = null;
sFirstName = null;
sLastName = null;
sAddr = null;
csz = new CityStateZip();
sPhone = null;
sEmail = null;
}
}
這是類CityStateZip的源碼,它對應省(市),縣,郵編,看後面的jsp頁面就知道:郵編存放在字串數組sZipPostal[]的第二項,其它兩項為null。
package org.apache.struts.webapp.validator;
public class CityStateZip implements java.io.Serializable {
private String sCity = null;
private String sStateProv = null;
private String[] sZipPostal = new String[3];
public String getCity() {
return sCity;
}
public void setCity(String sCity) {
this.sCity = sCity;
}
public String getStateProv() {
return sStateProv;
}
public void setStateProv(String sStateProv) {
this.sStateProv = sStateProv;
}
public String getZipPostal(int index) {
return sZipPostal[index];
}
public void setZipPostal(int index, String value) {
this.sZipPostal[index] = value;
}
}
這是含表單的registration.jsp,
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<html:html>
<head>
<title><bean:message key="registrationForm.title"/></title>
<html:base/>
</head>
<body bgcolor="white">
<logic:messagesPresent>
<bean:message key="errors.header"/>
<ul>
<html:messages id="error">
<li><bean:write name="error"/></li>
</html:messages>
</ul><hr />
</logic:messagesPresent>
<html:form action="registration-submit">
<html:hidden property="action"/>
<table border="0" width="100%">
<tr>
<th align="left">
<bean:message key="registrationForm.firstname.displayname"/>
</th>
<td align="left">
<html:text property="firstName" size="30" maxlength="30"/>
</td>
</tr>
<tr>
<th align="left">
<bean:message key="registrationForm.lastname.displayname"/>
</th>
<td align="left">
<html:text property="lastName" size="60" maxlength="60"/>
</td>
</tr>
<tr>
<th align="left">
<bean:message key="registrationForm.addr.displayname"/>
</th>
<td align="left">
<html:textarea property="addr" cols="40" rows="5"/>
</td>
</tr>
<tr>
<th align="left">
<bean:message key="registrationForm.city.displayname"/>
</th>
<td align="left">
<html:text property="cityStateZip.city" size="60" maxlength="60"/>
</td>
</tr>
<tr>
<th align="left">
<bean:message key="registrationForm.stateprov.displayname"/>
</th>
<td align="left">
<html:text property="cityStateZip.stateProv" size="60" maxlength="60"/>
</td>
</tr>
<tr>
<th align="left">
<bean:message key="registrationForm.zippostal.displayname"/>
</th>
<td align="left">
<html:text property="cityStateZip.zipPostal[1]" size="25" maxlength="25"/>
</td>
</tr>
<tr>
<th align="left">
<bean:message key="registrationForm.phone.displayname"/>
</th>
<td align="left">
<html:text property="phone" size="20" maxlength="20"/>
</td>
</tr>
<tr>
<th align="left">
<bean:message key="registrationForm.email.displayname"/>
</th>
<td align="left">
<html:text property="email" size="60" maxlength="60"/>
</td>
</tr>
<tr>
<td>
<html:submit property="submit">
<bean:message key="button.save"/>
</html:submit>
<html:reset>
<bean:message key="button.reset"/>
</html:reset>
<html:cancel>
<bean:message key="button.cancel"/>
</html:cancel>
</td>
</tr>
</table>
</html:form>
</body>
</html:html>
要注意的是下面三個屬性的寫法,它們的值將會存入form bean(即registrationForm)的CityStateZip屬性:
<html:text property="cityStateZip.city" size="60" maxlength="60"/>
<html:text property="cityStateZip.stateProv" size="60" maxlength="60"/>
<html:text property="cityStateZip.zipPostal[1]" size="25" maxlength="25"/>
二、struts-config.xml配置
<?xml version="1.0" encoding="iso-8859-1"?>
<!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="registrationForm" type="org.apache.struts.webapp.validator.RegistrationForm"/>
</form-beans>
<action-mappings>
<action path="/registration-submit"
type="org.apache.struts.webapp.validator.RegistrationAction"
name="registrationForm"
scope="request"
validate="true"
input="/validator/registration.jsp">
<forward name="success" path="/index.jsp"/>
</action>
</action-mappings>
<message-resources parameter="org.apache.struts.webapp.validator.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>
</struts-config>
1、struts-config.xml中利用外掛程式加入驗證組件validator。涉及四個重要檔案,一個是處理表單的RegistrationAction.java,這裡僅在日誌中輸出資訊,沒有資料庫儲存,無錯誤時轉到"success"頁面。
package org.apache.struts.webapp.validator;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public final class RegistrationAction extends Action {
/**
* Commons Logging 日誌.
*/
private Log log = LogFactory.getFactory().getInstance(this.getClass().getName());
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
RegistrationForm info = (RegistrationForm)form;
CityStateZip city=info.getCityStateZip();
String action = request.getParameter("action");
if(log.isInfoEnabled()){
log.info("1:="+city.getCity());
log.info("2:="+city.getStateProv());
log.info("3:="+city.getZipPostal(1));
}
// Was this transaction cancelled?
if (isCancelled(request)) {
if (log.isInfoEnabled()) {
log.info(
" "
+ mapping.getAttribute()
+ " - Registration transaction was cancelled");
}
removeFormBean(mapping, request);
return (mapping.findForward("success"));
}
return mapping.findForward("success");
}
protected void removeFormBean(
ActionMapping mapping,
HttpServletRequest request) {
// Remove the obsolete form bean
if (mapping.getAttribute() != null) {
if ("request".equals(mapping.getScope())) {
request.removeAttribute(mapping.getAttribute());
} else {
HttpSession session = request.getSession();
session.removeAttribute(mapping.getAttribute());
}
}
}
}
2、另一個是資源屬性檔案:ApplicationResources1_zh_CN.properties,使用時請用JDK內建的native2ascii.exe轉換為ApplicationResources_zh_CN.properties,並與class檔案放在一起。
d:/java/>native2ascii -encoding GBK d:/java/ApplicationResources1_zh_CN.properties >d:/java/ApplicationResources_zh_CN.properties
其中必須包括# Errors中的內容(因為在validator-rules.xml中用到這些資訊)
ApplicationResources1_zh_CN.properties
button.cancel=取消
button.confirm=配置
button.reset=重設
button.save=提交
# Errors
errors.footer=
errors.header=<h3><font color="red">驗證錯誤</font></h3>你必須更正下列錯誤:
errors.ioException=I/O exception rendering error messages: {0}
error.database.missing=<li>User database is missing, cannot validate logon credentials</li>
errors.required={0} 是必填項.
errors.minlength={0} 不能少於 {1} 個字元.
errors.maxlength={0} 不能大於 {1} 個字元.
errors.invalid={0} 是無效的.
errors.byte={0} must be an byte.
errors.short={0} must be an short.
errors.integer={0} must be an integer.
errors.long={0} must be an long.
errors.float={0} must be an float.
errors.double={0} must be an double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is not a valid credit card number.
errors.email={0} is an invalid e-mail address.
# Registration Form
registrationForm.title=伺服器端驗證
registrationForm.title.create=建立使用者
registrationForm.title.edit=編輯使用者資訊
registrationForm.firstname.displayname=你的名字:
registrationForm.lastname.displayname=你的姓:
registrationForm.addr.displayname=你的住址:
registrationForm.city.displayname=省市:
registrationForm.stateprov.displayname=州縣:
registrationForm.zippostal.displayname=郵編:
registrationForm.phone.displayname=電話:
registrationForm.email.displayname=E-mail:
registrationForm.lastname.maskmsg=姓只能是字元,不能有空格.
3、另兩個檔案就是下面提到的。
三、Validator配置
複製Validator-rules.xml,Validation.xml到當前應用程式的路徑下,比如WEB-INF/(可從struts-examples.war解壓後得到)。
1、 Validator-rules.xml裡定義的是驗證器,以<Validator>的方式儲存,預設情況下包含的規則已經可以滿足我們程式的需要,一般無需修改。
2、配置validation.xml檔案,裡面定義的是應用程式特有的驗證規則內容,針對錶單的屬性用Regex給出具體的驗證法則。
<?xml version="1.0" encoding="iso-8859-1"?>
<!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>
<global>
<constant>
<constant-name>phone</constant-name>
<constant-value>^/(?(/d{3})/)?[-| ]?(/d{3})[-| ]?(/d{4})$</constant-
</constant>
<constant>
<constant-name>zip</constant-name>
<constant-value>^/d{5}/d*$</constant-value>
</constant>
</global>
<formset>
<constant>
<constant-name>zip</constant-name>
<constant-value>^/d{5}(-/d{4})?$</constant-value>
</constant>
<form name="registrationForm">
<field property="firstName" depends="required,mask,minlength">
<arg key="registrationForm.firstname.displayname" position="0"/>
<arg name="minlength" key=" $ {var:minlength}" resource="false" position="1"/>
<var>
<var-name>mask</var-name>
<var-value>^/w+$</var-value>
</var>
<var>
<var-name>minlength</var-name>
<var-value>5</var-value>
</var>
</field>
<field property="lastName" depends="required,mask,maxlength">
<msg name="mask" key="registrationForm.lastname.maskmsg" />
<arg key="registrationForm.lastname.displayname" position="0" />
<arg name="maxlength" key=" $ {var:maxlength}" resource="false" position="1"/>
<var>
<var-name>mask</var-name>
<var-value>^[a-zA-Z]*$</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>10</var-value>
</var>
</field>
<field property="addr" depends="required">
<arg key="registrationForm.addr.displayname" />
</field>
<field property="cityStateZip.city" depends="required,mask">
<arg key="registrationForm.city.displayname" />
<var>
<var-name>mask</var-name>
<var-value>^[a-zA-Z]*$</var-value>
</var>
</field>
<field property="cityStateZip.stateProv" depends="required,mask">
<arg key="registrationForm.stateprov.displayname" />
<var>
<var-name>mask</var-name>
<var-value>^[a-zA-Z]*$</var-value>
</var>
</field>
<field property="cityStateZip.zipPostal[1]" depends="required,mask">
<arg key="registrationForm.zippostal.displayname" />
<var>
<var-name>mask</var-name>
<var-value></var-value>
</var>
</field>
<field property="phone" depends="mask">
<arg key="registrationForm.phone.displayname" />
<var>
<var-name>mask</var-name>
<var-value></var-value>
</var>
</field>
<field property="email" depends="required,email">
<arg key="registrationForm.email.displayname" />
</field>
</form>
</formset>
</form-validation>
四、測試:下載站長的目錄結構TestStruts,將其放入Tomcat的webapps下,在瀏覽器中輸入:
http://127.0.0.1:8080/TestStruts/validator/registration.jsp