使用POST方法将对象数据从JSP传递到Spring Controller而不是GET方法

3

我是Spring Web MVC的新手,正在开发一个Web应用程序。有一种情况需要将数据值传递给控制器。 (注意:这里的数据值是bean对象的值)

Item Number  Item Name  Description  Price

 Item1018     Item1      Desc1        5.0      Add item to Cart  
 Item1019     Item2      Desc2        2.0      Add item to Cart  

如上图所示,如果我点击“添加物品到购物车”,相应的物品编号应该传递给控制器。

viewmenu.jsp

<c:forEach items="${model.itemlists}" var="item">
<tr>
   <c:if test = "${item.status == 'available'}">   
    <td><c:out value="${item.itemNo}"/>  </td>
    <td><c:out value="${item.itemName}"/></td>
    <td><c:out value="${item.description}"/></td>
    <td><c:out value="${item.price}"/></td>
    <td><a href="<c:url value="additemtocart">
             <c:param name='itemNumber' value="${item.itemNo}"/>
         </c:url>">Add item to Cart</a> </td>
    </c:if>
</tr>
</c:forEach>

CustomerController.java方法

@RequestMapping(value = "additemtocart",method = RequestMethod.GET)
     public ModelAndView addItemToCart(@RequestParam("itemNumber") String itemno  ) throws ClassNotFoundException, SQLException {
                   System.out.println("Username test in customer controller: "+userName);

 }

代码可以工作并且我能够传递值。但是根据GET和POST方法的标准(在这里描述),我认为我做错了。请建议是否有其他方法将数据传递到POST方法中。请给予建议。提前感谢您。 (这是我第一次在此发布,请原谅我如果有任何错误)
3个回答

1
您有添加到购物车的按钮,因此在单击它时,您可以进行Ajax调用并在控制器中使用相应的请求映射。
<a href="javascript:addItemToCart(${item.itemNo},"passURL");">Add to cart item?</a>

在Javascript中,你可以传递参数并为ajax请求指定POST类型。 Javascript代码
function addItemToCard(itemNo,targetURL){

  $.ajax(function(){
    url:targetURL,
    type:"POST",
    data:"itemNumber":itemNo,
    success:function(response){
       alert("Added successfully");
    }
  });

}

1
将所有内容放入一个表单中(使用Spring的<form:form>标签)。这将把表单POST到显示它的同一URL。如果您想要POST到不同的URL,则设置表单的action属性。
将您的添加商品到购物车链接更改为提交按钮,因为您不应该使用GET方法更改数据。您可以根据需要进行样式设置,使其看起来像链接。
您的按钮应该长这样:
<button type=submit name=itemNumber value=xxx>Add item to Cart</button>

在你的控制器中,你应该有一个带有请求映射的处理程序方法,像这样:

@RequestMapping(value="additemtocart", method=RequestMethod.POST, params={"itemNumber"})

接下来应该使用Post-Redirect-Get模式重定向回产品列表。请参阅Spring MVC文档中的flashAttributes。


你想让我将整个链接改为按钮吗?当点击提交按钮时,如何调用值为“additemtocart”的处理程序方法?你也能具体说明一下吗? - swagath001
编辑了我的答案。确保所有内容都放在表单中。这将向显示页面相同的URL的服务器发出POST请求。您可以更改表单的“action”属性以获取不同的URL。 - Neil McGuigan

1

是的,你是正确的,应该使用POST请求在服务器上执行任何类型的DML操作。GET应该仅用于数据获取操作。原因是为了避免通过F5或多次单击提交按钮进行双重表单提交。你应该使用method=RequestMethod.POST而不是GET。请参见Spring MVC Post Request


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接