struts2验证框架后台验证用户注册

在项目根目录,也就是struts.xml相同的位置添加一个validators.xml,用来添加自定义规则.我只添加了一条自定义的规则,用来验证密码提示问题是否存在与相关数据库中,避免恶意提交(虽然我觉得也可能没有必要,但为了学一下怎么自定义验证规则,我就多此一举了):

 

自定义规则的配置文件:validators.xml

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE validators PUBLIC  
  3.         "-//OpenSymphony Group//XWork Validator Config 1.0//EN"  
  4.         "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">  
  5.           
  6. <validators>        
  7.     <validator name="valueintable" class="com.validators.ValueInSpecificTable"/>  
  8. </validators>  

 

相应的类:ValueInSpecificTable

 

Java代码   收藏代码
  1. package com.validators;  
  2.   
  3. import org.hibernate.Query;  
  4. import org.hibernate.Session;  
  5. import org.hibernate.SessionFactory;  
  6. import org.hibernate.Transaction;  
  7. import org.hibernate.cfg.Configuration;  
  8.   
  9. import com.opensymphony.xwork2.validator.ValidationException;  
  10. import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;  
  11.   
  12. public class ValueInSpecificTable extends FieldValidatorSupport{  
  13.       
  14.     private String table;  
  15.       
  16.     public String getTable() {  
  17.         return table;  
  18.     }  
  19.   
  20.     public void setTable(String table) {  
  21.         this.table = table;  
  22.     }  
  23.   
  24.     public void validate(Object object) throws ValidationException {      
  25.         String fieldName = getFieldName();  
  26.         String value = (String)this.getFieldValue(fieldName, object);  
  27.           
  28.         SessionFactory factory = new Configuration().configure().buildSessionFactory();  
  29.         Session session = factory.openSession();  
  30.         Transaction transaction = session.beginTransaction();  
  31.         Query query = session.createQuery("from " + table + " where problemContent = '" + value + "'");  
  32.         transaction.commit();  
  33.           
  34.         if(query.list().isEmpty())  
  35.         {  
  36.             System.out.println("WARN: " + value + "is not in table: " + table);  
  37.             addFieldError(fieldName, object);  
  38.         }  
  39.           
  40.         session.close();  
  41.     }  
  42. }  

 

