現在,我們將看看如何的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.zaixian.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.zaixian.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。這會給出以下畫面:

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

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

此驗證是如何工作的?
當用戶按下提交按鈕時,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.zaixian.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的校驗.