如何在Action Class中获取复选框(在迭代器标记内生成)值

时间:2015-04-14 19:11:42

标签: checkbox struts2

背景

我们有一个项目列表,每个项目都可以通过勾选其复选框来选择。如果在选择所有必需的复选框后单击提交按钮。所以现在,在我们的Action类中,我们可以获取已选中的复选框的值,通过它我们可以在Database中存储选择复选框值。

环境: Struts 2.3.20

当运行下面提到的代码时,JSP完全可以创建动态复选框。但是当我选中复选框并按下SAVE按钮时,我得到了下面提到的错误。如果遇到类似问题的任何人都可以分享他们如何解决这个问题的经验,我们将非常感激。

ERROR:

Action Class的第54行的空指针异常。

(com.testapp.struts2.actions.AddProductsAction.execute(AddProductsAction.java:54)

addProducts.jsp:

<s:form action="addProducts2Campaign" method="post">
 <s:iterator value="productsList" status="stat">                    
   <tr bgcolor="<s:if test="#productStatus.odd == true">#999999</s:if><s:else>#CEDDF4</s:else>">
    <td align="center">
        <s:checkbox name="selectedProductsList[%{#stat.index}]" theme="simple" fieldValue="%{productId}"/>
    </td>                 
    <td align="center"><s:property value="Title" /></td>
    <td align="center"><s:property value="SKU" /></td>
    <td align="center"><s:property value="Description" /></td>
    <td align="center"><s:property value="Price" /></td>
   </tr>
 </s:iterator>   
</s:form>

ADDPRODUCTSACTION.java

public class AddProductsAction extends ActionSupport implements ModelDriven<Products>{

private Products products = new Products();

private Map<Integer, Boolean> selectedProducts;

@Override
public Products getModel() {
  // TODO Auto-generated method stub
  return products;
}

public String execute() throws Exception {

    ProductDAO productDAO = new ProductDAO();
    ArrayList<Integer> productIds2Add = new ArrayList(); 

    (Line 54:>> below)
    for (Entry<Integer, Boolean> entry : selectedProducts.entrySet()) {
        Integer key=entry.getKey();
        Boolean value=entry.getValue();
        if(value == true){
            productIds2Add.add(key);
        }
    }

   products.setProductIds2Add(productIds2Add);

   productDAO.addProducts(products);
    return IConstants.SUCCESS;
}// End of execute()



public Products getProducts() {
    return products;
}



public void setProducts(Products products) {
    this.products = products;
}


public void setSelectedProducts(Map<Integer, Boolean> selectedProducts) {
    this.selectedProducts = selectedProducts;
}


}

PRODUCT.JAVA

public class Products {

private ArrayList<Integer> productIds2Add;

public ArrayList<Integer> getProductIds2Add() {
    return productIds2Add;
}

public void setProductIds2Add(ArrayList<Integer> productIds2Add) {
    this.productIds2Add = productIds2Add;
}
}

1 个答案:

答案 0 :(得分:0)

I figured out the cause. struts.xml didn't have the the input property set because of which the Model was not getting set with the values. Once I added that it worked. 


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name="struts.devMode" value="true" />
   <constant name="struts.custom.i18n.resources" value="ApplicationResources" />
   <constant name="struts.ui.theme" value="simple" />
   <package name="default" extends="struts-default">

    <action name="addProducts2Campaign" method="execute" class="com.myapp.actions.AddProductsAction">
        **<result name="input">/products/addProducts.jsp</result>**
        <result name="success">/products/confirmation.jsp</result>
        <result name="error">/error.jsp</result>
    </action>

        </package>
    </struts>