Action的验证配置文件(和Action放在相同目录下):UserRegisterSaveAction-vaidation.xml

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE validators PUBLIC   
  3.     "-//OpenSymphonyGroup//XWorkValidator1.0.2//EN"   
  4.     "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  
  5.   
  6.     <validators>    
  7.         <field name="register.user_id">   
  8.             <field-validator type="requiredstring">    
  9.                 <param name="trim">true</param>    
  10.                 <message>用户名不能为空</message>    
  11.             </field-validator>  
  12.               
  13.             <field-validator type="stringlength">  
  14.                 <param name="minLength">4</param>    
  15.                 <param name="maxLength">16</param>  
  16.                 <message>用户名长度应在4到16之间</message>  
  17.             </field-validator>  
  18.         </field>  
  19.           
  20.         <field name="register.password">     
  21.             <field-validator type="requiredstring">    
  22.                 <param name="trim">true</param>    
  23.                 <message>密码不能为空</message>    
  24.             </field-validator>    
  25.       
  26.             <field-validator type="stringlength">    
  27.                 <param name="minLength">6</param>    
  28.                 <param name="maxLength">18</param>    
  29.                 <message>密码长度应在6到18个字符之间</message>    
  30.             </field-validator>     
  31.         </field>        
  32.           
  33.         <field name="register.pwd_repeat">     
  34.             <field-validator type="fieldexpression">  
  35.                 <param name="fieldName">register.password</param>  
  36.                 <param name="fieldName">register.pwd_repeat</param>  
  37.                 <param name="expression"><![CDATA[register.password == register.pwd_repeat]]></param>  
  38.                 <message>密码必须和确认密码相等</message>  
  39.             </field-validator>   
  40.         </field>   
  41.           
  42.         <field name="register.problem_content">     
  43.             <field-validator type="valueintable">     
  44.                 <param name="table">PromptProblem</param>  
  45.                 <message>请输入信息</message>     
  46.             </field-validator>  
  47.         </field>        
  48.           
  49.         <field name="register.answer">     
  50.             <field-validator type="requiredstring">    
  51.                 <param name="trim">true</param>    
  52.                 <message>密码提示答案不能为空</message>    
  53.             </field-validator>  
  54.               
  55.             <field-validator type="stringlength">  
  56.                 <param name="minLength">2</param>    
  57.                 <param name="maxLength">10</param>  
  58.                 <message>密码提示答案长度应在2到10之间</message>  
  59.             </field-validator>     
  60.         </field>        
  61.           
  62.         <field name="register.nickname">     
  63.             <field-validator type="requiredstring">    
  64.                 <param name="trim">true</param>    
  65.                 <message>昵称不能为空</message>    
  66.             </field-validator>  
  67.               
  68.             <field-validator type="stringlength">  
  69.                 <param name="minLength">2</param>    
  70.                 <param name="maxLength">10</param>  
  71.                 <message>昵称长度应在2到10之间</message>  
  72.             </field-validator>     
  73.         </field>        
  74.           
  75.         <field name="register.phone">     
  76.             <field-validator type="regex">     
  77.                 <param name="fieldName">register.phone</param>  
  78.                 <param name="trim">true</param>  
  79.                 <param name="expression"><![CDATA[(((13[0-9]{1})|159|186|188|189|(15[0-9]{1}))+\d{8})]]></param>  
  80.                 <message>请输入正确的手机号码</message>    
  81.             </field-validator>  
  82.         </field>    
  83.           
  84.         <field name="register.email">     
  85.             <field-validator type="email">     
  86.                 <message>请输入正确的邮箱地址</message>                          
  87.             </field-validator>     
  88.         </field>            
  89.           
  90.     </validators>    














  91. 1. Struts2中的输入校验

    2. 编码方式校验
      1) Action一定要继承自ActionSupport
      2) 针对某个要进行校验的请求处理方法编写一个 public void validateXxx()方法,在方法内部进行表单数据校验.
      3) 也可针对所有的请求处理方法编写public void validate()方法。
      4) 在校验方法中,可以通过addFieldError()方法来添加字段校验错误消息。
      5) 当校验失败时,Struts框架会自动跳转到name为input的Result页面。在校验失败页面中,可以使用<s:fielderror/>来显示错误消息
      6) 简单,灵活。但重用性不高。
      
    3. XML配置方式校验。在编码方式之前被执行。
      1) 针对要校验的Action类,在同包下编写一个名为:Action类名-validation.xml校验规则文件。
      2) 在校验规则文件中添加校验规则:具体的校验器名,参数可参看Struts2的reference或Struts2的API。
         a) Field校验:针对Action类中每个非自定义类型的Field进行校验的规则。
        <field name="要校验的Field名">
         <field-validator type="校验规则器名" short-circuit="是否要短路径校验(默认是false)">
             <param name="校验器要使用的参数名">值</param>
                <message>校验失败时的提示消息</message>
      </field-validator>
      <!-- 还可添加其它的校验规则 -->
     </field>
     
         b) 非Field校验:针对Action类的某些Field使用OGNL表达进行组合校验。
        <validator type="fieldexpression">
      <param name="fieldName">pwd</param>
         <param name="fieldName">pwd2</param>
         <param name="expression"><![CDATA[pwd==pwd2]]></param><!-- OGNL表达式 -->
         <message>确认密码和密码输入不一致</message>
     </validator>
     
         c) visitor校验:主要是用来校验Action类中的自定义类型Field。(针对使用模型驱动方式时)
           i) 在Action类的的校验规则文件中针对自定义类型Field使用visitor校验规则。
        <!-- 针对自定义Field使用visitor校验 -->
     <field name="user">
      <field-validator type="required" short-circuit="true">
                <message>用户的信息必填</message><!-- 消息前缀 -->
      </field-validator>
      <field-validator type="visitor"><!-- 指定为visitor校验规则 -->
       <param name="context">userContext</param><!-- 指定本visitor校验的上下文名 -->
                <param name="appendPrefix">true</param><!-- 是否要添加校验失败消息的前缀 -->
                <message>用户的</message><!-- 消息前缀 -->
      </field-validator>
     </field>
        ii) 针对visitor的Field编写一个校验规则文件.文件名为: visitor字段类型名[-visitor校验的上下文名]-validation.xml. 例如: 本例中的文件名为User-userContext-validation.xml
                      注意: 此文件要存放到visitor字段类型所在的包下.
        iii) 在visitor的Field校验规则文件中针对要校验的Field添加校验规则.
       3) 在校验失败页面(名为input的result页面)中,可以使用<s:fielderror/>来显示错误消息。
       4) 默认情况下,XML的校验规则对Action中所有的请求处理方法生效.此时应该只针对每个要校验的请求处理方法指定校验。有两种方式:
          i) 只为Action中的指定方法指定校验规则文件,配置文件命名为:Action类型名-别名-validation.xml,
                          别名是要校验的方法对应的Action标签的name属性值。
                          如:UserAction在struts2.xml的配置为:
        <package name="my" extends="struts-default" namespace="/">
      <action name="user_*" class="com.javacrazyer.web.action.UserAction" method="{1}">
       <result name="success">/info.jsp</result>
       <result name="input">/user_{1}.jsp</result>
      </action>
        </package>              
                    ● UserAction中有registe方法和login方法,要对registe方法进行校验,则它的校验规则文件名为:UserAction-user_registe-validation.xml。
                     ● 如果使用visitor校验器,必需指定visitor校验的上下文名。
          ii) 在校验拦截器中指定要验证的方法。不太实用。
       <action name="user_*" class="com.javacrazyer.web.action.UserAction" method="{1}">
        <result name="success">/info.jsp</result>
        <result name="input">/user_{1}.jsp</result>
         <interceptor-ref name="defaultStack">
            <!-- 给校验拦截器指定不进行校验的方法列表:用逗号隔开 -->
            <param name="validation.excludeMethods">*</param>
            <!-- 给校验拦截器指定要进行校验的方法列表:用逗号隔开 -->
            <param name="validation.includeMethods">regist</param>
          </interceptor-ref>
       </action>
       5) 同时使用客户端校验和服务器端校验
          i) 设置<s:form>标签的validate属性:
             false:默认值。校验框架只执行服务器端校验。
             true:先执行客户端校验,然后再执行服务器端校验。
             form标签会根据你在服务器端配置的验证规则生成对应的JavaScript验证代码。
                          目前支持的内置校验器:required、requiredstring、stringlength、regex validator、email、url、int、double
          ii) 不太好用,不建议使用。建议使用jQuery进行页面表单校验。
       6) 自定义校验器:
          i) 继承自FieldValidatorSupport抽象类。重写validate(Object obj)方法
          ii) 注册校验器类. 在应用程序的classpath下新建一校验器注册文件。名为validators.xml,内容如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE validators PUBLIC
            "-//OpenSymphony Group//XWork Validator Config 1.0//EN"
            "
    http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
    <validators>
      <validator name="校验器名" class="校验器类的全限定名"/> 
    </validators>

     

    4. Annotation方式校验: Struts2提供了注解的方式校验
      1) @Validation 指明这个类或者接口将使用基于注解的校验。Struts2.1中已被标识为过时。
      2) @Validations() 在同一个方法上要使用多个注解校验时。
      3) @SkipValidation 指定某个方法不需要校验。否则所有方法都会使用校验。也可以在检验拦截器中使用validateAnnotatedMethodOnly
      4) 13个内置校验器的注解版本:(注:这些注解都只能用在方法级别上) 具体参数参见Struts2的API或Reference。
    @RequiredFieldValidator
    @RequiredStringValidator
    @StringLengthFieldValidator
    @IntRangeFieldValidator
    @DoubleRangeFieldValidator
    @DateRangeFieldValidator
    @ExpressionValidator
    @FieldExpressionValidator
    @RegexFieldValidator
    @EmailValidator
    @UrlValidator
    @VisitorFieldValidator
    @ConversionErrorFieldValidator

     


    acc_registe.jsp

    1. <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
    2. <%@ taglib uri="/struts-tags" prefix="s" %>  
    3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    4. <html>  
    5.   <head>  
    6.     <title>Struts2中基于XML配置式的校验器使用示例</title>  
    7.   </head>  
    8.   <body>  
    9. <h3>XML配置式校验器---注册页面</h3><hr/>  
    10.   
    11. <div style="color:red"><s:fielderror/></div>  
    12. <form action="acc_registe.action" method="post">  
    13.     <table>  
    14.         <tr>  
    15.             <td>ID</td>  
    16.             <td><input type="text" name="id" value="${param.id}"/></td>  
    17.         </tr>  
    18.         <tr>  
    19.             <td>登录名</td>  
    20.             <td><input type="text" name="name" value="${param.name}"/></td>  
    21.         </tr>  
    22.         <tr>  
    23.             <td>密码</td>  
    24.             <td><input type="password" name="pwd"/></td>  
    25.         </tr>  
    26.         <tr>  
    27.             <td>重复密码</td>  
    28.             <td><input type="password" name="pwd2"/></td>  
    29.         </tr>  
    30.         <tr>  
    31.             <td>时间</td>  
    32.             <td><input type="text" name="registed_date" value="${param.registed_date}"/></td>  
    33.         </tr>  
    34.         <tr>  
    35.             <td>email</td>  
    36.             <td><input type="text" name="email" value="${param.email}"/></td>  
    37.         </tr>  
    38.         <tr>  
    39.             <td>考试成绩</td>  
    40.             <td><input type="text" name="score" value="${param.score}"/></td>  
    41.         </tr>  
    42.         <tr>  
    43.             <td colspan="2"><input type="submit" value=" 提交 "/></td>  
    44.         </tr>  
    45.     </table>  
    46. </form>  
    47.   </body>  
    48. </html></span>  
     src/struts.xml

    1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8" ?>  
    2. <!DOCTYPE struts PUBLIC  
    3.     "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"  
    4.     "http://struts.apache.org/dtds/struts-2.1.7.dtd">  
    5.   
    6. <struts>  
    7.     <!-- 请求参数的编码方式 -->  
    8.     <constant name="struts.i18n.encoding" value="UTF-8"/>  
    9.     <!-- 指定被struts2处理的请求后缀类型。多个用逗号隔开 -->  
    10.     <constant name="struts.action.extension" value="action,do,go,xkk"/>  
    11.     <!-- 当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开  -->  
    12.     <constant name="struts.configuration.xml.reload" value="true"/>  
    13.     <!-- 是否使用struts的开发模式。开发模式会有更多的调试信息。默认值为false(生产环境下使用),开发阶段最好打开  -->  
    14.     <constant name="struts.devMode" value="false"/>  
    15.     <!-- 设置浏览器是否缓存静态内容。默认值为true(生产环境下使用),开发阶段最好关闭  -->  
    16.     <constant name="struts.serve.static.browserCache" value="false" />  
    17.     <!-- 是否允许在OGNL表达式中调用静态方法,默认值为false -->  
    18.     <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>  
    19.       
    20.     <!-- 指定由spring负责action对象的创建   
    21.     <constant name="struts.objectFactory" value="spring" />  
    22.     -->  
    23.     <!-- 是否开启动态方法调用 -->  
    24.     <constant name="struts.enable.DynamicMethodInvocation" value="false"/>  
    25.       
    26.     <package name="my" extends="struts-default" namespace="/">  
    27.         <action name="acc_*" class="com.javacrazyer.web.action.AccountAction" method="{1}">  
    28.             <result name="success">/info.jsp</result>  
    29.             <result name="input">/acc_{1}.jsp</result>  
    30.         </action>  
    31.           
    32.     </package>  
    33.       
    34. </struts>  
    35. </span>  

    AccountAction.java

    1. <span style="font-size: medium;">package com.javacrazyer.web.action;  
    2.   
    3. import java.util.Date;  
    4.   
    5. import com.opensymphony.xwork2.ActionSupport;  
    6.   
    7.   
    8. public class AccountAction extends ActionSupport {  
    9.     private static final long serialVersionUID = -1418893621512812472L;  
    10.     private Integer id;  
    11.     private String name;  
    12.     private String pwd;  
    13.     private String pwd2;  
    14.     private Double score;  
    15.     private Date registed_date;  
    16.     private String email;  
    17.       
    18.     public String registe() throws Exception{  
    19.         System.out.println("registe-------------------");  
    20.         return SUCCESS;  
    21.     }  
    22.       
    23.     public String login()throws Exception{  
    24.         return SUCCESS;  
    25.     }  
    26.       
    27.     public Integer getId() {  
    28.         return id;  
    29.     }  
    30.     public void setId(Integer id) {  
    31.         this.id = id;  
    32.     }  
    33.     public String getName() {  
    34.         return name;  
    35.     }  
    36.     public void setName(String name) {  
    37.         this.name = name;  
    38.     }  
    39.     public Double getScore() {  
    40.         return score;  
    41.     }  
    42.     public void setScore(Double score) {  
    43.         this.score = score;  
    44.     }  
    45.     public Date getRegisted_date() {  
    46.         return registed_date;  
    47.     }  
    48.     public void setRegisted_date(Date registedDate) {  
    49.         registed_date = registedDate;  
    50.     }  
    51.     public String getEmail() {  
    52.         return email;  
    53.     }  
    54.     public void setEmail(String email) {  
    55.         this.email = email;  
    56.     }  
    57.   
    58.     public String getPwd() {  
    59.         return pwd;  
    60.     }  
    61.   
    62.     public void setPwd(String pwd) {  
    63.         this.pwd = pwd;  
    64.     }  
    65.   
    66.     public String getPwd2() {  
    67.         return pwd2;  
    68.     }  
    69.   
    70.     public void setPwd2(String pwd2) {  
    71.         this.pwd2 = pwd2;  
    72.     }  
    73. }</span>  

    AccountAction-validation.xml [与AccountAction同目录]

    1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE validators PUBLIC   
    3.     "-//OpenSymphony Group//XWork Validator 1.0.2//EN"   
    4.     "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  
    5. <validators>  
    6.     <!-- 字段校验 -->  
    7.     <field name="id">  
    8.         <field-validator type="required" short-circuit="true">  
    9.             <message>ID必填的</message>  
    10.         </field-validator>  
    11.         <field-validator type="int">  
    12.             <param name="min">20</param>  
    13.             <param name="max">50</param>  
    14.             <message>ID必须在 ${min} 到 ${max} 之间</message>  
    15.         </field-validator>  
    16.     </field>  
    17.     <field name="name">  
    18.         <field-validator type="requiredstring" short-circuit="true">  
    19.             <message>姓名是必填的</message>  
    20.         </field-validator>  
    21.         <field-validator type="regex">  
    22.             <param name="expression"><![CDATA[(^[a-zA-Z_]\w{3,9}$)]]></param>  
    23.             <message>姓名不合法</message>  
    24.         </field-validator>  
    25.     </field>  
    26.     <field name="pwd">  
    27.         <field-validator type="requiredstring" short-circuit="true">  
    28.             <message>密码是必填的</message>  
    29.         </field-validator>  
    30.     </field>  
    31.       
    32.     <!-- 非字段校验 -->  
    33.     <validator type="fieldexpression">  
    34.         <param name="fieldName">pwd</param>  
    35.         <param name="fieldName">pwd2</param>  
    36.         <param name="expression"><![CDATA[pwd==pwd2]]></param><!-- OGNL表达式 -->  
    37.         <message>确认密码和密码输入不一致</message>  
    38.     </validator>  
    39.       
    40.     <field name="score">  
    41.         <field-validator type="double">  
    42.              <param name="minInclusive">0.0</param>  
    43.                <param name="maxInclusive">100.0</param>  
    44.                <message>成绩必须在${minInclusive}和${maxInclusive}之间</message>  
    45.         </field-validator>  
    46.     </field>  
    47.     <field name="email" >  
    48.         <field-validator type="regex">  
    49.              <param name="expression"><![CDATA[(^[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-])+((\.com)|(\.cn)|(\.net)|(\.org)|(\.info)|(\.edu)|(\.mil)|(\.gov)|(\.biz)|(\.ws)|(\.us)|(\.tv)|(\.cc)|(\.aero)|(\.arpa)|(\.coop)|(\.int)|(\.jobs)|(\.museum)|(\.name)|(\.pro)|(\.travel)|(\.nato)|(\..{2,3})|(\..{2,3}\..{2,3}))$)]]></param>  
    50.              <message>邮箱不合法</message>  
    51.         </field-validator>  
    52.     </field>  
    53.       
    54.     <field name="registed_date">  
    55.         <field-validator type="date">  
    56.              <param name="min">1970-01-01</param>  
    57.              <param name="max">2019-01-01</param>  
    58.              <message>注册日期不合法</message>  
    59.         </field-validator>  
    60.     </field>  
    61. </validators></span>  

    第二个示例:XML配置式校验器---登录和注册页面

    user_login.jsp

    1. <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
    2. <%@ taglib uri="/struts-tags" prefix="s" %>  
    3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    4. <html>  
    5.   <head>  
    6.     <title>Struts2中基于XML配置式的校验器使用示例</title>  
    7.   </head>  
    8.   <body>  
    9. <h3>XML配置式校验器---登录页面</h3><hr/>  
    10. <div style="color:red"><s:fielderror/></div>  
    11. <form action="user_login.action" method="post">  
    12.     <table>  
    13.         <tr>  
    14.             <td>登录名</td>  
    15.             <td><input type="text" name="user.name" value="${param['user.name']}"/></td>  
    16.         </tr>  
    17.         <tr>  
    18.             <td>密码</td>  
    19.             <td><input type="password" name="user.pwd"/></td>  
    20.         </tr>  
    21.         <tr><td colspan="2"><input type="submit" value=" 提交 "/></td></tr>  
    22.     </table>  
    23. </form>  
    24.   </body>  
    25. </html></span>  
    user_registe.jsp

    1. <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
    2. <%@ taglib uri="/struts-tags" prefix="s" %>  
    3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    4. <html>  
    5.   <head>  
    6.     <title>Struts2中基于XML配置式的校验器使用示例</title>  
    7.   </head>  
    8.   <body>  
    9. <h3>XML配置式校验器---注册页面</h3><hr/>  
    10.   
    11. <div style="color:red"><s:fielderror/></div>  
    12. <form action="user_registe.action" method="post">  
    13.     <table>  
    14.         <tr>  
    15.             <td>ID</td>  
    16.             <td><input type="text" name="user.id" value="${param['user.id']}"/></td>  
    17.         </tr>  
    18.         <tr>  
    19.             <td>登录名</td>  
    20.             <td><input type="text" name="user.name" value="${param['user.name']}"/></td>  
    21.         </tr>  
    22.         <tr>  
    23.             <td>密码</td>  
    24.             <td><input type="password" name="user.pwd"/></td>  
    25.         </tr>  
    26.         <tr>  
    27.             <td>重复密码</td>  
    28.             <td><input type="password" name="user.pwd2"/></td>  
    29.         </tr>  
    30.         <tr>  
    31.             <td>时间</td>  
    32.             <td><input type="text" name="user.registed_date" value="${param['user.registed_date']}"/></td>  
    33.         </tr>  
    34.         <tr>  
    35.             <td>email</td>  
    36.             <td><input type="text" name="user.email" value="${param['user.email']}"/></td>  
    37.         </tr>  
    38.         <tr>  
    39.             <td>考试成绩</td>  
    40.             <td><input type="text" name="user.score" value="${param['user.score']}"/></td>  
    41.         </tr>  
    42.         <tr>  
    43.             <td colspan="2"><input type="submit" value=" 提交 "/></td>  
    44.         </tr>  
    45.     </table>  
    46. </form>  
    47.   </body>  
    48. </html></span>  
    src/struts.xml
    1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8" ?>  
    2. <!DOCTYPE struts PUBLIC  
    3.     "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"  
    4.     "http://struts.apache.org/dtds/struts-2.1.7.dtd">  
    5.   
    6. <struts>  
    7.     <!-- 请求参数的编码方式 -->  
    8.     <constant name="struts.i18n.encoding" value="UTF-8"/>  
    9.     <!-- 指定被struts2处理的请求后缀类型。多个用逗号隔开 -->  
    10.     <constant name="struts.action.extension" value="action,do,go,xkk"/>  
    11.     <!-- 当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开  -->  
    12.     <constant name="struts.configuration.xml.reload" value="true"/>  
    13.     <!-- 是否使用struts的开发模式。开发模式会有更多的调试信息。默认值为false(生产环境下使用),开发阶段最好打开  -->  
    14.     <constant name="struts.devMode" value="false"/>  
    15.     <!-- 设置浏览器是否缓存静态内容。默认值为true(生产环境下使用),开发阶段最好关闭  -->  
    16.     <constant name="struts.serve.static.browserCache" value="false" />  
    17.     <!-- 是否允许在OGNL表达式中调用静态方法,默认值为false -->  
    18.     <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>  
    19.       
    20.     <!-- 指定由spring负责action对象的创建   
    21.     <constant name="struts.objectFactory" value="spring" />  
    22.     -->  
    23.     <!-- 是否开启动态方法调用 -->  
    24.     <constant name="struts.enable.DynamicMethodInvocation" value="false"/>  
    25.       
    26.     <package name="my" extends="struts-default" namespace="/">  
    27.         <action name="user_*" class="com.javacrazyer.web.action.UserAction" method="{1}">  
    28.             <result name="success">/info.jsp</result>  
    29.             <result name="input">/user_{1}.jsp</result>  
    30.         </action>  
    31.     </package>  
    32.       
    33. </struts>  
    34. </span>  

    UserAction.java

    1. <span style="font-size: medium;">package com.javacrazyer.web.action;  
    2.   
    3.   
    4. import com.javacrazyer.domain.User;  
    5. import com.opensymphony.xwork2.ActionSupport;  
    6.   
    7.   
    8. public class UserAction extends ActionSupport {  
    9.     private static final long serialVersionUID = -2554018432709689579L;  
    10.     private User user; //自定义类型Field  
    11.       
    12.       
    13.       
    14.     public String registe() throws Exception{  
    15.         System.out.println("registe======================");  
    16.         return SUCCESS;  
    17.     }  
    18.       
    19.     public String login() throws Exception{  
    20.         return SUCCESS;  
    21.     }  
    22.     /* 
    23.     public void validate(){ 
    24.         System.out.println("调用validate方法"); 
    25.     } 
    26.      
    27.     //执行exceute方法前调用 
    28.     public void validateRegiste(){ 
    29.         System.out.println("调用validateRegiste方法"); 
    30.         String lname = user.getLoginname(); 
    31.          if(null != lname && !lname.trim().matches("[a-zA-Z_]\\w{3,19}")){ 
    32.                 this.addFieldError("loginname", "用户名不能为空,且只能由4-20个字母和数字组成"); 
    33.                 //this.addActionError("用户名不能为空,且只能由4-20个字母和数字组成"); 
    34.         } 
    35.     } 
    36.      
    37.     public void validateLogin(){ 
    38.         System.out.println("调用validateLogin方法"); 
    39.     } 
    40. */  
    41.     public User getUser() {  
    42.         return user;  
    43.     }  
    44.   
    45.     public void setUser(User user) {  
    46.         this.user = user;  
    47.     }  
    48.       
    49. }</span>  
    UserAction-user_login-validation.xml

    1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE validators PUBLIC   
    3.     "-//OpenSymphony Group//XWork Validator 1.0.2//EN"   
    4.     "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  
    5. <validators>  
    6.     <!-- 针对自定义Field使用visitor校验 -->  
    7.     <field name="user">  
    8.         <field-validator type="required" short-circuit="true">  
    9.             <message>用户的信息必填</message><!-- 消息前缀 -->  
    10.         </field-validator>  
    11.         <field-validator type="visitor">  
    12.             <param name="context">userLoginContext</param><!-- 指定本visitor校验的上下文 -->  
    13.             <param name="appendPrefix">true</param><!-- 是否要添加校验失败消息的前缀 -->  
    14.             <message>用户的</message><!-- 消息前缀 -->  
    15.         </field-validator>  
    16.     </field>  
    17. </validators></span>  

    UserAction-user_registe-validation.xml
    1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE validators PUBLIC   
    3.     "-//OpenSymphony Group//XWork Validator 1.0.2//EN"   
    4.     "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  
    5. <validators>  
    6.     <!-- 针对自定义Field使用visitor校验 -->  
    7.     <field name="user">  
    8.         <field-validator type="required" short-circuit="true">  
    9.             <message>用户的信息必填</message><!-- 消息前缀 -->  
    10.         </field-validator>  
    11.         <field-validator type="visitor">  
    12.             <param name="context">userContext</param><!-- 指定本visitor校验的上下文 -->  
    13.             <param name="appendPrefix">true</param><!-- 是否要添加校验失败消息的前缀 -->  
    14.             <message>用户的</message><!-- 消息前缀 -->  
    15.         </field-validator>  
    16.     </field>  
    17. </validators></span>  
    第三个示例:注解方式校验器---注册页面
    acc2_registe.jsp
    1. <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
    2. <%@ taglib uri="/struts-tags" prefix="s" %>  
    3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    4. <html>  
    5.   <head>  
    6.     <title>Struts2中基于Annotation配置式的校验器使用示例</title>  
    7.   </head>  
    8.   <body>  
    9. <h3>Annotation配置式校验器---注册页面</h3><hr/>  
    10.   
    11. <div style="color:red"><s:fielderror/></div>  
    12. <form action="acc2_registe.action" method="post">  
    13.     <table>  
    14.         <tr>  
    15.             <td>ID</td>  
    16.             <td><input type="text" name="id" value="${param.id}"/></td>  
    17.         </tr>  
    18.         <tr>  
    19.             <td>登录名</td>  
    20.             <td><input type="text" name="name" value="${param.name}"/></td>  
    21.         </tr>  
    22.         <tr>  
    23.             <td>密码</td>  
    24.             <td><input type="password" name="pwd"/></td>  
    25.         </tr>  
    26.         <tr>  
    27.             <td>重复密码</td>  
    28.             <td><input type="password" name="pwd2"/></td>  
    29.         </tr>  
    30.         <tr>  
    31.             <td>时间</td>  
    32.             <td><input type="text" name="registed_date" value="${param.registed_date}"/></td>  
    33.         </tr>  
    34.         <tr>  
    35.             <td>email</td>  
    36.             <td><input type="text" name="email" value="${param.email}"/></td>  
    37.         </tr>  
    38.         <tr>  
    39.             <td>考试成绩</td>  
    40.             <td><input type="text" name="score" value="${param.score}"/></td>  
    41.         </tr>  
    42.         <tr>  
    43.             <td colspan="2"><input type="submit" value=" 提交 "/></td>  
    44.         </tr>  
    45.     </table>  
    46. </form>  
    47.   </body>  
    48. </html></span>  

    src/struts.xml

    1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8" ?>  
    2. <!DOCTYPE struts PUBLIC  
    3.     "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"  
    4.     "http://struts.apache.org/dtds/struts-2.1.7.dtd">  
    5.   
    6. <struts>  
    7.     <!-- 请求参数的编码方式 -->  
    8.     <constant name="struts.i18n.encoding" value="UTF-8"/>  
    9.     <!-- 指定被struts2处理的请求后缀类型。多个用逗号隔开 -->  
    10.     <constant name="struts.action.extension" value="action,do,go,xkk"/>  
    11.     <!-- 当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开  -->  
    12.     <constant name="struts.configuration.xml.reload" value="true"/>  
    13.     <!-- 是否使用struts的开发模式。开发模式会有更多的调试信息。默认值为false(生产环境下使用),开发阶段最好打开  -->  
    14.     <constant name="struts.devMode" value="false"/>  
    15.     <!-- 设置浏览器是否缓存静态内容。默认值为true(生产环境下使用),开发阶段最好关闭  -->  
    16.     <constant name="struts.serve.static.browserCache" value="false" />  
    17.     <!-- 是否允许在OGNL表达式中调用静态方法,默认值为false -->  
    18.     <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>  
    19.       
    20.     <!-- 指定由spring负责action对象的创建   
    21.     <constant name="struts.objectFactory" value="spring" />  
    22.     -->  
    23.     <!-- 是否开启动态方法调用 -->  
    24.     <constant name="struts.enable.DynamicMethodInvocation" value="false"/>  
    25.       
    26.     <package name="my" extends="struts-default" namespace="/">  
    27.             <action name="acc2_*" class="com.javacrazyer.web.action.Account2Action" method="{1}">  
    28.             <result name="success">/info.jsp</result>  
    29.             <result name="input">/acc2_{1}.jsp</result>  
    30.         </action>  
    31.     </package>  
    32.       
    33. </struts>  
    34. </span>  

    Account2Action.java

    1. <span style="font-size: medium;">package com.javacrazyer.web.action;  
    2.   
    3. import java.util.Date;  
    4.   
    5. import org.apache.struts2.interceptor.validation.SkipValidation;  
    6.   
    7. import com.opensymphony.xwork2.ActionSupport;  
    8. import com.opensymphony.xwork2.validator.annotations.FieldExpressionValidator;  
    9. import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator;  
    10. import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;  
    11. import com.opensymphony.xwork2.validator.annotations.Validations;  
    12. import com.opensymphony.xwork2.validator.annotations.ValidatorType;  
    13.   
    14. /** 
    15.  * 使用注解来配置校验的示例 
    16.  * 
    17.  */  
    18. public class Account2Action extends ActionSupport {  
    19.     private static final long serialVersionUID = -1418893621512812472L;  
    20.     private Integer id;  
    21.     private String name;  
    22.     private String pwd;  
    23.     private String pwd2;  
    24.     private Double score;  
    25.     private Date registed_date;  
    26.     private String email;  
    27.       
    28.       
    29.     @Validations(  
    30.             requiredStrings={@RequiredStringValidator(fieldName="name",message="我的用户名是必须的",shortCircuit=true,trim=true,type=ValidatorType.FIELD),  
    31.                     @RequiredStringValidator(fieldName="pwd",message="我的密码是必须的",shortCircuit=true,trim=true,type=ValidatorType.FIELD)},  
    32.             fieldExpressions={@FieldExpressionValidator(fieldName="pwd", message="两次密码不相同",expression="pwd==pwd2")},  
    33.             regexFields={@RegexFieldValidator(expression="^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-])+((\\.com)|(\\.cn)|(\\.net)|(\\.org)|(\\.info)|(\\.edu)|(\\.mil)|(\\.gov)|(\\.biz)|(\\.ws)|(\\.us)|(\\.tv)|(\\.cc)|(\\.aero)|(\\.arpa)|(\\.coop)|(\\.int)|(\\.jobs)|(\\.museum)|(\\.name)|(\\.pro)|(\\.travel)|(\\.nato)|(\\..{2,3})|(\\..{2,3}\\..{2,3}))$")}  
    34.     )  
    35.     public String registe() throws Exception{  
    36.         System.out.println("registe-------------------");  
    37.         return SUCCESS;  
    38.     }  
    39.       
    40.     @SkipValidation  
    41.     public String login()throws Exception{  
    42.         return SUCCESS;  
    43.     }  
    44.       
    45.     public Integer getId() {  
    46.         return id;  
    47.     }  
    48.     public void setId(Integer id) {  
    49.         this.id = id;  
    50.     }  
    51.     public String getName() {  
    52.         return name;  
    53.     }  
    54.     public void setName(String name) {  
    55.         this.name = name;  
    56.     }  
    57.     public Double getScore() {  
    58.         return score;  
    59.     }  
    60.     public void setScore(Double score) {  
    61.         this.score = score;  
    62.     }  
    63.     public Date getRegisted_date() {  
    64.         return registed_date;  
    65.     }  
    66.     public void setRegisted_date(Date registedDate) {  
    67.         registed_date = registedDate;  
    68.     }  
    69.     public String getEmail() {  
    70.         return email;  
    71.     }  
    72.     public void setEmail(String email) {  
    73.         this.email = email;  
    74.     }  
    75.   
    76.     public String getPwd() {  
    77.         return pwd;  
    78.     }  
    79.   
    80.     public void setPwd(String pwd) {  
    81.         this.pwd = pwd;  
    82.     }  
    83.   
    84.     public String getPwd2() {  
    85.         return pwd2;  
    86.     }  
    87.   
    88.     public void setPwd2(String pwd2) {  
    89.         this.pwd2 = pwd2;  
    90.     }  
    91. }</span> 
      
  92.      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供一个简单的示例,演示如何使用 Struts2 和 Hibernate 框架技术创建登录界面。 首先,您需要创建一个名为“login.jsp”的 JSP 页面,该页面将显示登录表单。在此页面中,您将需要使用 Struts2 标记库创建表单元素,例如文本框、密码框和提交按钮。示例代码如下: ``` <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Login Page</title> </head> <body> <h2>Login Form</h2> <s:form action="loginAction"> <s:textfield name="username" label="Username" /> <s:password name="password" label="Password" /> <s:submit value="Login" /> </s:form> </body> </html> ``` 接下来,您需要创建一个名为“LoginAction.java”的 Struts2 操作类,该类将处理提交的表单数据并验证用户凭据。在此类中,您将需要使用 Hibernate 框架技术从数据库中检索用户信息。示例代码如下: ``` import com.opensymphony.xwork2.ActionSupport; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.query.Query; public class LoginAction extends ActionSupport { private String username; private String password; public String execute() { // Create session factory SessionFactory factory = new Configuration() .configure("hibernate.cfg.xml") .buildSessionFactory(); // Create session Session session = factory.getCurrentSession(); try { // Begin transaction session.beginTransaction(); // Query for user with matching username and password Query<User> query = session.createQuery("from User where username=:u and password=:p", User.class); query.setParameter("u", username); query.setParameter("p", password); User user = query.uniqueResult(); // Commit transaction session.getTransaction().commit(); // Check if user was found if (user != null) { return SUCCESS; } else { return LOGIN; } } catch (Exception e) { e.printStackTrace(); return ERROR; } finally { factory.close(); } } // Getter and setter methods } ``` 在上面的代码中,我们使用 Hibernate 的相关类从数据库中检索具有匹配用户名和密码的用户。如果找到了用户,则返回 Struts2 成功结果代码,否则返回登录结果代码。 最后,您需要在 Struts2 配置文件中定义操作和结果。在此示例中,我们将在“struts.xml”文件中创建以下条目: ``` <action name="loginAction" class="LoginAction"> <result name="success">welcome.jsp</result> <result name="login">login.jsp</result> <result name="error">error.jsp</result> </action> ``` 在上面的代码中,我们定义了一个名为“loginAction”的操作,该操作将调用“LoginAction”类的“execute”方法。我们还定义了三个结果,分别为“success”、“login”和“error”。如果用户成功登录,则返回“welcome.jsp”页面,否则返回“login.jsp”页面。 这就是使用 Struts2 和 Hibernate 框架技术创建登录界面的基本过程。希望这可以帮助您入门!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值