我想问一些关于某些网站如何运作的理论问题。举个例子。让我说我在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
然后我又添加了另一种不同的葡萄酒来装篮子。出现的地址与之前的地址完全相同。
当我点击后退按钮时,购物篮总是显示我在篮子里有两件物品。您认为这些在线商店如何对网站进行编程,以便购物篮始终显示其当前状态,即使用户多次按下后退按钮?另外,这两种情况的区别是什么?
答案 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>