Struts2 驗證框架


現在,我們將看看如何的Struts驗證框架。在Struts的核心有驗證框架,協助應用程式的執行規則來執行驗證執行之前的操作方法。

通常是使用Javascript來實現用戶端驗證。但不應單獨依賴於用戶端驗證。最佳實踐表明,驗證應引入各級應用程式框架。現在,讓我們來看看兩種方式新增驗證我們的Struts專案。

在這裡,我們將採取一個例子,Employee 將被捕獲的姓名和年齡使用一個簡單的頁面,我們將會把兩個驗證,以確保使用總是進入一個名字和年齡應該是在28和65之間。所以,讓我們先從主JSP頁面的例子。

建立主頁面:

讓我們寫主JSP頁面檔案的index.jsp,這將被用來收集上述員工的相關資訊。

<%@ 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的標籤,我們還沒有涉及,但我們將研究這些標籤相關的章節。但現在,假設 s:textfield 標籤列印一個輸入欄位s:submit列印一個提交按鈕。我們已經使用label屬性標籤,每個標籤每個標籤建立。 

建立檢視:

我們將使用JSP檔案的success.jsp將呼叫的情況下定義的動作返回SUCCESS。

<%@ 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>

建立動作:

因此,讓我們定義一個小小的動作類Employee,然後新增一個方法稱為validate(),如下所示在Employee.java檔案。請確保操作類擴充套件ActionSupport類,否則validate方法將不會被執行。

package com.yiibai.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");
      }
   }
}

如在上面的例子所示,“Name”欄位的驗證方法檢查是否有一個值,或不。如果沒有值已經提供,我們新增一個帶有自定義錯誤訊息“Age”欄位的欄位錯誤。其次,我們檢查,如果輸入的值是在28和65之間或不為“Age”欄位,如果這個條件不符合我們以上驗證欄位新增一個錯誤。

組態檔案:

最後,讓我們把所有東西一起使用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.yiibai.struts2.Employee"
         method="execute">
         <result name="input">/index.jsp</result>
         <result name="success">/success.jsp</result>
      </action>

   </package>

</struts>

以下是web.xml檔案中的內容:

<?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>

現在,右鍵點選專案名稱,並單擊Export > WAR File建立一個WAR檔案。然後部署此WAR在Tomcat的webapps目錄下。最後,啟動Tomcat伺服器和嘗試存取URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給出以下畫面:

Email User Input

現在不輸入任何所需資訊,只需點選“Submit ”按鈕。將看到以下結果:

Error

輸入所需的資訊,但輸入了錯誤的From欄位,讓我們說“test”和年齡為30,最後點選“Submit ”按鈕。將看到以下結果:

Success

此驗證是如何工作的?

當使用者按下提交按鈕時,Struts2會自動執行的驗證方法,如果任何一個if語句裡面的方法列出,Struts 2呼叫addFieldError方法。如果有任何錯誤已加入Struts 2將不會進行呼叫execute方法。而Struts 2框架將返回輸入作為呼叫該行動的結果。

因此,驗證失敗時Struts2返回輸入,Struts 2框架將重新顯示index.jsp檔案。因為我們使用了Struts 2的表單標籤,Struts2中會自動新增錯誤訊息,只是上面的形式提交。

這些錯誤訊息是我們addFieldError方法呼叫中指定的。addFieldError方法有兩個引數。首先是表單欄位名錯誤,第二個是錯誤資訊,上面顯示該表單欄位。

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

要處理的返回值輸入,我們需要新增以下的結果,以我們的動作節點在struts.xml。

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

基於XML的驗證:

在進行驗證的第二個方法是通過將一個xml檔案的動作類。Struts2的基於XML驗證的驗證提供了更多的選擇,如電子郵件驗證,整數範圍驗證,表單驗證欄位,表示式驗證,正規表示式驗證,需要驗證,驗證所需的字串,字串長度的驗證等。

XML檔案需要被命名為'[action-class]'-validation.xml。所以,在我們的例子中,我們建立一個檔案,名為 Employee-validation.xml包含以下內容:

<!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()方法如下:

package com.yiibai.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;
   }
}

其餘的設定將保持,因為它是我前面的例子,現在,如果執行應用程式,它會產生相同的結果是什麼,我們在前面的例子:

xml檔案來儲存組態的優點是允許的驗證從應用程式程式碼的分離。可以讓開發人員編寫的程式碼和業務分析師建立驗證xml檔案。要注意的是另一件事是預設提供的驗證型別。有大量的驗證,預設情況下,使用Struts。常見的驗證包括驗證日期,正規表示式驗證字串長度的驗證。檢查以下連結更多細節 Struts - 基於XML的校驗.