2012-04-01 22 views
1

質問:配列の要素を検証する方法は?Struts2配列の検証

struts2を使用して10個の数字を入力するように求める簡単なアプリケーションを作成したいと考えています。ユーザーが番号を入力するため

<%@ 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> 

enter.jspは、私が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"; 
    } 

} 

このクラスが持つ唯一のプロパティは数値です。私が同じ名前の "text"という名前のテキストエリアを生成したので、このクラスで取得する "数字"は、長さが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> 

しかし、ときに私フィールド "number"が配列であるため、この検証が追加されましたが、この検証は機能しません( 'number'という名前のテキストエリアが1つしかない場合、この検証はうまくいきました)。しかし、我々は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."); 
      } 
     } 
    } 
} 

が続い<s:actionerror />とJSPのフィールドエラーを表示したり、上記を書き換えます場合によってはフィールドを(インデックス付きで)使用することができます。addFieldErrorメソッドを使用します。これらのタグの詳細については、http://struts.apache.org/2.3.1.2/docs/tag-reference.html

+0

をご覧ください。ユーザーが数字の代わりに文字列を入力するとどうなりますか。 @Quaternion – shane716

+0

私は、配列の添え字が名前に使われていないときに、配列のサイズがどのように計算されるのか分かりません。簡単なテストではこれが表示されますが、誰かが戻ってこない限り、明日まで残しておきます。 Intuitionはフィールド名に配列表記法を使用するように指示し、各要素がnullであるかどうかを検証します。その要素に対して検証が失敗した場合(整数が入力されていない場合) – Quaternion