0

私はstruts2を初めて使用し、フォームを送信して検証を使用するとエラーが発生します。

私のstruts.xmlを見てください

<action name="alltagpage" class="com.ksh.tags.Initialization">
            <result name="success">/alltagspage.jsp</result>
        </action>
        <action name="submittags" class="com.ksh.tags.TagActionClass">
            <result name="input">/alltagspage.jsp</result>
            <result name="success">/tagsresult.jsp</result>
        </action> 

このalltagpageリクエストを渡すと、「初期化」クラスが初期化され、ラジオボタンのコンテンツが初期化されます。

public class Initialization {

    private List<String> languages;
    private List<KeyValue> genders;

    public Initialization()
    {
        System.out.println("Model COnstructor is called");

        languages = new ArrayList<String>();
        languages.add("English");
        languages.add("Hindi");
        languages.add("Gujarati");

        KeyValue keyValue0 = new KeyValue();
        keyValue0.setKey(0);
        keyValue0.setValue("Male");

        KeyValue keyValue1 = new KeyValue();
        keyValue1.setKey(1);
        keyValue1.setValue("Female");

        KeyValue keyValue2 = new KeyValue();
        keyValue2.setKey(2);
        keyValue2.setValue("Unknown");

        genders = new ArrayList<KeyValue>();
        genders.add(keyValue0);
        genders.add(keyValue1);
        genders.add(keyValue2);
    }
    getters and setters..

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

以下は、フォームを送信するときに呼び出されるクラスです。

public class TagActionClass extends ActionSupport implements ModelDriven<Model> {

    Initialization initialization = new Initialization();
    Model model = new Model();

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

    @Override
    public Model getModel() 
    {
        return model;
    } 


    public void validate()
    {
        System.out.println("Kshitij :"+ getModel().getTextfield());

        System.out.println("Kshitij :"+ getModel().getSelectedlanguage());

        System.out.println("Kshitij :"+ getModel().getSelectedgender());

        if(getModel().getTextfield() == null || getModel().getTextfield().isEmpty())
        {
            addActionError("Text Field is empty");
        }
    }
}

空のユーザー名でフォームを送信すると、次のエラーが発生します。なぜこれが起こっているのか知っています。解決策が必要です。

org.apache.jasper.JasperException: tag 'radio', field 'list', name 'selectedlanguage': The requested list key 'languages' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location]
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:534)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:457)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:159)
    org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
    com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:373)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:277)
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
    com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
4

1 に答える 1

2

私の意見では、これは struts2 検証に関する最初で最も一般的な問題です。

検証が失敗すると、struts2 は「入力」結果 (「struts.xml」で定義) にリダイレクトされ、アクション メソッドは実行されません。入力が JSP の場合、その JSP をレンダリングしようとします... JSP を含めませんでしたが、アクションからコレクションを受け取って初期化することを期待するラジオ、選択、またはその他のタグが含まれている可能性がありますが、検証が失敗すると、それらは何も得られないので、それがエラーです。

解決策: JSP で常に必要なコレクションやその他のパラメーターを作成するメソッドがアクションに必要です。検証に失敗した場合でも呼び出されるアクションコンストラクターでそれを行うことができますが、それは汚い解決策です。適切な解決策は、Preparable インターセプター (Struts2 インターセプターの DefaultStack に含まれています) を使用することです。次に、検証が失敗した場合でも、常に呼び出される prepare() メソッドが作成されます。

http://struts.apache.org/release/2.0.x/docs/prepare-interceptor.html

于 2013-04-10T11:20:20.497 に答える