如何在Spring MVC中填充下拉框

我一直试图找出如何填充Spring MVC中的下拉框。 关于这个问题有一些主题,但我找到的没有一个帮助过我,所以我希望有人可以帮助我。

这是我的控制器:

@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 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"; } } 

这是jsp页面:

      Insert title here  .error { color: red; }    

Create New Document Revision

DocumentNumber
Document R-State

我试过添加一个检索文档编号的@ModelAttribute方法,

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

但它给了我错误。 有谁知道应该怎么做?

感谢您的时间

/ d

编辑我想我已经澄清我希望有一个文件编号的下拉框,由documentService检索。

编辑2这是请求的错误日志:

 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) 

解决方案我想我会添加完整的控制器代码,以防万一其他人可以从中受益:

 @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 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"; } } 

不确定使用documentNumberList调用哪个Controller方法来显示您的视图,但是您需要将该集合添加到传递给此视图的模型中:

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

虽然从你的exception堆栈跟踪中你也错过了@Autowired on documentService字段。

 @ModelAttribute("numberList") public List documentNumberList(){ List selectItems = new ArrayList(); List docList = documentService.retrieveAllDocumentNumbers(); for (Document doc : docList) { selectItems.add(new LabelValue(doc.id,doc.value)); } return selectItems; } 

FYI LabelValue类是一个简单的DTO,我们用它来携带下拉标签和值项。 它将具有label和value属性,以及相应的getter / setter。

LabelValue.java

  private String lable; private String value; //getters/setters 

—- JSP —–

  DocumentNumber        

希望这可以帮助..

我今天已经解决了这个问题。 这非常简单易懂。 在Spring MVC 3.0控制器中只需放置此代码 –

  @ModelAttribute("creditCardTypes") public Map populateCreditCardTypes() { Map creditCardTypes = new LinkedHashMap(); 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; } 

现在,“creditCardTypes”属性将在页面加载或页面提交范围中可用,这意味着无论请求映射URL是什么,它都可用。

在jsp中,将此代码放在 – 信用卡类型中:

     

这里,path =“creditCardType”表示Spring MVC模型/命令对象中的属性,items =“$ {creditCardTypes}”表示所有填充的信用卡类型将在“creditCardTypes”ModelAttribute中可用。 而已 !!!