如何通过点击绑定Struts2 action的按钮获取表格对应商品id
问题原因
你无法获取商品ID是两点导致的:
- JSP页面点击跳转时没有把当前行对应的商品ID作为参数传给后台Action
- Action中没有定义对应接收商品ID的属性,Struts2参数拦截器无法自动注入参数值
第一步:修改JSP跳转链接,携带商品ID参数
你可以直接在请求地址后拼接productId参数,更规范的方式是用Struts2的<s:url>标签生成请求地址,避免编码问题:
<td> <!-- 生成带productId参数的请求地址 --> <s:url action="BuyProduct" var="buyUrl"> <s:param name="productId" value="productId"/> </s:url> <a href="${buyUrl}"> <button class="button"> <i class="fa fa-fw fa-cart-plus"></i> </button> </a> </td>
也可以直接拼接参数,写法如下:
<a href="BuyProduct.action?productId=<s:property value='productId'/>"> <button class="button"> <i class="fa fa-fw fa-cart-plus"></i> </button> </a>
第二步:修改Action代码,添加接收参数的属性
首先在Action中新增productId成员变量,并生成对应的getter、setter方法,Struts2会自动将请求携带的productId值注入到该属性中:
public class BuyProduct extends ActionSupport implements SessionAware { // 原有属性不变,新增productId属性 private Integer productId; // 生成getter public Integer getProductId() { return productId; } // 生成setter public void setProductId(Integer productId) { this.productId = productId; } // 原有其他方法不变 public String execute() throws Exception { // 原有逻辑不变,这里的productId已经被自动赋值,可以直接使用 Product product = productDAO.getProductById(productId); // 后续逻辑不变 } }
另外注意你原有Action里的笔误:private Product Product; 属性名首字母大写了,需要改成private Product product; 否则对应getter、setter会不生效。
可选优化方案
如果你不想单独加productId属性,也可以直接给Product对象的productId属性赋值,只需要把JSP里的参数名改成product.productId即可:
<s:param name="product.productId" value="productId"/>
这种写法不需要在Action中新增productId属性,查询时直接用product.getProductId()即可。
内容的提问来源于stack exchange,提问作者Jdvlp
相关产品推荐
相关产品推荐

