我正在使用java构建电子商务简单解决方案,我陷入了一个临界点。我无法显示正确的项目。我正在使用一个servlet,它有一个doGet,一个shoppingcart类,一个产品类和viewcart.jsp文件。要在servlet之间传递项目,我正在使用上下文的setAttribute。这是我到目前为止构建的文件。任何人都可以帮我解决这个问题吗?每次我按下添加到汽车它添加元素,但看起来像我添加的最后一个元素覆盖所有以前的元素。
package com.kd.ecommerce;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class addtocart
*/
@WebServlet("/addtocart")
public class addtocart extends HttpServlet {
private static final long serialVersionUID = 1L;
private shoppingcart shop = new shoppingcart();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext thisContext = getServletContext();
String name = request.getParameter("product");
Connection cn = DBConnect.getInstance();
try {
Statement st = cn.createStatement();
ResultSet rs = st.executeQuery("select * from inventory where name = '"+name+"' LIMIT 1");
while(rs.next()){
Products p = new Products(rs.getString(2),rs.getString(3),rs.getString(4),rs.getFloat(5));
System.out.println(p.getName()+":"+ p.getPrice());
shop.ins(p);
thisContext.setAttribute("shop", shop.getIt());
for(int i = 0; i< shop.getIt().size(); i++){
System.out.println(shop.getIt().get(i)+":"+ shop.getIt().get(i).getPrice());
}
response.sendRedirect("inventory.jsp?addedto=success");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
Products.java
package com.kd.ecommerce;
public class Products {
private static String name;
private static Float price;
private static String desc;
private static String img;
public Products(String n, String d, String i,Float p){
name = n;
price = p;
desc = d;
img = i;
}
public String getName(){
return name;
}
public Float getPrice(){
return price;
}
public String getImage(){
return img;
}
public String getDesc(){
return desc;
}
}
shoppingcart.java
package com.kd.ecommerce;
import java.util.ArrayList;
public class shoppingcart {
private static ArrayList<Products> items;
public shoppingcart(){
items = new ArrayList<Products>();
}
public void ins(Products p){
items.add(p);
}
public void remove(Products p){
items.remove(p);
}
public int getSize(){
return items.size();
}
public ArrayList<Products> getIt(){
return items;
}
}
viewcart.jsp
<jsp:include page="menu.jsp"></jsp:include>
<%
ServletContext sc = getServletConfig().getServletContext();
if(sc.getAttribute("shop") != null){
ArrayList<Products> it = (ArrayList<Products>)sc.getAttribute("shop");
out.println(it);
for(int i = 0; i< it.size(); i++){
out.println("<span class='price'>"+it.get(i).getPrice()+"</span>");
}
}else{
out.println("<span class='empty'>Shopping cart empty</span>");
}
%>
- 编辑 -
我的新viewcart.jsp使用会话
<%
if(session.getAttribute("shop") != null){
shoppingcart sh = (shoppingcart)session.getAttribute("shop");
ArrayList<Products> pd = sh.getIt();
for(int i = 0; i< pd.size(); i++){
out.println("<span class='price'>"+pd.get(i).getPrice()+"</span>");
}
}else{
out.println("<span class='empty'>Shopping cart empty</span>");
}
%>
答案 0 :(得分:1)
导致问题的原因是您已将 shoppingcart 作为Servlet中的实例变量。这意味着您的Servlet处理的每个HTTP请求都共享相同的 shoppingcart 。要解决此问题,请从类定义代码中移动以下行:
private shoppingcart shop = new shoppingcart();
将其移至以下行之前的 doGet 方法:
shop.ins(p);
doGet 方法将包含以下两行:
shoppingcart shop = new shoppingcart();
shop.ins(p);
您甚至可以考虑为 shoppingcart 类提供一个构造函数,该构造函数将 Products 对象作为参数,并在构造函数中设置项目。然后你可以将这两行合并为一行,如下所示:
shoppingcart shop = new shoppingcart(p);
在Servlet中将对象定义为实例变量是一个常见的错误。请记住,对servlet的每次HTTP调用都将共享实例变量。如果您想要存储特定用户的信息,请考虑将它们放入会话中。
---- ---- EDIT
事实证明,我实际上没有回答这个问题。要保持已添加项目的运行记录,您必须将项目保存到任何人都不会共享的位置 - 只有特定用户才能保存其数据。会议是专门为此目的而设计的。您可以在 doGet 方法中使用此类会话:HttpSession session = request.getSession(true);
shoppingcart shop = (shoppingcart)session.getValue("shop");
if(shop == null) {
shop = new shoppingcart();
session.putValue("shop", shop);
}
shop.ins(p);
从会话中获取值的行返回使用键“shop”存储的任何对象。如果这是用户添加的第一个项目,则尚未保存购物车,因此购物将 null 。这就是我们进行空检查的原因;创建一个购物车,然后将其与“商店”键相关联,以便下次用户添加商品时,购物车将与“商店”键相关联。
一旦我们有一个 shoppingcart 与该特定用户的“shop”键相关联,您应该会看到正在添加到同一购物车对象中的项目,因为多次提交。