现在的位置: 首页 > 综合 > 正文

struts下的验证

2013年07月04日 ⁄ 综合 ⁄ 共 13117字 ⁄ 字号 评论关闭
在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文件,里面定义的是应用程序特有的验证规则内容,针对表单的属性用正则表达式给出具体的验证法则。

<?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

抱歉!评论已关闭.