2012-05-08 8 views
10

Ich habe versucht, herauszufinden, bevölkert zu finden, wie ein Dropdown-Feld in Spring MVC zu füllen. Es gibt ein paar Threads da draußen zu diesem Thema, aber keiner von denen, die ich gefunden habe, haben mir geholfen, also hoffe ich, dass jemand hier mir helfen kann.Wie Drop-Down-Box in Spring MVC

Hier ist mein Controller:

@Controller 
@RequestMapping("/document-revision") 
public class DocumentRevisionController { 


@Autowired 
private DocumentRevisionService documentRevisionService; 
private DocumentService documentService; 

@RequestMapping(value="/list", method=RequestMethod.GET) 
public String getDocumentRevisionList(Model model) { 
    List<DocumentRevision> documentRevisions = documentRevisionService.retrieveAllDocumentRevisions(); 
    model.addAttribute("documentRevisions", documentRevisions); 

    return "document-revision"; 
} 

@RequestMapping(value="/add", method=RequestMethod.GET) 
public String getDocumentRevision(Model model) { 
    DocumentRevision documentRevision = new DocumentRevision(); 
    model.addAttribute("documentRevisionAttribute", documentRevision); 
    return "new-documnent-revision"; 
} 


@RequestMapping(value="/add", method=RequestMethod.POST) 
public String postDocumentRevision(@ModelAttribute("documentRevisionAttribute") @Valid DocumentRevision documentRevision, BindingResult result) { 

    if(result.hasErrors()){ 
     return "new-document-revision"; 
    } 

    documentRevisionService.createDocumentRevision(documentRevision); 
    return "redirect:/testapp/document-revision/list"; 
} 

} 

und hier ist die jsp Seite:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> 

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>Insert title here</title> 
     <style> 
     .error { color: red; } 
     </style> 
</head> 
<body> 

    <h1>Create New Document Revision</h1> 

    <c:url var="saveUrl" value="/testapp/document-revision/add" /> 
    <form:form modelAttribute="documentRevisionAttribute" method="POST" action="${saveUrl}"> 
     <table> 
      <tr> 
       <td>DocumentNumber</td> 
       <td><form:select path="document_number"> 
        <form:option value="NONE" label="--- Select ---" /> 
        <form:options items="${documentNumberList}" /> 
        </form:select> 
       </td> 
       <td><form:errors path="document_number" cssClass="error" /></td> 
      </tr> 


      <tr> 
       <td><form:label path="documentRState">Document R-State</form:label></td> 
       <td><form:input path="documentRState"/></td> 
       <td><form:errors path="documentRState" cssClass="error"/></td> 
      </tr> 

     </table> 

     <input type="submit" value="Save" /> 
    </form:form> 

</body> 
</html> 

ich versucht habe, eine @ModelAttribute Verfahren das Hinzufügen, die die Belegnummern abruft,

 @ModelAttribute 
    public List<Document> documentNumberList(){ 
     return documentService.retrieveAllDocumentNumbers(); 
    } 

aber es gab mir Fehler. Gibt es jemanden, der weiß, wie es gemacht werden sollte?

Vielen Dank für Ihre Zeit

/D

bearbeiten Ich dachte, ich würde klarstellen, dass mein Wunsch, eine Drop-Down-Box für die Belegnummern haben, die durch das Document abgerufen werden.

Edit 2 Hier ist das Fehlerprotokoll wie gewünscht:

java.lang.NullPointerException 
testapp.controller.DocumentRevisionController.documentNumberList(DocumentRevisionController.java:33) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:601) 
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:212) 
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) 
org.springframework.web.method.annotation.ModelFactory.invokeModelAttributeMethods(ModelFactory.java:123) 
org.springframework.web.method.annotation.ModelFactory.initModel(ModelFactory.java:97) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:614) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 

Lösung Ich dachte, ich würde den kompletten Controller-Code hinzufügen, dass es für den Fall, funktioniert es andere, die davon profitieren könnten:

