我正在用jsp为一个学校项目创建一个web商店。
在每个产品页面上,都有一个按钮可将其添加到购物车。原来,只有一个项目添加到购物车时,我们按“添加”按钮。
我通过将productid作为参数添加到url中,将其发送到控制器,您可以在这里看到:
<div class="product-page">
<div class="product">
<h1>${product.title}</h1>
<img src="${product.imageUrl}"/>
<div class="price"><p>${product.price}€</p></div>
</div>
<c:url var="addLineToCart" value="/product/addLineCart">
<c:param name="productId" value="${product.id}" />
</c:url>
<a id="addToCart" type="submit" href="${addLineToCart}"><spring:message code="addCart"/></a>
我想做的是添加一个输入字段来指定要添加到购物车中的项目数量。我在这里做的:
<div class="product-page">
<div class="product">
<h1>${product.title}</h1>
<img src="${product.imageUrl}"/>
<div class="price"><p>${product.price}€</p></div>
</div>
<input type="number" name="quantity" value="1"/>
<c:url var="addLineToCart" value="/product/addLineCart">
<c:param name="productId" value="${product.id}" />
</c:url>
<a id="addToCart" type="submit" href="${addLineToCart}"><spring:message code="addCart"/></a>
我的问题是我不知道如何从 <c:param/>
属性,以便将其也添加到url中。
假设我通过url获得要添加的数量,我的控制器看起来是这样的:
@Controller
@RequestMapping(value="/product")
@SessionAttributes({Constants.CURRENT_CART})
public class ProductController {
private ProductDAO productDAO;
@Autowired
public ProductController(ProductDAO productDAO){
this.productDAO = productDAO;
}
@ModelAttribute(Constants.CURRENT_CART)
public Cart cart()
{
return new Cart();
}
@RequestMapping (method = RequestMethod.GET)
public String home(ModelMap model, @RequestParam("product") int productId, @ModelAttribute(value=Constants.CURRENT_CART) Cart cart){
Product product = productDAO.getById(productId);
model.addAttribute("product", product);
model.addAttribute("title", "Produit");
model.addAttribute("cart", cart);
return "integrated:product";
}
@GetMapping("/addLineCart")
public String addLineCart(@ModelAttribute(value=Constants.CURRENT_CART) Cart cart, @RequestParam("productId") int productId, @RequestParam("quantity") int quantity, ProductService productService)
{
Product product = productService.searchProduct(productId,productDAO);
cart.addProduct(product, quantity);
return "redirect:/product?product=" + productId;
}
}
谢谢你的帮助。
1条答案
按热度按时间3mpgtkmj1#
最简单的方法是用html Package 字段
<form>
标记并将数据提交给控制器。您还应该将get替换为post,因为您的浏览器可能会决定缓存对某些组合的响应productId
以及quantity
因此,应用程序可能会出现一些不需要的行为(不要忘记更改@GetMapping
在你的控制器里@PostMapping
还有)。还有一个选项,可以使用javascript将其作为ajax请求提交到服务器,或者更改现有链接中url的值,以便在单击该链接时以及向服务器发出请求之前包含数量,但是使用带有post操作的表单是最简单、最干净的解决方案。
最后,
<c:url>
以及<c:param>
是服务器端标签。它们在服务器上得到评估,生成最终的html,并发送到客户端浏览器。无法将浏览器中的输入值输入到<c:param>
因为此时正在运行客户端代码,所以不再运行服务器代码。