Struts2 驗(yàn)證框架

2022-07-08 11:35 更新

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

創(chuàng)建主頁(yè)

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

那么,讓我們定義一個(gè)小的action類:Employee,然后添加一個(gè)名為validate()的方法,如下Employee.java文件所示。確保action類擴(kuò)展了ActionSupport類,否則將不會(huì)執(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");
      }
   }
}

如上例所示,驗(yàn)證方法首先檢查“Name”字段是否具有值。如果沒有任何值,則會(huì)為“Name”字段添加一個(gè)字段“錯(cuò)誤”,并顯示自定義的錯(cuò)誤消息。其次,檢查“年齡”字段的輸入值是否在28和65之間,如果不符合這個(gè)條件,我們?cè)隍?yàn)證字段之上添加一個(gè)錯(cuò)誤。

配置文件

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

電子郵件用戶輸入

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

錯(cuò)誤

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

成功

這個(gè)驗(yàn)證是如何進(jìn)行的?

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

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

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

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

XML驗(yàn)證

第二種進(jìn)行驗(yàn)證的方法是在action類旁邊放置一個(gè)xml文件。Struts2 基于XML的驗(yàn)證提供了更多的驗(yàn)證方式,如email驗(yàn)證、integer range驗(yàn)證、form驗(yàn)證、expression驗(yàn)證、regex驗(yàn)證、required驗(yàn)證、requiredstring驗(yàn)證、stringlength驗(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 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ùn)行應(yīng)用程序,它將產(chǎn)生與我們前面例子相同的結(jié)果。

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)