@Controller 
@RequestMapping("/document-revision") 
public class DocumentRevisionController { 


@Autowired 
private DocumentRevisionService documentRevisionService; 

@Autowired 
    private DocumentService documentService; 

@RequestMapping(value="/list", method=RequestMethod.GET) 
public String getDocumentRevisionList(Model model) { 
    List<DocumentRevision> documentRevisions = documentRevisionService.retrieveAllDocumentRevisions(); 
    model.addAttribute("documentRevisions", documentRevisions); 

    return "document-revision"; 
} 

@RequestMapping(value="/add", method=RequestMethod.GET) 
public String getDocumentRevision(Model model) { 
    DocumentRevision documentRevision = new DocumentRevision(); 
    model.addAttribute("documentRevisionAttribute", documentRevision); 
    model.addAttribute("documentNumberList", documentService.retrieveAllDocumentNumbers()); 

    return "new-documnent-revision"; 
} 


@RequestMapping(value="/add", method=RequestMethod.POST) 
public String postDocumentRevision(@ModelAttribute("documentRevisionAttribute") @Valid DocumentRevision documentRevision, BindingResult result) { 

    if(result.hasErrors()){ 
     return "new-document-revision"; 
    } 

    documentRevisionService.createDocumentRevision(documentRevision); 
    return "redirect:/testapp/document-revision/list"; 
} 

} 
+0

Können Sie das Fehlerprotokoll einfügen? –

Antwort

8

nicht sicher, was Controller-Methode, um Ihre Ansicht aufgerufen wird mit documentNumberList zu zeigen, aber Sie müssen diese Sammlung zum Modell hinzuzufügen weitergegeben th Ansicht ist:

model.addAttribute("documentNumberList", documentService.retrieveAllDocumentNumbers()); 

Obwohl aus dem Ausnahme-Stack-Trace Sie auch eine @Autowired auf documentService Feld verpasst.

+0

Danke, das funktioniert! – dlinx90

8

FYI LabelValue-Klasse ist eine einfache DTO, die wir verwenden, um die Dropdown-Label und Wert Elemente zu tragen. Es wird ein label- und value-Attribut sowie die entsprechenden Getter/Setter haben.

LabelValue.java

private String lable; 
private String value; 

//getters/setters 

---- JSP -----

<tr> 
    <td>DocumentNumber</td> 
    <td><form:select id="docNo" path="document_number"> 
      <form:option value="NONE" label="--- Select ---" /> 
      <form:options items="${numberList}" itemValue="value" itemLabel="lable"/> 
     </form:select> 
    </td> 
    <td><form:errors path="document_number" cssClass="error" /></td> 
</tr> 

hoffe, das hilft ..

+0

Ich mag diese Lösung besser, da Sie nicht immer ein Modell als Parameter Ihrer RequestHandler-Methoden haben/brauchen. +1 dafür. – Mukus

6

ich diese Art von Problem, indem sie mich heute gelöst haben . Dies ist sehr einfach und leicht zu verstehen. In Spring MVC 3.0-Controller nur diesen Code platzieren -

@ModelAttribute("creditCardTypes") 
public Map<String,String> populateCreditCardTypes() { 
     Map<String,String> creditCardTypes = new LinkedHashMap<String,String>(); 
     creditCardTypes.put("VS", "Visa");creditCardTypes.put("MC", "MasterCard"); 
     creditCardTypes.put("AE", "American Express"); 
     creditCardTypes.put("DS", "Discover");creditCardTypes.put("DC", "Diner's Club");     
     return creditCardTypes; 
    } 

Now „creditCardTypes“ -Attribut wird auf der Seite Laden oder Seite Vorlage Umfang verfügbar sein, bedeutet, es wird zur Verfügung, was wäre die requestmapping url.

In jsp, diesen Code innerhalb der - Kreditkartentypen:

<form:select path="creditCardType"> 
    <option value="Select" label="Select a card type"></option> 
    <form:options items="${creditCardTypes}" /> 
</form:select> 

hier, path = "creditCardType" bezeichnet das Attribut in dem Spring MVC-Modell/Befehlsobjekt, items = "$ {creditCardTypes } "bedeutet, dass alle befüllten Kreditkartenarten in" CreditCardTypes "ModelAttribute verfügbar sind. Das ist es !!!