現在,我們將研究如何Struts的驗證框架。在Struts的核心,我們的驗證框架,用於幫助應用運行規則的操作方法執行之前執行驗證。
客戶端驗證通常是使用JavaScript來實現。但是人們不應該依賴客戶端的驗證孤單。最佳實踐表明,在所有的應用程序框架,應該引入驗證。現在讓我們來看看兩種方式添加驗證我們的Struts項目。
在這裡,我們將采取一個例子,雇員的姓名和年齡將被捕獲使用一個簡單的頁麵,我們把兩個驗證,以確保總是進入一個姓名和年齡應在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打印一個提交按鈕。我們使用的標簽屬性標簽,每個標簽每個標簽創建。
我們將使用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類,否則您的驗證方法將不被執行。
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"); } } }
正如在上麵的例子中,所示的驗證方法檢查是否'Name'字段具有一個值,或不是。如果未指定值,“Name”字段中添加一個字段錯誤自定義錯誤消息。其次,我們檢查的“Age”字段輸入的值是在28和65之間與否,如果這種狀況不符合我們添加一個驗證字段上麵的錯誤。
最後,讓我們把一切融合在一起使用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文件中的內容:
<?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>
現在,右鍵點擊項目名稱,並單擊“導出”> WAR文件創建一個WAR文件。然後,這WAR部署在Tomcat的webapps目錄下。最後,啟動Tomcat服務器,並嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp。這會給你以下畫麵:
現在不輸入任何所需的信息,隻需點擊submit按鈕。你會看到下麵的結果:
輸入所需的信息,但From字段輸入了錯誤,讓我們測試名字為 "test" 而年齡為:30, 最後點擊“提交”按鈕。你會看到下麵的結果:
當用戶按下“提交”按鈕,在Struts 2會自動執行的驗證方法,如果任何一個if語句內列出的方法是true,Struts 2中調用它的addFieldError方法。如果有任何錯誤已加入Struts 2中不會進行調用execute方法。而Struts 2框架將返回輸入調用動作的結果。
因此,在驗證失敗時和Struts2返回輸入,Struts 2框架將重新顯示的index.jsp文件。由於我們使用了Struts 2的表單標簽,Struts 2中會自動添加錯誤消息,隻是上麵的形式提交。
這些錯誤消息是我們addFieldError方法調用中指定的。 addFieldError方法有兩個參數。首先是表單字段名的錯誤,第二個是該表單字段上麵顯示的錯誤消息。
addFieldError("name","The name is required");
要處理輸入的返回值,我們需要添加下麵的結果對我們的動作節點在struts.xml中。
<result name="input">/index.jsp</result>
做驗證的第二個方法是通過將一個xml文件下的動作類。基於Struts2的XML驗證的驗證提供了更多的選擇,如電子郵件驗證,驗證整數範圍,形式驗證領域,則表達式驗證,正則表達式驗證,必要的驗證,requiredstring驗證,stringlength驗證等。
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的理想與類文件一起。我們有我們的員工action類中冇有validate()方法如下:
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; } }
剩餘的設置將維持,因為這是我前麵的例子,現在,如果你運行的應用程序,它會產生相同的結果是在我們在先前的例子。
有一個xml文件來存儲配置的優勢可以從應用程序代碼分離的驗證。可以得到一個編寫代碼的開發人員和業務分析師建立驗證XML文件。另一個要注意的是默認情況下可用的驗證類型。有大量的驗證程序默認情況下使用Struts。常見的驗證器包括日期驗證,正則表達式驗證器和字符串長度的驗證。更詳細的請查看下麵的鏈接:Struts - 基於XML驗證器