2012-09-05 24 views
0

我是struts2的新手,當我提交表單並使用驗證時,出現錯誤。當我使用收音機,選擇等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) 

回答

2

在我看來,這是第一個也是最常見的問題,通過struts2驗證。

當驗證失敗時,struts2將重定向到您的「輸入」結果(在「struts.xml」中定義),並且它不會執行任何操作方法。如果輸入是一個JSP,它將嘗試呈現該JSP ... 您沒有包括您的JSP,但它可能包含廣播,選擇或其他標籤,希望從您的操作中收到一個集合以初始化它們,但是當驗證失敗他們不會得到任何東西,所以這就是錯誤。

解決方案:在您的操作中需要一些方法來創建您在jsp中始終需要的所需集合或其他參數。你可以在你的action構造函數中做到這一點,即使驗證失敗也會被調用,但這是一個骯髒的解決方案。最好的解決方案是使用Preparable攔截器(包含在Struts2攔截器的DefaultStack中)。 然後,您將有一個將始終被調用的prepare()方法,即使驗證失敗。

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