2010-11-05 3 views
12

В настоящее время я пытаюсь создать html:select тег из перечисления, так что можно было бы установить в конкретном объекте:Как использовать перечисление в Struts HTML: выберите тег

class someClass { 
    SomeEnum someProperties = null; 
    public getSomeProperties() { return someProperties; } 
    public setSomeProperties(SomeEnum e) { someProperties = e; } 

СПЯ с тегами Struts:

<html:select name="someForm" property="someInstance.someProperties" > 
    <html:option value="${someEnum.STANDARD}"><bean:message key="i18nkeystd"/> 
    <html:option value="${someEnum.PREVENTIVE} "><bean:message key="i18nkeyprev"/> 
</html:select> 

Но в настоящее время я получаю исключение «Не могу вызвать someClass.setProperties - несоответствие типа аргумента».

Есть ли способ использовать перечисление в теге выбора Struts.

ответ

9

Основа Struts 1 не будет работать должным образом с функциями Java 5, поскольку она также предназначена для работы с JDK 1.4.

Последний стабильный выпуск Struts 1.3.10. prerequisites для Struts 1.3.10 включает Java Development Kit версии 1.4 или новее. Если он работает на JDK 1.4, это означает, что он не использует функции Java 5, который включает перечисления.

Вы можете использовать перечисления в своем собственном коде, если используете хотя бы JDK 1.5 (это нормально), Struts также будет работать на JDK 1.5 (так как Sun очень старался сделать их обратно совместимыми), но сама фреймворк не знает о новых функциях, добавленных в язык. Поэтому для автоматических операций, таких как параметры запроса сопоставления к свойствам ActionForm, он не даст правильного результата.

7

Я знаю, что это старый вопрос, но у меня была такая же проблема, и я подумал, что опубликую обходное решение, которое я использовал.

В принципе, я объявляю свойство как строку и использую Enum.valueOf() для перевода.

Вот мой ActionForm класс:

package example; 

import javax.servlet.ServletRequest; 
import javax.servlet.http.HttpServletRequest; 

import org.apache.struts.action.ActionErrors; 
import org.apache.struts.action.ActionForm; 
import org.apache.struts.action.ActionMapping; 
import org.apache.struts.action.ActionMessage; 

public class SearchByForm extends ActionForm{ 

    private static final long serialVersionUID = 5609098522501926807L; 

    private String selectedOption; 

    public enum SearchByOptions{ 
     NONE("-- Select One --"), 
     OPTION1("Option 1"), 
     OPTION2("Option 2"), 
     OPTION3("Option 3"), 
     OPTION4("Option 4"), 
     OPTION5("Option 5"); 

     private String displayText; 

     private SearchByOptions(String displayText){ 
      this.displayText = displayText; 
     } 

     public String getDisplayText(){ 
      return this.displayText; 
     } 
    } 

    /** 
    * @param selectedOption the selectedOption to set 
    */ 
    public void setSelectedOption(String selectedOption) { 
     this.selectedOption = selectedOption; 
    } 

    /** 
    * @return the selectedOption 
    */ 
    public String getSelectedOption() { 
     return selectedOption; 
    } 

    public void reset(ActionMapping mapping, ServletRequest request) 
    { 
     setSelectedOption(SearchByOptions.NONE.toString()); 
    } 

    @Override 
    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { 

     ActionErrors errors = new ActionErrors(); 

     if(SearchByOptions.valueOf(getSelectedOption()) == SearchByOptions.NONE) 
     { 
      errors.add("selectedOption", new ActionMessage("error.common.html.select.required")); 
     } 

     return errors; 
    } 
} 

А вот JSP:

<html> 
    <body> 
     <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
     <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> 

     <% 
      pageContext.setAttribute("searchByOptions", example.SearchByForm.SearchByOptions.values()); 
     %> 

     <div class="searchByInput"> 
      <html:form action="submitSearchBy"> 
       <html:select property="selectedOption"> 
        <c:forEach var="searchByOption" items="${searchByOptions}"> 
         <jsp:useBean id="searchByOption" type="example.SearchByForm.SearchByOptions"/> 
         <html:option value="${searchByOption}"><%= searchByOption.getDisplayText()%></html:option> 
        </c:forEach> 
       </html:select> 
       <html:submit/> 
      </html:form> 
     </div> 
    </body> 
</html> 

И, наконец, Действие:

package example; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.struts.action.Action; 
import org.apache.struts.action.ActionForm; 
import org.apache.struts.action.ActionForward; 
import org.apache.struts.action.ActionMapping; 

public class SubmitSearchByAction extends Action{ 

    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response) throws Exception { 
     ActionForward forwardAction; 

     SearchByForm searchForm = (SearchByForm)form; 

     switch(SearchByOptions.valueOf(searchForm.getSelectedOption())){ 
      case OPTION1: 
       forwardAction = mapping.findForward(SearchByOptions.OPTION1.toString()); 
       break; 
      case OPTION2: 
       forwardAction = mapping.findForward(SearchByOptions.OPTION2.toString()); 
       break; 
      case OPTION3: 
       forwardAction = mapping.findForward(SearchByOptions.OPTION3.toString()); 
       break; 
      case OPTION4: 
       forwardAction = mapping.findForward(SearchByOptions.OPTION4.toString()); 
       break; 
      case OPTION5: 
       forwardAction = mapping.findForward(SearchByOptions.OPTION5.toString()); 
       break; 
     } 
     return forwardAction; 
    } 
} 
Смежные вопросы