我想从填充列表中选择部分或全部列表元素,并在获取.POST控制器时在控制器上获取NulllPointerException,详细信息为..
Model Class
public class Invoice {
private int number;
private String name;
private String description;
private Date date;
private Double amount;
private Double due;
.........setters and getters ....
}
表格支持对象:
public class Invoices {
List<Invoice> invoiceList;
......... setter and getter .....
}
显示表单的控制器是
Controller is:
@RequestMapping(value = "/viewForm", method = RequestMethod.GET)
public String viewInvoice(Model model) {
List<Invoice>invoiceList = new CreateInvoiceItem().createItem();
Invoices invoices = new Invoices();
invoices.setInvoiceList(invoiceList);
model.addAttribute("invoices",invoices);
return "invoicelist";
}
我使用了一个类来使用
动态生成一些数据 CreateInvoiceItem().createItem();
在jsp中显示表单的代码是:
<form:form action="viewSelectedList" path="invoices"
method="POST" commandName="invoices">
<table> <tr> <td>Action</td> <td>#</td> <td>Name</td>
<td>Description</td> <td>Date</td>
<td>Amount</td> <td>Due</td> </tr>
<jstl:forEach var="list" items="${invoices.invoiceList}" >
<tr> <td><input type="checkbox" value="${list.number}"
id="${list.number}" name="${list.number}"/></td>
<td><jstl:out value="${list.number}"/> </td>
<td><jstl:out value="${list.name}"/> </td>
<td><jstl:out value="${list.description}"/> </td>
<td><fmt:formatDate pattern="dd-MM-yyyy"
value="${list.date}" /></td>
<td><jstl:out value="${list.amount}"/> </td>
<td><jstl:out value="${list.due}"/> </td>
</tr>
</jstl:forEach>
<tr><td><input type="submit" name="submit" value="Submit"></td>
</tr>
</table>
</form:form>
但是当点击提交按钮时,.POST控制器显示NullPopinterException:
@RequestMapping(value = "/viewSelectedList", method = RequestMethod.POST)
public String showList(Model model, Invoices invoices,
BindingResult result) {
List<Invoice> selectedList = invoices.invoiceList;
model.addAttribute(invoices);
return "selectedList";
}
POST控制器中没有所选列表。我见过很多例子,但我无法理解我哪里出错了。
答案 0 :(得分:1)
您是否正在尝试选择或检查&#34; invoicelist&#34;提交表单后在控制器中排。如果你的&#34; invoicelist&#34;正在从数据库填充。如果是这样的话,你的&#34; list.number&#34;相当于&#34; id&#34;。
您需要做的是:
<input type="checkbox" name="ids[]" id="ids[]" value="${list.numbers}" />
而不是<input type="checkbox" value="${list.number}" id="${list.number}" name="${list.number}"/>
修改后的控制器:
@RequestMapping(value = "/viewSelectedList", method = RequestMethod.POST)
public String showList(
Model model,
Invoices invoices,
BindingResult result,
@RequestParam(value="ids[]") Long ids[]; // added paramater
) {
ArrayList<ArrayList<Invoice>> selectedInvoice= new ArrayList<ArrayList<Invoice>>();
for (Long id : ids){
List<Invoice> inv = invoiceServiceImpl.findPost(id); // This method should get list of invoices as per row
selectedInvoice.add((ArrayList<Invoice>) inv);
}
}
现在您将拥有所选或已检查的&#34; invoiceList&#34;做任何你想做的事。
如果您不想查询&#34;发票&#34;每次在&#34; showlist&#34;中从数据库中排方法
只需编写一个搜索机制,用于在已生成的&#34; invoicelist&#34;中按ID进行搜索并获取内部for循环中的每一行以获得选定或已检查的&#34;发票&#34;。
注意:您需要修改表单并写一点 这个修改过的代码的javascript可以有效地工作。
例如,如果您不检查任何复选框,您将收到错误。因此,您需要使用javascript验证您的复选框是否为空。
您可以使用主复选框添加功能以一次性选中所有复选框,其中您使用了列名称&#34; action&#34;在表中。这需要额外的javascript。
希望这会有所帮助。