2012-04-01 67 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