Struts2 驗證框架

2022-07-08 11:35 更新

這章我們將研究Struts的驗證框架。Struts的核心中的驗證框架,可在執(zhí)行action方法之前,幫助應(yīng)用程序運行規(guī)則執(zhí)行驗證。
客戶端驗證通常使用Javascript實現(xiàn),但是不能僅僅依賴于客戶端驗證。實踐表明,應(yīng)該在應(yīng)用程序框架的所有級別引入驗證。接下來讓我們看一下給Struts項目添加驗證的兩種方法。
我們舉一個Employee的例子,employee的名字和年齡將使用一個簡單的頁面捕獲,我們會進行兩次驗證,以確保用戶始終輸入一個名稱,并且年齡是在28和65之間。那么讓我們先從示例的JSP主頁面開始。

創(chuàng)建主頁

我們接下來編寫用于收集employee的相關(guān)信息的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標簽,目前我們還沒有學習到,不過會在標簽相關(guān)的章節(jié)中學習它們。現(xiàn)在,假設(shè)s:textfield標簽印出一個輸入框,并且s:submit印出一個提交按鈕。我們?yōu)槊總€標簽使用了label屬性,即為每個標簽創(chuàng)建label。

創(chuàng)建視圖

我們將使用在action返回SUCCESS的情況下調(diào)用的JSP文件success.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>Success</title>
</head>
<body>
   Employee Information is captured successfully.
</body>
</html>

創(chuàng)建Action

那么,讓我們定義一個小的action類:Employee,然后添加一個名為validate()的方法,如下Employee.java文件所示。確保action類擴展了ActionSupport類,否則將不會執(zhí)行validate方法。

package cn.w3cschool.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”字段添加一個字段“錯誤”,并顯示自定義的錯誤消息。其次,檢查“年齡”字段的輸入值是否在28和65之間,如果不符合這個條件,我們在驗證字段之上添加一個錯誤。

配置文件

最后,讓我們使用struts.xml配置文件將所有內(nèi)容放在一起,如下所示:

<?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="cn.w3cschool.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)在,右鍵單擊項目名稱,然后單擊“Export”> “WAR File”以創(chuàng)建WAR文件。然后在Tomcat的webapps目錄中部署WAR文件。最后,啟動Tomcat服務(wù)器并嘗試訪問URL http://localhost:8080/HelloWorldStruts2/index.jsp,將顯示以下界面:

電子郵件用戶輸入

現(xiàn)在不輸入任何信息,只點擊Submit按鈕,將看到以下結(jié)果:

錯誤

輸入所要求的信息而非錯誤類的字段,如名稱為“text”,年齡為30,然后點擊Submit按鈕,可以看到以下界面:

成功

這個驗證是如何進行的?

當用戶按下提交按鈕時,Struts2 將自動執(zhí)行validate方法,如果方法中列出的任何if語句為真,Struts2 將調(diào)用addFieldError方法。如果添加了任何錯誤信息,Struts2 將不會調(diào)用execute方法。否則,Struts2 框架將返回input作為調(diào)用操作的結(jié)果。
因此,當驗證失敗并且Struts2 返回input時,Struts2 框架將重新顯示index.jsp文件。由于我們使用Struts2 的form標簽,Struts2 會自動在form字段上方添加錯誤信息。
這些錯誤信息是我們在addFieldError方法調(diào)用中指定的信息。addFieldError方法接受兩個參數(shù),第一個是出錯時應(yīng)用的form字段名稱,第二個是在form字段上方顯示的錯誤信息。

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

要處理input的返回值,我們需要將以下結(jié)果添加到struts.xml中的action節(jié)點。

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

XML驗證

第二種進行驗證的方法是在action類旁邊放置一個xml文件。Struts2 基于XML的驗證提供了更多的驗證方式,如email驗證、integer range驗證、form驗證、expression驗證、regex驗證、required驗證、requiredstring驗證、stringlength驗證等。
xml文件需要命名為'[action-class]'-validation.xml。因此,在我們的示例中,創(chuàng)建了一個名為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 action類:

package cn.w3cschool.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è)置將保持,如同前面的例子一樣?,F(xiàn)在如果你運行應(yīng)用程序,它將產(chǎn)生與我們前面例子相同的結(jié)果。

使用xml文件來存儲配置的優(yōu)點是允許驗證與應(yīng)用程序代碼分離。你可以讓開發(fā)人員編寫代碼,讓測試人員來創(chuàng)建xml驗證文件。另一個需要注意的是默認情況下可用的驗證器。Struts有許多默認的驗證器,常見的包括:Date驗證器,Regex驗證器和String Length驗證器。點擊以下鏈接可以了解更多“Struts2-XML驗證器”的詳細信息。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號