2012-04-01 3 views
1

Вопрос: как проверить элементы массива?Struts2 Проверка для массива

Я хочу написать простое приложение, которое просит пользователя ввести 10 чисел с помощью struts2.

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 для текстовое поле пользователь может ввести число. И я хочу, чтобы все поля были необходимы.

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 textarea с тем же именем «number», «число», которое я получу в этом классе, будет массивом Integer длиной 10. И когда я не использую валидацию ниже, я могу легко получить номера введенного пользователя (т. е. число [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> 

NextAction-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> 

Но когда я добавлено это подтверждение, потому что поле «число» - это массив, тогда эта проверка не будет работать. (если бы было только одно текстовое поле с именем «число», эта проверка была бы прекрасной. Но у нас есть 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

+0

Я не уверен ... преобразование типа не могло установить значения, я не знаю, как вычисляется размер массива, когда индексы массива не используются в имени. Простой тест показал бы это, но я оставлю его до завтра, если кто-то еще не вернется. Интуиция подсказывает мне использовать нотацию массива в именах полей, а затем я проверил бы проверку, если каждый элемент имеет значение null ... если это проверка не выполнена для этого элемента (целое число не было введено). – Quaternion

Смежные вопросы