strus2验证框架

为什么要用验证框架?

当验证规划比较复杂时,Action类的代码江边的非常繁琐,假如我们要对电话号码进行验证,是非常麻烦的。

验证框架的优点

Struts2中内置了一个验证框架,将常用的验证规则进行了编码实现,使用验证框架时,用户无需再进行编码,只要在外部配置文件中指定某个字段需要进行的验证类型,并提供出错误信息即可,从而大大减轻了开发者的负担,提高开发效率

接下来我们先看一个案例了解一下

jsp页面(以注册为例)

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>注册页面</title>
    
    

  </head>
  
  <body>
    <h2>用户注册</h2>
    
  
    <s:form action="regist" method="post">
    <s:textfield name="info.username" label="用户名" ></s:textfield>
    <br/>
    
     <s:textfield name="info.phone" label="电话号码"></s:textfield>
    <br/>
    
     <s:textfield name="info.password" label="密码"></s:textfield>
    <br/>
    
     <s:textfield name="okpwd" label="确认密码"></s:textfield>
    <br/>
    
    <s:submit value="注册"></s:submit>
    
    </s:form>
    
    
  </body>
</html>
regist.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>成功页面</title>
    
    

  </head>
  
  <body>
    欢迎您!${info.username }
  </body>
</html>
success.jsp

实体类(UserInfo)

package cn.happy.entity;

public class UserInfo {
    private String username;
    private String password;
    private String phone;
    
    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    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;
    }
}
UserInfo.java

接下来看一下Action包下的类

package cn.happy.action;

import cn.happy.entity.UserInfo;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport{

    private UserInfo info;
    private String okpwd;
    
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
    
    
    
    public UserInfo getInfo() {
        return info;
    }
    public void setInfo(UserInfo info) {
        this.info = info;
    }
    public String getOkpwd() {
        return okpwd;
    }
    public void setOkpwd(String okpwd) {
        this.okpwd = okpwd;
    }
}
UserAction.java
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

        <validators>
        
         <!-- 用户名:不能为空 长度在6-10之间 -->  
         <field name="info.username">
         <field-validator type="requiredstring">
         <param name="trim">true</param>
         <message>用户名不能为空</message>
         </field-validator>
         
         <field-validator type="stringlength">
         <param name="maxLength">10</param>
         <param name="minLength">6</param>
        <message>用户名长度必须在${minLength}和${maxLength}之间</message>
         </field-validator>
         
         </field>
         
        <!-- 验证密码-->
        <field name="info.password">
        <field-validator type="requiredstring">
        <message>密码不能为空</message>
        </field-validator>
        </field>
        
        <!-- 确认密码 -->
        
          <field name="okpwd">
        <field-validator type="fieldexpression">
        <param name="expression">info.password==okpwd</param>
        <message>密码和确认密码必须一致</message>
        </field-validator>
        </field>
        
        <!-- 验证电话号码 -->    
        
        <field name="info.phone">
        <field-validator type="requiredstring">
        <message>电话号码不能为空</message>
        </field-validator>
        </field>
        
          
      <field name="info.phone">
        <field-validator type="regex">
        <param name="regex">^(\d{3,4}-){0,1}(\d{7,8})$</param>
        <message>电话号码格式不正确</message>
        </field-validator>
        </field>
         
         
       
        </validators>
UserAction-validation.xml

常用验证规则:

 

编写配置文件(struts.xml)

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <!-- 修改文件 tomact不用重启 -->
    <constant name="struts.devMode" value="true" />

    <package name="default" namespace="/" extends="struts-default">
    
         <action name="regist" class="cn.happy.action.UserAction">
            <result name="success">success.jsp</result>
            <result name="input">regist.jsp</result>
        </action> 
    </package>
</struts>
struts.xml

jar包

 

实现效果:

 

 实现数据校验的流程

 对输入的数据首先进行类型转换,并封装成Action属性

② 如果类型转换出现错误,就将错误提示保存到ActionContext,并封装到fieldError

③ 类型转换执行完毕后,会根据项目的配置执行验证框架的校验,也可能通过执行validate()或者validateXxx()方法进行校验

④ 如果经过以上步骤都没有出现错误,那么将直接调用Action里用于处理用户请求的方法,然后根据结果类型转入相应的视图资源。一旦出现了错误,那么系统将直接返回输入数据的视图资源,后者通常由workflow拦截器处理

 

 

posted @ 2016-10-12 14:23  白兴强  阅读(322)  评论(0编辑  收藏  举报