2012-04-01 68 views
1

問題:如何驗證數組的元素?Struts2數組驗證

我想寫一個簡單的應用程序,要求用戶使用struts2輸入10個數字。

enter.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
pageEncoding="ISO-8859-1"%> 
<%@ taglib prefix="s" uri="/struts-tags" %>  

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Enter 10 numbers!</title> 
</head> 
<body> 
<h3>Please enter 10 numbers</h3> 
<s:form action="next.action" method="post" validate="true"> 
    <s:iterator var="i" begin="0" end="9"> 
     <s:label value="Number %{#i+1}"/> 
     <s:textfield name="number" key="label.number" size="20"/> 
    </s:iterator> 
    <s:submit method="execute" key="label.next" align="center" /> 
</s:form> 
</body> 
</html> 

我使用的迭代器,以產生10 textarea的用於用戶輸入的數字。我希望所有的領域都是必需的。

NextAction.java

import com.opensymphony.xwork2.ActionSupport; 
import java.util.ArrayList; 

public class NextAction extends ActionSupport{ 



    private Integer[] number; 

    public Integer[] getNumber() { 
     return number; 
    } 
    public void setNumber(Integer[] number) { 
     this.number = number; 
    } 


    public String execute(){ 
     return "success"; 
    } 

} 

唯一的這個類屬性是數。請注意,因爲我生成了10個具有相同名稱「number」的textarea,所以我將在該類中獲得的「number」將是一個長度爲10的Integer數組。當我不使用下面的驗證時,我可以輕鬆地獲得輸入用戶輸入的數字(即數字[i]),並將它們顯示在另一個jsp中。

的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>Number</display-name> 
    <welcome-file-list> 
    <welcome-file>enter.jsp</welcome-file> 
    </welcome-file-list> 

    <filter> 
    <filter-name>struts2</filter-name> 
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 
    </filter> 

    <filter-mapping> 
    <filter-name>struts2</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 

</web-app> 

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.custom.i18n.resources" value="ApplicationResources" /> 

    <package name="default" extends="struts-default" namespace="/"> 
     <action name="forward" class="NextAction"> 
      <result name="success">success.jsp</result> 
      result name="input">enter.jsp</result> 

     </action> 
    </package> 
</struts> 

個動作-validation.xml中

<?xml version="1.0" encoding="UTF-8"?> 

<!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="number"> <!-- The field 'number' here is actually holding an array --> 
    <field-validator type="required"> 
     <message key="errors.required"/> 
    </field-validator> 
    <field-validator type="int"> 
     <param name="min">1</param> 
    <param name="max">100</param> 
     <message key="errors.number"/> 
    </field-validator> 
</field> 

</validators> 

但是,當我因爲字段「number」是數組,所以這個驗證將不起作用(如果只有一個名爲'number'的textarea,這個驗證就沒有問題。但我們有10)

我的問題是如何驗證數組中的每個元素,我們從提交的表單中獲取?希望我的問題很明確。

謝謝

回答

3

這是不可能的,你要重用這個驗證,因此就使用操作中驗證:

import com.opensymphony.xwork2.ActionSupport; 
import java.util.ArrayList; 

public class NextAction extends ActionSupport{ 
    private Integer[] number; 

    public Integer[] getNumber() { 
     return number; 
    } 
    public void setNumber(Integer[] number) { 
     this.number = number; 
    } 
    //Following is default behaviour so it is not worth writing 
    //public String execute(){ 
    // return "success"; 
    //} 

    //add validation in action (_not tested_) 
    public void validate(){ 
     if (number.length > 10){ 
      this.addActionError("Error: More than ten numbers supplied."); 
     }else if (number.length < 10){ 
      this.addActionError("Error: Less than ten numbers supplied."); 
     } 
     for (int i = 0; i < number.length; i++){ 
      if(number[i] < 0){ 
      this.addActionError("Error: Number " + (i + 1) + " is less than zero."); 
      }else if(number[i] > 100){ 
      this.addActionError("Error: Number " + (i + 1) + " is greater than 100."); 
      } 
     } 
    } 
} 

然後在JSP與<s:actionerror />顯示字段錯誤或重寫上面以專門命名帶有索引的字段(在這種情況下,您可以使用它),並使用addFieldError方法。有關這些標籤的詳細信息,請參見http://struts.apache.org/2.3.1.2/docs/tag-reference.html

+0

謝謝您的回覆。如果用戶輸入一些字符串而不是數字會發生什麼。 @Quaternion – shane716 2012-04-02 04:07:04

+0

我不知道......類型轉換將無法設置值,我不知道數組大小是如何計算數組下標在名稱中未使用時的計算大小。一個簡單的測試會顯示這一點,但我會把它留到明天,除非別人回來。直覺告訴我在字段名稱中使用數組符號,然後檢查每個元素是否爲空...如果驗證失敗(未輸入整數)。 – Quaternion 2012-04-02 04:39:47