2013-02-25 16 views
6

Mam problemy z wyświetlaniem listy rozwijanej z odpowiednimi wartościami. Używam znaczników <spring-form:select>, <spring-form:options> i <spring-form:option>, a ja po prostu nie mogę ustawić poprawnych opcji. Poniższy kod powinien zawierać tylko "Opcję 2", "Opcję 7" i "Opcję 8".spring-form: tag opcji z enum

* Uwaga - NIE chcę wyświetlać wszystkich możliwych wartości wyliczenia, ale z jakiegoś powodu Spring wydaje się chcieć wyświetlić je wszystkie. Wygląda na to, że całkowicie ignoruje listę dostarczoną do znacznika <spring-form:options>.

JSP Tagi

<spring-form:select path="selectOptions"> 
    <spring-form:option value="" label="*** Select Option ***" /> 
    <spring-form:options path="${availableOptions}" /> 
</spring-form:select> 

Enum

public enum SelectOptions { 

    // CHECKSTYLE_OFF: LineLength 

    /** 
    * Option 1. 
    */ 
    OPTION_1(1, "Option 1"), 
    /** 
    * Option 2. 
    */ 
    OPTION_2(2, "Option 2"), 
    /** 
    * Option 3. 
    */ 
    OPTION_3(3, "Option 3"), 
    /** 
    * Option 4. 
    */ 
    OPTION_4(4, "Option 4"), 
    /** 
    * Option 5. 
    */ 
    OPTION_5(5, "Option 5"), 
    /** 
    * Option 6. 
    */ 
    OPTION_6(6, "Option 6"), 
    /** 
    * Option 7. 
    */ 
    OPTION_7(7, "Option 7"), 
    /** 
    * Option 8. 
    */ 
    OPTION_8(8, "Option 8"), 
    /** 
    * Option 9. 
    */ 
    OPTION_9(9, "Option 9"), 
    /** 
    * Option 10. 
    */ 
    OPTION_10(10, "Option 10"); 

    private int id; 
    private String description; 

    /** 
    * Constructor. 
    * 
    * @param id the id 
    * @param description the description 
    */ 
    private SelectOptions(final int id, final String description) { 
     this.id = id; 
     this.description = description; 
    } 

    /** 
    * Retrieves the {@link SelectOptions} associated with the passed in id. 
    * 
    * @param id the id associated with the SelectOptions 
    * @return the SelectOptions 
    */ 
    public static SelectOptions getInstance(final int id) { 

     for (final SelectOptions selectOptions : SelectOptions.values()) { 
      if (selectOptions.id == id) { 
       return selectOptions; 
      } 
     } 

     throw new IllegalArgumentException("SelectOptions could not be determined with id [" + id + "]"); 
    } 

    /** 
    * Retrieves the {@link SelectOptions} associated with the passed in description. 
    * 
    * @param description the description associated with the SelectOptions 
    * @return the SelectOptions 
    */ 
    public static SelectOptions getInstance(final String description) { 

     for (final SelectOptions selectOptions : SelectOptions.values()) { 
      if (selectOptions.description == description) { 
       return selectOptions; 
      } 
     } 

     throw new IllegalArgumentException("SelectOptions could not be determined with description [" + description + "]"); 
    } 

    /** 
    * Simple Getter. 
    * 
    * @return the id 
    */ 
    public int getId() { 
     return this.id; 
    } 

    /** 
    * Simple Setter. 
    * 
    * @param id the id to set 
    */ 
    public void setId(final int id) { 
     this.id = id; 
    } 

    /** 
    * Simple Getter. 
    * 
    * @return the description 
    */ 
    public String getDescription() { 
     return this.description; 
    } 

    /** 
    * Simple Setter. 
    * 
    * @param description the description to set 
    */ 
    public void setDescription(final String description) { 
     this.description = description; 
    } 
} 

Controller

public class SpringController implements SpringControllerInterface { 

