不同的URL如何工作

时间:2011-11-25 17:03:16

标签: e-commerce query-parameters

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

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

我继续购物,然后在手推车里放了一个不同的酒,再次出现了这个网页

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

然后我又添加了另一种不同的葡萄酒来装篮子。出现的地址与之前的地址完全相同。

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

1 个答案:

答案 0 :(得分:1)

篮子可能存储在会话中。会议通常由cookie支持。在JSP / Servlet中,它是JSESSIONID cookie。要自己测试,请在浏览器的cookie存储中找到cookie并将其删除。您将看到页面刷新将导致空篮子。有关更详细的背景信息,请阅读How do servlets work? Instantiation, sessions, shared variables and multithreading

在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>