簡體   English   中英

在servlet的jsp文件中顯示購物車中的項目

[英]Display the items in the cart in a jsp file from servlet

我正在用Java構建一個電子商務簡單解決方案,我陷入了一個關鍵時刻。 我無法顯示正確的項目。 我正在使用具有doGet shoppingcart類,products類和viewcart.jsp文件的servlet。 為了在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 {

}

}

產品.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>");
}
%>

造成您問題的原因是,您已經在Servlet中將shoppingcart設置為實例變量。 這意味着您的Servlet處理的每個HTTP請求都共享同一個購物車 要解決此問題,請從類定義代碼中移出以下行:

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調用都將共享實例變量。 如果要存儲特定用戶的信息,請考慮將其放入會話中。

- - 編輯 - -

事實證明,我實際上沒有回答這個問題。 為了使添加的項目保持連續運行,您必須將這些項目保存到一個不會被任何人共享的位置-只有特定用戶的數據將保存到該位置。 會議是專門為此目的設計的。 您可以在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 這就是為什么我們要進行空檢查; 創建購物車,然后將其與“商店”鍵相關聯,以便用戶下次添加商品時,購物車將與“商店”鍵相關聯。

一旦我們有了一個與該特定用戶的“商店”鍵相關聯的購物車 ,你應該看到正在向同車對象的項目,如多次提交制成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM