Spring mvc使用复选框选择列表项

时间:2016-07-01 09:34:43

标签: jsp spring-mvc

我想从填充列表中选择部分或全部列表元素,并在获取.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> 

到目前为止它的工作正常,输出是: enter image description here

但是当点击提交按钮时,.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控制器中没有所选列表。我见过很多例子,但我无法理解我哪里出错了。

1 个答案:

答案 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}"/>
  • 仅发送&#34;号码&#34; to&#34; showList&#34;控制器。
  • 然后获取每个&#34; invoiceList&#34;使用&#34; number.list&#34;在for循环中并修改你的控制器,如下例所示。
  

修改后的控制器:

@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。

希望这会有所帮助。