我有一个包含函数列表的jsp页面。在控制器中,我从数据库中获取此列表并将其传递给jsp。
@RequestMapping(value = "/functionlist", method = RequestMethod.GET)
public ModelAndView functionList(Model model) throws Exception {
ModelAndView mv = new ModelAndView("functionList");
mv.addObject("functionList", getFunctionsFromDB());
return mv;
}
在我的jsp页面中,我使用这个函数列表创建表
<table id="table">
<thead>
<tr>
<th></th>
<th>Name</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${not empty functionList}">
<c:forEach var="function" items="${functionList}">
<tr>
<td><input name="id" value="${function.id}" hidden></td>
<td>${function.name}</td>
<td>
<input type="checkbox" id="${function.id}" value="${function.action}"></td>
</tr>
</c:forEach>
</c:when>
</c:choose>
</tbody>
</table>
<button type="submit" name="save">Save</button>
我还将功能ID提供给复选框ID。
我的功能实体如下
public class Function {
private Integer id;
private String name;
private Boolean action;
...
}
我想按下保存按钮并进入控制器“/ functionlist / save”我的复选框值列表。
答案 0 :(得分:4)
尝试将这样的form
添加到您的jsp页面
<form:form id="yourForm" action="/functionlist/save" method="POST" modelAttribute="functionList">
<c:forEach items="${functionList}" varStatus="status" var="function">
<tr>
<td>${function.name}</td>
<td>
<form:checkbox path="functionList[${status.index}].action"/>
</td>
</tr>
</c:forEach>
<input type="submit" value="submit" />
</form:form>
并且在Controller中你应该有这样的方法
@RequestMapping(value = { "/functionlist/save" }, method = RequestMethod.POST)
public String savePerson(@ModelAttribute("functionList")List<Function> functionList) {
// process your list
}
如果这不起作用,您可以尝试包装清单。
public class FunctionListWrapper {
private List<Function> functionList;
public FunctionListWrapper() {
this.functionList = new ArrayList<Function>();
}
public List<Function> getFunctionList() {
return functionList;
}
public void setFunctionList(List<Function> functionList) {
this.functionList = functionList;
}
public void add(Function function) {
this.functionList.add(function);
}
}
在控制器中而不是传递列表,传递包装器
FunctionListWrapper functionListWrapper=new FunctionListWrapper();
functionListWrapper.setFunctionList(userService.getFunctionList());
mv.addObject("functionListWrapper", functionListWrapper);
有关详细信息,请查看以下问题:question 1和question 2
答案 1 :(得分:1)
首先,您需要为您的复选框输入添加name属性。您可以将其添加到 控制器上的一个数组,名称与name.eg相同 -
@RequestMapping(value = "/functionlist", method = RequestMethod.GET)
public ModelAndView functionList(Model model,@RequestParam("checkboxname")String[] checkboxvalues) throws Exception {
ModelAndView mv = new ModelAndView("functionList");
mv.addObject("functionList", getFunctionsFromDB());
return mv;
}
答案 2 :(得分:0)
public class Form {
private List<Function> functions;
//getters & setters
}
其次,由于您使用的是Spring MVC,因此您应该利用<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
库。因此,您的表单将是:
<form:form commandName="form" action="/your/url">
<c:forEach items="${form.functions }" var="function" varStatus="status">
<tr>
<td><form:hidden path="functions[${status.index }].id"></td>
<td>${function.name}</td>
<td>
<form:checkbox path="functions[${status.index }].action" id="${function.id}" value="${function.action}"/>
</td>
</tr>
</c:forEach>
</form:form>
最后控制器将类似于
@RequestMapping(value="/your/url", method=RequestMethod.POST)
public String postForm(@ModelAttribute("form") FormForm form)
{
//cool stuff here
}
请注意,正确的HTTP方法是POST,而不是GET。是的,我知道事情也适用于GET,这绝对是一个弃用的策略。
另外,弄清楚我如何在Function
中引用Form
列表。当我必须显示数据时,我在function
语句中使用了变量foreach
,当我必须绑定Form
对象以将数据传输到控制器时,我引用了列表。最后但并非最不重要的,我还没有尝试过代码。我在飞行中写它只是为了给你提示如何正确地做到这一点。
最后一件事。由于您将表单传递给JSP,因此您不再需要使用您使用的属性填充模型。只需在表单中填入您的数据,然后使用它在视图中显示它们。就像这个${form.stuff.you.want}