zoukankan      html  css  js  c++  java
  • Struts2数据验证机制

    1. 手动验证的实现

    只需要在继承ActionSupport类的情况下,直接重写validate()方法即可。使用validate()方法可以对用户请求的多个Action方法进行验证,但其验证的逻辑是相同的。如果在一个Action类中编写了多个请求处理方法,而此Action重写了validate()方法,那么,默认情况下,在执行每个请求方法的过程中,都会经过validate()方法的验证处理。

    2. 验证文件的命名规则

    使用Struts2验证框架,验证文件的名称需要遵循一定的命名规则,其验证文件的名称必须为ActionName-validation.xml或ActionName-AliasName-validation.xml的形式。其中ActionName是Action对象的名称,AliasName为Action配置中的名称,也就是struts.xml配置文件中Action元素对应name属性的名称。

    • 以ActionName-validation.xml方式命名

      在这种命名的方式中,数据的验证会作用于整个Action对象中,并验证Action对象的请求业务处理方法。如果Action对象中只存在单一的处理方法,或在多个请求处理的方法中,验证处理的规则都相同,可以应用此种命名方式。

    • 以ActionName-AliasName-validation.xml方式命名

      与上一种命名方式相比较,以ActionName-AliasName-validation.xml方式命名更加灵活。如果一个Action对象中包含多个请求处理方法,而又没有必要对每一个方法进行验证处理,值需要对Action对象中的特定方法进行处理,就可以使用此种命名方式。

    3. 验证文件的编写风格

    在Struts2框架中使用数据验证框架,其验证文件的编写有两种风格,也就是两种编写方法,分别为字段验证器编写风格与非字段验证器编写风格,它们各有优点。

    4. Struts2高级技术典型应用

    4.1 Struts2标签下的用户注册

    例4.1 通过Struts2框架提供的表单标签编写用户注册表单,将用户的注册信息输出到JSP页面中。

    (1)创建动态的Java Web项目,将Struts2的相关类包添加到项目的classpath,并在web.xml文件中注册Struts2提供的StrutsPrepareAndExecuteFilter过滤器,从而搭建Struts2的开发环境,具体代码如下:

    <?xml version="1.0" encoding="GBK"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>java_struts2</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
      <!-- Struts2过滤器 -->
      <filter>
          <!-- 过滤器名称 -->
          <filter-name>struts2</filter-name>
          <!-- 过滤器类 -->
          <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
      </filter>
      <!-- Struts2过滤器映射 -->
      <filter-mapping>
          <!-- 过滤器名称 -->
          <filter-name>struts2</filter-name>
          <!-- 过滤器映射 -->
          <url-pattern>/*</url-pattern>
      </filter-mapping>
    </web-app>

    (2)创建程序中的主页index.jsp,在主页面中通过Struts2框架提供的表单标签编写用户注册的表单。关键代码如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib uri="/struts-tags" prefix="s" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <h2>用户注册</h2>
        <s:form action="userAction" method="post">
            <s:textfield name="name" label="用户名" required="true" requiredposition="left"></s:textfield>
            <s:password name="password" label="密码" required="true" requiredposition="left"></s:password>
            <s:radio name="sex" list="#{1:'男',0:'女'}" label="性别" required="true" requiredposition="left"></s:radio>
            <s:select list="{'请选择省份','吉林','广东','山东','河南'}" name="province" label="省份"></s:select>
            <s:checkboxlist list="{'足球','羽毛球','乒乓球','篮球'}" name="hobby" label="爱好"></s:checkboxlist>
            <s:textarea name="description" cols="30" rows="5" label="描述"></s:textarea>
            <s:submit value="注册"></s:submit>
            <s:reset value="重置"></s:reset>    
        </s:form>
    </body>
    </html>

     在应用表单时,如果使用Struts2标签生成表单元素,可以用标签中的label属性,来定义表单元素前面的标签文字;如果表单中的元素属于一个必填的元素,那么可以使用required属性进行标记,其标记的效果会在元素的边缘显示一个字符“*”,同时这个字符“*”的位置也可以控制,通过requiredposition设置即可。

    (3)创建用户注册后的返回页面success.jsp,在该页面中,通过Struts2的数据标签将用户注册信息输出到页面中。关键代码如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib uri="/struts-tags" prefix="s" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <div>
            <h2>用户注册信息</h2>
            <ul>
                <li>用户名:<s:property value="name"/></li>
                <li>&nbsp;&nbsp;码:<s:property value="passward"/></li>
                <li>&nbsp;&nbsp;别:<s:if test="sex==0"></s:if><s:else></s:else></li>
                <li>&nbsp;&nbsp;份:<s:property value="province"/></li>
                <li>&nbsp;&nbsp;好:<s:property value="hobby"/></li>
                <li>&nbsp;&nbsp;述:<s:property value="description"/></li>            
            </ul>
        </div>
    </body>
    </html>

    (4)创建名称为UserAction的类,该类继承于ActionSupport类,是一个Action对象,它的作用是对用户注册请求以及用户信息编辑请求进行处理。关键代码如下:

    package com.cn.action;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class UserAction1 extends ActionSupport {
        private static final long serialVersionUID = 1L;
        private String name;  //用户名
        private String password; //密码
        private String description; //描述
        private int sex=1;    //性别
        private String province; //省份
        private String[] hobby; //爱好
        public String execute() throws Exception {   //用户注册
            return SUCCESS;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getDescription() {
            return description;
        }
        public void setDescription(String description) {
            this.description = description;
        }
        public int getSex() {
            return sex;
        }
        public void setSex(int sex) {
            this.sex = sex;
        }
        public String getProvince() {
            return province;
        }
        public void setProvince(String province) {
            this.province = province;
        }
        public String[] getHobby() {
            return hobby;
        }
        public void setHobby(String[] hobby) {
            this.hobby = hobby;
        }
        
    }

    (5)创建Struts2框架的配置文件struts.xml,在该文件中配置UserAction对象。关键代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
        <!-- 声明常量(开发模式) -->
        <constant name="struts.devMode" value="true"></constant>
        <!-- 声明常量(在Struts的配置文件修改后,自动加载) -->
        <constant name="struts.configuration.xml.reload" value="true"></constant>
        <!-- 声明包 -->
        <package name="myPackage" extends="struts-default" namespace="/">
            <!-- 定义action -->
            <action name="userAction" class="com.cn.action.UserAction"> 
                <!-- 注册成功的返回页面 -->
                <result>success.jsp</result>
            </action>
        </package>
    </struts>

    示例运行后,用户注册界面如下所示:

    若注册后的页面出现中文乱码,把所有网页的编码方式设为"UTF-8"即可。

    4.2  使用验证框架对数据校验

    例4.2 应用Struts2验证框架对用户登录页面进行输入验证。

    (1)创建动态的Java Web项目,将Struts2的相关类包添加到项目的classpath,并在web.xml文件中注册Struts2提供的StrutsPrepareAndExecuteFilter过滤器,从而搭建Struts2的开发环境,具体代码如下:

    <?xml version="1.0" encoding="GBK"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>java_struts2</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
      <!-- Struts2过滤器 -->
      <filter>
          <!-- 过滤器名称 -->
          <filter-name>struts2</filter-name>
          <!-- 过滤器类 -->
          <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
      </filter>
      <!-- Struts2过滤器映射 -->
      <filter-mapping>
          <!-- 过滤器名称 -->
          <filter-name>struts2</filter-name>
          <!-- 过滤器映射 -->
          <url-pattern>/*</url-pattern>
      </filter-mapping>
    </web-app>

    (2)创建用户登录的Action对象UserAction,并将UserAction配置到struts.xml配置文件中,具体代码如下:

    UserAction.java

    package com.cn.action;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class UserAction2 extends ActionSupport {
        private static final long serialVersionUID = 1L;
        private String username;  //用户名
        private String password;  //密码
        //用户登录
        @Override
        public String execute() throws Exception {
            return SUCCESS;
        }
        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;
        }
        
    }

    在struts.xml中的配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
        <!-- 声明常量(开发模式) -->
        <constant name="struts.devMode" value="true"></constant>
        <!-- 声明常量(在Struts的配置文件修改后,自动加载) -->
        <constant name="struts.configuration.xml.reload" value="true"></constant>
        <!-- 声明包 -->
        <package name="myPackage" extends="struts-default" namespace="/">    
            <!-- 定义action -->
            <action name="userAction" class="com.cn.action.UserAction"> 
                <!-- 用户登录页面 -->
                <result name="input">login.jsp</result>
                <!-- 登录成功的返回页面 -->
                <result>success.jsp</result>
            </action>
        </package>
    </struts>

    在struts.xml中配置文件中,请求处理成功的映射结果是success.jsp页面,验证失败返回用户登录页面login.jsp。

    注意:默认情况下,Struts2的验证框架验证失败后会返回input对应的页面,所以需要指定input值对应的页面。

     (3)创建用户登录页面login.jsp,在该页面中通过Struts2的表单标签创建用户登录表单。关键代码如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib uri="/struts-tags" prefix="s" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <s:form action="userAction" method="post">
            <s:textfield name="username" label="用户名" required="true"></s:textfield>
            <s:password name="password" label="密码" required="true"></s:password>
            <s:submit key="submit" value="登录"></s:submit>
        </s:form>
    </body>
    </html>

    (4)创建名称为success.jsp的JSP页面,该页面是用户成功登录的返回页面。关键代码如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib uri="/struts-tags" prefix="s" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <h2>
            <s:property value="username"/>,登录成功!
        </h2>
    </body>
    </html>

    (5)编写用户登录的验证文件,该文件的名称为UserAction-validation.xml。关键代码如下:

    <?xml version="1.0" encoding="GBK"?>
    <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" 
      "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
    
    <validators>
     <field name="username">
      <field-validator type="requiredstring">
       <message>用户名不能为空</message>
      </field-validator>
     </field>
     <field name="password">
      <field-validator type="requiredstring">
       <message>密码不能为空</message>
      </field-validator>
      <field-validator type="stringlength">
       <param name="maxLength">10</param>
       <param name="minLength">5</param>
       <message>密码长度应该在${minLength}--${maxLength}位之间</message>
      </field-validator>
     </field>
    </validators>

    注意:验证文件UserAction-validation.xml必须放置在UserAction所在的包中。

     运行程序后,进入到用户登录页面login.jsp,如下所示:

    如果没有输入用户名、密码的情况下,单击”登录“按钮,页面会停留在login.jsp页面中,如下所示:

    如果密码输入的长度不对,页面显示如下内容:

  • 相关阅读:
    渣渣菜鸡的蚂蚁金服面试经历(一)
    20 个案例教你在 Java 8 中如何处理日期和时间?
    Spring Boot 2.0系列文章(七):SpringApplication 深入探索
    分布式锁看这篇就够了
    Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览
    20135337朱荟潼——实验三
    20135337朱荟潼Java实验报告二
    5337朱荟潼Java实验报告一
    Linux内核设计笔记12——内存管理
    Linux内核设计笔记11——定时器
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4467969.html
Copyright © 2011-2022 走看看