jsp-set< c:param/>输入字段中的值以在url中传递它

fslejnso  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(394)

我正在用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;
    }
}

谢谢你的帮助。

3mpgtkmj

3mpgtkmj1#

最简单的方法是用html Package 字段 <form> 标记并将数据提交给控制器。您还应该将get替换为post,因为您的浏览器可能会决定缓存对某些组合的响应 productId 以及 quantity 因此,应用程序可能会出现一些不需要的行为(不要忘记更改 @GetMapping 在你的控制器里 @PostMapping 还有)。
还有一个选项,可以使用javascript将其作为ajax请求提交到服务器,或者更改现有链接中url的值,以便在单击该链接时以及向服务器发出请求之前包含数量,但是使用带有post操作的表单是最简单、最干净的解决方案。
最后, <c:url> 以及 <c:param> 是服务器端标签。它们在服务器上得到评估,生成最终的html,并发送到客户端浏览器。无法将浏览器中的输入值输入到 <c:param> 因为此时正在运行客户端代码,所以不再运行服务器代码。

相关问题