1

我想问一个关于某些网站如何运作的理论问题。举个例子。假设我在A市场在线商店。我在购物车里放了一箱酒,页面出现了这个 URL:

www.A.co.uk/webstore/basket.asp?calledby=normal&ProductCode=6379044

我继续购物,然后在手推车里放了另一种酒,页面又出现了这个 URL

www.A.co.uk/webstore/basket.asp?calledby=normal&ProductCode=6323456

然后我在浏览器上单击了三下后退按钮,手推车页面再次出现。这次只包含第一项,而不是第二项。

在另一个网站上,我展示了以下内容:

我选了一箱酒。结果,包含葡萄酒的表单被发布到此 ASP 页面basket.asp?Item=3605681,其中 Item 是特定葡萄酒案例的 ID。然而,出现在浏览器中的页面有一个不同的 URL:

www.B.com/extra/basket.aspx?acstore=10&ba=0

然后我在篮子里又加了一箱不同的酒。出现的地址和之前的一模一样。

当我单击后退按钮时,购物篮总是显示我在篮子里有两件商品。您认为这些在线商店如何对网站进行编程,以便即使用户多次按下后退按钮,购物篮也始终显示其当前状态?另外,这两种情况有什么区别?

4

1 回答 1

1

篮子可能存储在会话中。会话通常由 cookie 支持。在 JSP/Servlet 中它是JSESSIONIDcookie。要自己测试,请在浏览器的 cookie 存储中找到 cookie 并将其删除。您会看到页面刷新将导致一个空的购物篮。有关更详细的背景信息,请阅读servlet 如何工作?实例化、会话、共享变量和多线程

在 JSP/Servlet 术语中,可以按如下方式检索/预创建购物篮:

Basket basket = (Basket) session.getAttribute("basket");

if (basket == null) {
    basket = new Basket();
    session.setAttribute("basket", basket);
}

// ...

只要用户在同一个会话中与同一个网页交互,它就会存在。任何产品都可以按如下方式添加到购物篮中:

String productCode = request.getParameter("productCode");
Product product = someProductService.find(productCode);

if (product != null) {
    basket.addProduct(product);
}

// ...

在 JSP 中,您可以按如下方式显示它:

<table>
  <c:forEach items="${basket.products}" var="product">
     <tr>
        <td>${product.code}</td>
        <td>${product.description}</td>
        <td>${product.quantity}</td>
        <td>${product.price}</td>
     </tr>
  </c:forEach>
</table>
于 2011-11-25T17:15:06.927 回答