Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在servlet的jsp文件中显示购物车中的项目_Java_Jsp_Servlets - Fatal编程技术网

Java 在servlet的jsp文件中显示购物车中的项目

Java 在servlet的jsp文件中显示购物车中的项目,java,jsp,servlets,Java,Jsp,Servlets,我正在用java构建一个简单的电子商务解决方案,我被困在了一个关键点上。我无法显示正确的项目。我使用的servlet有一个doGet、一个shoppingcart类、一个products类和viewcart.jsp文件。为了在servlet之间传递项目,我使用了context的setAttribute。这是我到目前为止建立的文件。有人能帮我解决这个问题吗?每次我按add to car时,它都会添加元素,但看起来之前的所有元素都会被我添加的最后一个元素覆盖 package com.kd.ecomm

我正在用java构建一个简单的电子商务解决方案,我被困在了一个关键点上。我无法显示正确的项目。我使用的servlet有一个doGet、一个shoppingcart类、一个products类和viewcart.jsp文件。为了在servlet之间传递项目,我使用了context的setAttribute。这是我到目前为止建立的文件。有人能帮我解决这个问题吗?每次我按add to car时,它都会添加元素,但看起来之前的所有元素都会被我添加的最后一个元素覆盖

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 {

}

}
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;
}
}
package com.kd.ecommerce;
导入java.util.ArrayList;
公共类购物车{
私有静态数组列表项;
公共购物车(){
items=newarraylist();
}
公共图书馆(产品p){
增加(p);
}
公共空间移除(产品p){
项目。删除(p);
}
公共int getSize(){
返回items.size();
}
公共数组列表getIt(){
退货项目;
}
}
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>");
}
%>

导致问题的原因是您将shoppingcart作为Servlet中的实例变量。这意味着Servlet处理的每个HTTP请求都共享相同的shoppingcart。要解决此问题,请从类定义代码中移动以下行:

private shoppingcart shop = new shoppingcart();
并将其移动到下一行之前的doGet方法中:

shop.ins(p);
然后,doGet方法将包含以下两行:

shoppingcart shop = new shoppingcart();
shop.ins(p);

您可能会考虑使用<强> >产品< /强>对象作为参数的<强>购物车>强类>构造函数,并在构造函数中设置项目。然后您可以将这两行合并为一行,如下所示:

shoppingcart shop = new shoppingcart(p);
在servlet中将对象定义为实例变量是一个常见的错误。请记住,对servlet的每个HTTP调用都将共享实例变量。如果您想为特定用户存储信息,请考虑将其放入会话。

----编辑----

事实证明,我并没有回答这个问题。要对添加的项目进行连续记录,您必须将项目保存到一个不会被任何人共享的地方——一个只有特定用户才会将其数据保存到的地方。会议是专门为此目的而设计的场所。您可以在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”存储的任何对象。如果这是用户添加的第一个项目,则尚未保存任何购物车,因此shop将为null。这就是为什么我们要做空检查;创建购物车,然后将其与“shop”键关联,以便用户下次添加项目时,购物车将与键“shop”关联


一旦我们有了一个与该特定用户的“shop”键相关联的shoppingcart,您应该会看到在多次提交时将项目添加到同一购物车对象。

但在这种情况下,购物车始终有1个项目,因为我每次初始化一个新的购物车。我如何初始化购物车并不断向其添加元素?对不起,Leon,你说得对。我在上面编辑了我的答案,以解释如何使用会话,这将完全回答您的问题。让我知道这是否有意义。感谢您的快速回复,我只想说我通过会话实现了它,现在每次添加产品时,它都会增加购物车中的产品数量,但始终会显示上次添加产品的价格。假设我有3个产品,最后一个价格是10,我会在我的购物车里看到3个10。它正在覆盖以前的值。我不理解,因为代码中的逻辑完全有道理。问题实际上是在产品类中。您已将所有实例变量设置为静态。这意味着所有产品实例都将共享这些变量。这不是你想要的--你希望他们每个人都有自己的数据。要做到这一点,只需从产品中的所有实例变量中删除static关键字。我甚至没有注意到产品类。谢谢。
HttpSession session = request.getSession(true);
shoppingcart shop = (shoppingcart)session.getValue("shop");
if(shop == null) {
    shop = new shoppingcart();
    session.putValue("shop", shop);
}

shop.ins(p);