การส่งผ่านข้อมูลวัตถุจาก JSP ไปยัง Spring Controller Post Method แทนวิธี GET

ฉันยังใหม่กับ Spring Web MVC และพัฒนาเว็บแอปพลิเคชัน มีกรณีที่ฉันต้องส่งค่าข้อมูลไปยังคอนโทรลเลอร์ (หมายเหตุ: ที่นี่ค่าข้อมูลคือค่าของวัตถุ 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="/th<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 หรือไม่ โปรดแนะนำฉันด้วย ขอบคุณล่วงหน้า

(นี่เพิ่งตั้งกระทู้ครั้งแรก ผิดพลาดประการใดขออภัยด้วย)


person swagath001    schedule 19.11.2014    source แหล่งที่มา


คำตอบ (3)


ใส่ทุกอย่างไว้ในแบบฟอร์ม (โดยใช้แท็ก <form:form> ของ Spring) นี่จะโพสต์แบบฟอร์มไปยัง URL เดียวกับที่แสดง หากคุณต้องการ POST ไปยัง URL อื่น ให้ตั้งค่าแอตทริบิวต์ action ของแบบฟอร์ม

เปลี่ยนลิงก์ Add item to Cart ของคุณเป็นปุ่มส่ง เนื่องจากคุณไม่ควรเปลี่ยนข้อมูลด้วย GET คุณสามารถจัดสไตล์ได้ตามที่คุณต้องการและทำให้ดูเหมือนลิงก์ถ้าคุณต้องการ

ปุ่มของคุณควรมีลักษณะดังนี้:

<button type=submit name=itemNumber value=xxx>Add item to Cart</button>

ในคอนโทรลเลอร์ของคุณ คุณควรมีวิธีจัดการที่มีการแมปคำขอดังนี้:

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

จากนั้นคุณควรใช้รูปแบบหลังเปลี่ยนเส้นทาง-รับเพื่อเปลี่ยนเส้นทางกลับไปยังรายการผลิตภัณฑ์ ดู flashAttributes ในเอกสาร Spring MVC

person Neil McGuigan    schedule 19.11.2014
comment
คุณต้องการให้ฉันเปลี่ยนลิงค์ทั้งหมดเป็นปุ่มหรือไม่? และวิธีการจัดการที่มีมูลค่า additemtocart จะถูกเรียกขึ้นมาได้อย่างไรเมื่อคลิกที่ปุ่มส่ง คุณช่วยระบุอันนั้นด้วยได้ไหม? - person swagath001; 19.11.2014
comment
แก้ไขคำตอบของฉัน ตรวจสอบให้แน่ใจว่าทุกอย่างอยู่ในรูปแบบ สิ่งนี้จะสร้างคำขอ POST ไปยังเซิร์ฟเวอร์ที่ URL เดียวกับที่เพจแสดงเป็น คุณสามารถเปลี่ยนแอตทริบิวต์ action ของแบบฟอร์มสำหรับ URL อื่นได้ - person Neil McGuigan; 19.11.2014

ใช่ คุณพูดถูก คุณควรใช้คำขอ POST เพื่อทำการดำเนินการ DML ใดๆ บนเซิร์ฟเวอร์ GET ควรใช้สำหรับการดึงข้อมูลเท่านั้น เหตุผลก็คือเพื่อหลีกเลี่ยงการส่งแบบฟอร์มซ้ำซ้อนซึ่งคุณสามารถทำได้ด้วยการกด F5 หรือคลิกปุ่มส่งสองครั้ง คุณควรใช้ method=RequestMethod.POST แทน GET ดูคำขอโพสต์ Spring MVC

person M Sach    schedule 19.11.2014

คุณมีปุ่มเพิ่มลงตะกร้า เมื่อคลิกแล้ว คุณสามารถโทร Ajax และใช้การแมปคำขอที่เหมาะสมในคอนโทรลเลอร์ได้

<a href="/thjavascript:addItemToCart(${item.itemNo},"passURL");">Add to cart item?</a>

ใน Javascript คุณสามารถส่งพารามิเตอร์และระบุประเภทเป็น POST สำหรับคำขอ ajax

โค้ด JavaScript

function addItemToCard(itemNo,targetURL){

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

}
person Shoaib Chikate    schedule 19.11.2014