Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 356|回复: 0

[struts学习]在struts中用validator作服务器端验证

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-11 00:57:54 | 显示全部楼层 |阅读模式
    这个例子用的是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:javaApplicationResources1_zh_CN.properties >d:javaApplicationResources_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

      

      
      
       
       

         
       

         
       
      


    源码下载:http://file.javaxxz.com/2014/10/11/005753171.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 13:36 , Processed in 0.383433 second(s), 52 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表