歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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頁面中,如下所示:

如果密碼輸入的長度不對,頁面顯示如下內容:

推薦閱讀:

Struts中異步傳送XML和JSON類型的數據 http://www.linuxidc.com/Linux/2013-08/88247.htm

Struts2的入門實例 http://www.linuxidc.com/Linux/2013-05/84618.htm

Struts2學習筆記-Value Stack(值棧)和OGNL表達式  http://www.linuxidc.com/Linux/2015-07/120529.htm 

struts2文件上傳(保存為BLOB格式) http://www.linuxidc.com/Linux/2014-06/102905.htm

Struts2的入門實例 http://www.linuxidc.com/Linux/2013-05/84618.htm

Struts2實現ModelDriven接口 http://www.linuxidc.com/Linux/2014-04/99466.htm

遇到的Struts2文件下載亂碼問題 http://www.linuxidc.com/Linux/2014-03/98990.htm

Struts2整合Spring方法及原理 http://www.linuxidc.com/Linux/2013-12/93692.htm

Struts2 注解模式的幾個知識點 http://www.linuxidc.com/Linux/2013-06/85830.htm

Struts 的詳細介紹:請點這裡
Struts 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved