鍍金池/ 教程/ Java/ 驗(yàn)證
注釋
主題/模板
驗(yàn)證
有用的資源
Struts 2 注解類型
實(shí)例
攔截器
異常處理
表單標(biāo)簽
結(jié)果類型
值棧/OGNL
Spring 集成
數(shù)據(jù)標(biāo)簽
環(huán)境配置
配置
類型轉(zhuǎn)換
動作
Hibernate 集成
本地化
發(fā)送郵件
Ajax 標(biāo)簽
數(shù)據(jù)庫訪問
體系結(jié)構(gòu)
文件上傳
Tiles 集成
概述
基本的 MVC 架構(gòu)
控制標(biāo)簽

驗(yàn)證

現(xiàn)在我們將觀察 Struts 驗(yàn)證框架如何。在 Struts 的核心中,我們有驗(yàn)證框架,它能在動作方法執(zhí)行之前協(xié)助應(yīng)用程序運(yùn)行規(guī)則來執(zhí)行驗(yàn)證。

客戶端驗(yàn)證通常是使用 Javascript 來實(shí)現(xiàn)的。但是不應(yīng)該單獨(dú)依賴于客戶端驗(yàn)證。最佳的實(shí)踐建議驗(yàn)證應(yīng)該引入到應(yīng)用程序框架的各個(gè)層中?,F(xiàn)在,讓我們來看看兩種在我們的 Struts 項(xiàng)目中添加驗(yàn)證的方式。

這里我們將舉一個(gè) Employee 的例子,使用一個(gè)簡單的頁面來捕獲它們的姓名和年齡,我們提出兩個(gè)驗(yàn)證用來確??偸禽斎胍粋€(gè)名字而且年齡應(yīng)該是在 28 和 65 之間。所以,讓我們從例子的主 JSP 頁面開始。

創(chuàng)建主頁面

讓我們編寫主頁面 JSP 文件 index.jsp,它將被用來收集 Employee 上面提到的相關(guān)信息。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
   pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Employee Form</title>
</head>

<body>
   <s:form action="empinfo" method="post">
      <s:textfield name="name" label="Name" size="20" />
      <s:textfield name="age" label="Age" size="20" />
      <s:submit name="submit" label="Submit" align="center" />
   </s:form>
</body>
</html>

index.jsp 使用我們還沒有涉及的 Struts 的標(biāo)簽,但是我們將在標(biāo)簽相關(guān)的章節(jié)學(xué)習(xí)它們。此時(shí)此刻,假設(shè) s:textfield 標(biāo)簽打印一個(gè)輸入字段,s:submit 打印一個(gè)提交按鈕。我們已經(jīng)為每個(gè)標(biāo)簽使用 label 屬性,而且每個(gè)標(biāo)簽都建立了 label。

創(chuàng)建視圖

我們將使用 JSP 文件 success.jsp,假如動作返回 SUCCESS,該文件將被調(diào)用。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Success</title>
</head>
<body>
   Employee Information is captured successfully.
</body>
</html>

創(chuàng)建動作

因此讓我們定義一個(gè)小的動作類 Employee,然后如下所示在 Employee.java 文件中添加一個(gè)方法,稱為 validate()。確保你的動作類擴(kuò)展了 ActionSupport 類,否則你的 validate 方法將不會被執(zhí)行。

package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Employee extends ActionSupport{
   private String name;
   private int age;  
   public String execute() 
   {
       return SUCCESS;
   }
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
   public int getAge() {
       return age;
   }
   public void setAge(int age) {
       this.age = age;
   }
   public void validate()
   {
      if (name == null || name.trim().equals(""))
      {
         addFieldError("name","The name is required");
      }
      if (age < 28 || age > 65)
      {
         addFieldError("age","Age must be in between 28 and 65");
      }
   }
}

如在上面的例子所示,驗(yàn)證方法檢查 “Name” 字段是否有一個(gè)值。如果沒有值被提供,我們?yōu)?“Name” 字段添加一個(gè)帶有自定義錯誤信息的字段錯誤。其次,我們檢查 “Age” 字段的輸入值是否在 28 和 65 之間,如果這個(gè)條件不符合,我們添加一個(gè)上述驗(yàn)證字段錯誤。

配置文件

最后,讓我們使用 struts.xml 配置文件把一切都綜合起來,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
   <constant name="struts.devMode" value="true" />
   <package name="helloworld" extends="struts-default">
      <action name="empinfo" 
         class="com.tutorialspoint.struts2.Employee"
         method="execute">
         <result name="input">/index.jsp</result>
         <result name="success">/success.jsp</result>
      </action>
   </package>
</struts>

下面是 web.xml 文件的內(nèi)容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   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>Struts 2</display-name>
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>
   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

現(xiàn)在,右鍵點(diǎn)擊項(xiàng)目名稱,并單擊 Export > WAR File 創(chuàng)建一個(gè) WAR 文件。然后在 Tomcat 的 webapps 目錄下部署此 WAR 。最后,啟動 Tomcat 服務(wù)器和嘗試訪問 URL http://localhost:8080/HelloWorldStruts2/index.jsp. 這會給出以下畫面:

http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts12.jpg" alt="" />

現(xiàn)在不輸入任何必需的信息,只需要單擊 Submit 按鈕。你將看到下面的結(jié)果:

http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts121.jpg" alt="" />

輸入必需的信息,但是輸入了錯誤的 From 字段,假如說 name 為 “test” 和年齡為 30,最后單擊 Submit 按鈕。你將看到下面的結(jié)果:

http://wiki.jikexueyuan.com/project/struts-2/images/helloworldstruts122.jpg" alt="" />

驗(yàn)證是如何工作的?

當(dāng)用戶按下提交按鈕時(shí),Struts2 會自動執(zhí)行驗(yàn)證方法,如果任何列出的 if 語句內(nèi)部的方法都是 true,那么 Struts 2 調(diào)用它的 addFieldError 方法。如果已添加任何錯誤,那么 Struts 2 將不會繼續(xù)調(diào)用 execute 方法。而 Struts 2 框架將返回輸入作為調(diào)用這個(gè)行動的結(jié)果。

所以當(dāng)驗(yàn)證失敗和 Struts2 返回輸入時(shí),Struts 2 框架將重新顯示 index.jsp 文件。由于我們使用了 Struts 2 的表單標(biāo)簽,Struts2 將會自動添加只是上述表單字段的錯誤信息。

這些錯誤信息是我們在 addFieldError 方法調(diào)用中指定的。addFieldError 方法有兩個(gè)參數(shù)。第一個(gè)參數(shù)是錯誤應(yīng)用的表單字段名,第二個(gè)參數(shù)是顯示上述表單字段的錯誤信息。

addFieldError("name","The name is required");

為了處理輸入的返回值,我們需要在 struts.xml 添加下面的結(jié)果到我們的動作節(jié)點(diǎn)。

<result name="input">/index.jsp</result>

基于XML的驗(yàn)證

驗(yàn)證的第二個(gè)方法是通過把一個(gè) xml 文件緊挨著動作類放置。Struts2 基于 XML 驗(yàn)證提供了更多的驗(yàn)證選擇,如電子郵件驗(yàn)證,整數(shù)范圍驗(yàn)證,表單驗(yàn)證字段,表達(dá)式驗(yàn)證,正則表達(dá)式驗(yàn)證,請求驗(yàn)證,請求字符串驗(yàn)證,字符串長度的驗(yàn)證,等等。

XML 文件需要被命名為 '[action-class]'-validation.xml。所以,在我們的例子中,我們創(chuàng)建一個(gè)文件,名為 Employee-validation.xml,它的內(nèi)容如下所示:

<!DOCTYPE validators PUBLIC 
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
   <field name="name">
      <field-validator type="required">
         <message>
            The name is required.
         </message>
      </field-validator>
   </field>
   <field name="age">
     <field-validator type="int">
         <param name="min">29</param>
         <param name="max">64</param>
         <message>
            Age must be in between 28 and 65
         </message>
      </field-validator>
   </field>
</validators>

理想的情況下,上面的 XML 文件會和類文件一起保存在 CLASSPATH 中。讓我們有不包含 validate() 方法的 Employee 動作類,如下所示:

package com.tutorialspoint.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Employee extends ActionSupport{
   private String name;
   private int age;  
   public String execute() 
   {
       return SUCCESS;
   }
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
   public int getAge() {
       return age;
   }
   public void setAge(int age) {
       this.age = age;
   }
}

其余的設(shè)置將保持,因?yàn)樗乔懊娴睦樱F(xiàn)在如果你運(yùn)行這個(gè)應(yīng)用程序,它將會產(chǎn)生相同的結(jié)果,我們在前面的例子獲得的。

用 xml 文件來存儲配置的優(yōu)點(diǎn)是允許驗(yàn)證從應(yīng)用程序代碼中分離。你可以讓開發(fā)人員編寫代碼和業(yè)務(wù)分析來創(chuàng)建驗(yàn)證 xml 文件。需要注意的另一件事情是默認(rèn)驗(yàn)證類型是可用的。默認(rèn)情況下,有大量使用 Struts 的驗(yàn)證器。常見的驗(yàn)證器包括日期驗(yàn)證器,正則表達(dá)式驗(yàn)證器和字符串長度驗(yàn)證器。