Как заполнить раскрывающийся список в 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<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";
}
}
и вот страница jsp:
<%@ 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>
Я попытался добавить метод @ModelAttribute, который извлекает номера документов,
@ModelAttribute
public List<Document> documentNumberList(){
return documentService.retrieveAllDocumentNumbers();
}
но это дало мне ошибки. Кто-нибудь знает, как это сделать?
Спасибо за ваше время
/Д
Изменить. Я думал, что уточню, что мое желание состоит в том, чтобы иметь раскрывающийся список для номеров документов, которые извлекаются 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<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";
}
}
Ответы
Ответ 1
Не знаете, какой метод контроллера вызывается для отображения вашего представления с помощью documentNumberList
, но вам нужно добавить эту коллекцию к модели, переданной этому представлению:
model.addAttribute("documentNumberList", documentService.retrieveAllDocumentNumbers());
Хотя из вашей трассировки стека исключений вы также пропустили поле @Autowired в documentService
.
Ответ 2
@ModelAttribute("numberList")
public List<Document> documentNumberList(){
List<LabelValue> selectItems = new ArrayList<LabelValue>();
List<Document> docList = documentService.retrieveAllDocumentNumbers();
for (Document doc : docList) {
selectItems.add(new LabelValue(doc.id,doc.value));
}
return selectItems;
}
Класс FYI LabelValue - это простой DTO, который мы используем для переноса выпадающих меток и элементов ценности. Он будет иметь атрибут метки и значения и соответствующие геттеры/сеттеры.
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>
надеюсь, что это поможет.
Ответ 3
Сегодня я решил эту проблему сегодня. Это очень просто и легко понять.
В контроллере Spring MVC 3.0 просто поместите этот код -
@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 Club");
return creditCardTypes;
}
Теперь атрибут "creditCardTypes" будет доступен в области загрузки страницы или отправки страницы, означает, что он будет доступен независимо от URL-адреса requestmapping.
В jsp поместите этот код внутри - Типы кредитных карт:
<form:select path="creditCardType">
<option value="Select" label="Select a card type"></option>
<form:options items="${creditCardTypes}" />
</form:select>
здесь, path = "creditCardType" означает атрибут в Spring MVC model/command object,
items = "$ {creditCardTypes}" означает, что все типы заполненных кредитных карт будут доступны в ModelAttribute "creditCardTypes".
Вот оно!!!