    /** 
    * /WEB-INF/jsp/myJSP.jsp. 
    */ 
    private static final String PAGE = "/WEB-INF/jsp/myJSP.jsp"; 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public ModelAndView load(final Model model) { 

     final ModelAndView mav = new ModelAndView(PAGE); 

     final List<SelectOptions> availableOptions = this.getAvailableOptions(); 

     mav.addObject("availableOptions", availableOptions); 

     return mav; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public ModelAndView save(final Model model) { 

     final ModelAndView mav = new ModelAndView(PAGE); 

     // TODO 

     return mav; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    @Override 
    public Model getModel() { 
     return new ModelImpl(); 
    } 

    /** 
    * @return a list of available options 
    */ 
    public List<SelectOptions> getAvailableOptions() { 

     final List<SelectOptions> availableOptions = Lists.newArrayList(); 

     availableOptions.add(SelectOptions.OPTION_1); 
     availableOptions.add(SelectOptions.OPTION_7); 
     availableOptions.add(SelectOptions.OPTION_8); 

     return availableOptions; 
    } 
    } 

model

public class ModelImpl implements Model { 

    private SelectOptions selectOptions; 

    /** 
    * Simple Getter. 
    * 
    * @return the selectOptions 
    */ 
    @Override 
    public SelectOptions getSelectOptions() { 
     return this.selectOptions; 
    } 

    /** 
    * Simple Setter. 
    * 
    * @param selectOptions the selectOptions to set 
    */ 
    @Override 
    public void setSelectOptions(final SelectOptions selectOptions) { 
     this.selectOptions = selectOptions; 
    } 


} 
+0

btw, mogę używać HTML tagi i C, aby utworzyć listę -ale Chciałbym, aby móc właściwie użyć tagi sprężynujące odpowiednio. Jestem pewien, że po prostu tęskniłem za czymś głupim. – Mostfoolish

+0

Zakładam, że sprawdziłeś powrót getAvailableOptions(), aby upewnić się, że lista dostępnych opcji jest poprawna? Czy możesz podać ten kod, a być może także HTML, który skończy się po tym, jak wszystko zostanie wyrenderowane w przeglądarce? – CodeChimp

+0

Dostępne opcje to lista, którą po prostu utworzyłem w kontrolerze. I tak, potwierdziłem, że ma 3 opcje, których się spodziewałem. – Mostfoolish

Odpowiedz

3

Wygląda na to, że rozwiązaniem tego problemu było użycie atrybutu "ścieżka" w tagu <spring-form:options>. Powinno to być "przedmioty", a nie "ścieżka".

skorygowany JSP fragment:

<spring-form:select path="selectOptions"> 
    <spring-form:option value="" label="*** Select Option ***" /> 
    <spring-form:options items="${availableOptions}" /> 
</spring-form:select> 
0

Nie musisz nawet używać atrybutu items, jeśli używasz tagu <spring-form:options>.
Znacznik opcji:
Renderuje listę znaczników "opcji" HTML. Ustawia "wybrane" odpowiednio na podstawie wartości powiązanej.
Referencje Spring form tld. Tak więc dla twojej potrzeby domyślam się, że powrót do JSTL core z <spring-form:option/> wystarczy.

+1

W ten sposób wyświetlana jest każda wartość w Enum - co NIE jest tym, co chcę zrobić. – Mostfoolish

11

Jeśli utworzono kontroler sprężyny i chcesz przekazać enum do strony JSP, można to zrobić tak: przykład

ENUM:

public enum Coin { 

    HEADS("Heads", "heads"), 
    TAILS("Tails", "tails"); 

    private final String fullName; 
    private final String shortName; 

    private Coin(String fullName, String shortName) { 
     this.fullName = fullName; 
     this.shortName = shortName; 
    } 

    public String getFullName() { 
     return fullName; 
    } 

    public String getShortName() { 
     return shortName; 
    } 

} 

Przechodząc ten enum do modelu:

model.addObject("coins", Coin.values()); 

Używanie go na swojej stronie jsp z formularza:

<form:select path="selection"> 
    <form:options items="${coins}" itemValue="shortName" itemLabel="fullName" /> 
</form:select>