【JavaWeb】网上蛋糕项目商城-关键字搜索,购物车以及商品详情功能

news2024/9/24 21:54:41

概念

上文中已经实现热销和新品的商品列表功能,本文篇幅中实现关键字搜索商品,将商品加入购物车,以及查看商品的详情信息等功能

关键字搜索实现步骤

在head.jsp头部页面中,鼠标移动至搜索图标会显示隐藏的搜索框进行输入关键信息搜索

当输入关键信息后,点击搜索,将用户输入的内容以表单提交的方法,提交给服务器,因此需要在servlet包中创建GoodsSearchServlet类接收浏览器的关键字信息进行模糊查询,同时也将查询出来的多个商品进行分页展示

package servlet;

import service.GoodsService;
import model.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;

@WebServlet(name = "goods_search",urlPatterns = "/goods_search")
public class GoodsSearchServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    private GoodsService gService = new GoodsService();
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String keyword = request.getParameter("keyword");
        int pageNumber = 1;
        if(request.getParameter("pageNumber") != null) {
            try {
                pageNumber=Integer.parseInt(request.getParameter("pageNumber") ) ;
            }
            catch (Exception e)
            {

            }
        }
        if(pageNumber<=0)
        {
            pageNumber=1;
        }
        Page p =gService.getSearchGoodsPage(keyword,pageNumber);

        if(p.getTotalPage()==0)
        {
            p.setTotalPage(1);
            p.setPageNumber(1);
        }
        else {
            if(pageNumber>=p.getTotalPage()+1)
            {
                p =gService.getSearchGoodsPage(keyword,pageNumber);
            }
        }
        request.setAttribute("p", p);
        request.setAttribute("keyword", URLEncoder.encode(keyword,"utf-8"));
        request.getRequestDispatcher("/goods_search.jsp").forward(request, response);
    }

}

以上代码中,接收浏览器的参数,并判断用户是否指定了显示的页码,如果没有指定,则默认为第一页,将关键字信息以及页码发送给业务逻辑层执行,因此需要在GoodsService类中定义方法getSearchGoodsPage

//根据关键字搜索商品信息
    public Page getSearchGoodsPage(String keyword, int pageNumber) {
        Page p = new Page();
        p.setPageNumber(pageNumber);
        int totalCount = 0;
        try {
//       totalCount = gDao.getGoodsCount(typeId);
            totalCount = gDao.getSearchCount(keyword);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        p.SetPageSizeAndTotalCount(8, totalCount);
        List list=null;
        try {
//       list = gDao.selectGoods(keyword, pageNo, 8);
            list = gDao.selectSearchGoods(keyword,pageNumber,8);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        p.setList(list);
        return p;
    }

以上代码中,需要根据关键字查询相关的商品总数量以及根据关键字,页码以及显示数量作为条件查询商品信息两个sql操作,因此需要在GoodsDao中定义对应的两个方法

public int getSearchCount(String keyword) throws SQLException {
    QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
    String sql = "select count(*) from goods where name like ?";
    return r.query(sql, new ScalarHandler<Long>(),"%"+keyword+"%").intValue();
}
public List<Goods> selectSearchGoods(String keyword, int pageNumber, int pageSize) throws SQLException{
    QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
    String sql = "select * from goods where name like ? limit ?,?";
    return r.query(sql, new BeanListHandler<Goods>(Goods.class),"%"+keyword+"%",(pageNumber-1)*pageSize,pageSize);
}

最后servlet将数据信息发送给goods_search.jsp页面显示

<%@ page language="java" contentType="text/html; charset=utf-8"
       pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE html>
<html>
<head>
   <title>首页</title>
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <link type="text/css" rel="stylesheet" href="css/bootstrap.css">
   <link type="text/css" rel="stylesheet" href="css/style.css">
   <script type="text/javascript" src="js/jquery.min.js"></script>
   <script type="text/javascript" src="js/bootstrap.min.js"></script>
   <script type="text/javascript" src="js/simpleCart.min.js"></script>
   <script type="text/javascript" src="layer/layer.js"></script>
   <script type="text/javascript" src="js/cart.js"></script>
</head>
<body>
<jsp:include page="/header.jsp">
   <jsp:param value="8" name="flag"/>
</jsp:include>

<div class="products">
   <div class="container">
      <h2> 搜索 ‘${param.keyword }’的结果 </h2>

      <div class="col-md-12 product-model-sec">

         <c:forEach items="${p.list }" var="g">
            <div class="product-grid">
               <a href="${pageContext.request.contextPath }/goods_detail?id=${g.id}">
                  <div class="more-product"><span> </span></div>
                  <div class="product-img b-link-stripe b-animate-go  thickbox">
                     <img src="${pageContext.request.contextPath }${g.cover}" class="img-responsive" alt="${g.name }" width="240" height="240">
                     <div class="b-wrapper">
                        <h4 class="b-animate b-from-left  b-delay03">
                           <button>查看详情</button>
                        </h4>
                     </div>
                  </div>
               </a>
               <div class="product-info simpleCart_shelfItem">
                  <div class="product-info-cust prt_name">
                     <h4>${g.name }</h4>
                     <span class="item_price">¥ ${g.price }</span>
                     <input type="button" class="item_add items" value="加入购物车" onclick="buy(${g.id})">
                     <div class="clearfix"> </div>
                  </div>
               </div>
            </div>
         </c:forEach>

         <div class="clearfix"> </div>
      </div>
      <div>
         <jsp:include page="page.jsp">
            <jsp:param name="url" value="/goods_search"></jsp:param>
            <jsp:param name="param" value="&keyword=${keyword}"></jsp:param>
         </jsp:include>
      </div>
   </div>
</div>
<jsp:include page="/footer.jsp"></jsp:include>

</body>
</html>

其页面效果如下

商品详情实现步骤

查看商品详情的功能在以上各篇文章中都需要涉及,首页中的轮播图商品,热销,新品,商品分类以及商品关键字搜索,甚至后面的购物车功能中都需要查看商品的详情信息,因此这个模块很重要。

那么我们不管从哪个功能上查看的商品,如果需要查看该商品详情信息,那么必须向服务器发送请求并将该商品编号发送给服务器

因此,我们在servlet包中创建GoodsDetailServlet类,用于根据用户传递的商品编号查询商品信息

package servlet;

import model.Goods;
import service.GoodsService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "goods_detail",urlPatterns = "/goods_detail")
public class GoodsDetailServlet extends HttpServlet {

    private GoodsService gService = new GoodsService();
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int id = Integer.parseInt(request.getParameter("id"));
        Goods g = gService.getGoodsById(id);
        request.setAttribute("g", g);
        request.getRequestDispatcher("/goods_detail.jsp").forward(request, response);
    }
}

接着servlet将接收的商品编号传递给业务逻辑层执行,需要在GoodsService类中定义执行的方法

//根据商品id查询商品信息
public Goods getGoodsById(int id) {
    Goods g=null;
    try {
        g = gDao.getGoodsById(id);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return g;
}

接着业务逻辑层将商品编号传递给dao层执行sql操作,并将查询的数据进行封装返回

public Goods getGoodsById(int id) throws SQLException {
    QueryRunner r = new QueryRunner(DataSourceUtils.getDataSource());
    String sql = "select g.id,g.name,g.cover,g.image1,g.image2,g.price,g.intro,g.stock,t.id typeid,t.name typename from goods g,type t where g.id = ? and g.type_id=t.id";
    return r.query(sql, new BeanHandler<Goods>(Goods.class),id);
}

最后servlet将接收返回的数据发送给goods_detail.jsp页面显示

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
   <title>商品详情</title>
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <link type="text/css" rel="stylesheet" href="css/bootstrap.css">
   <link type="text/css" rel="stylesheet" href="css/style.css">
   <link type="text/css" rel="stylesheet" href="css/flexslider.css">
   <script type="text/javascript" src="js/jquery.min.js"></script>
   <script type="text/javascript" src="js/jquery.flexslider.js"></script>
   <script type="text/javascript" src="js/bootstrap.min.js"></script>
   <script type="text/javascript" src="layer/layer.js"></script>
   <script type="text/javascript" src="js/cart.js"></script>
   <script>
      $(function() {
        $('.flexslider').flexslider({
         animation: "slide",
         controlNav: "thumbnails"
        });
      });
   </script>
</head>
<body>
    <jsp:include page="/header.jsp"></jsp:include>
   <div class="single">
      <div class="container">
         <div class="single-grids">          
            <div class="col-md-4 single-grid">    
               <div class="flexslider">
                  
                  <ul class="slides">
                     <li data-thumb="${g.cover}">
                        <div class="thumb-image"> <img src="${g.cover}" data-imagezoom="true" class="img-responsive"> </div>
                     </li>
                     <li data-thumb="${g.image1}">
                         <div class="thumb-image"> <img src="${g.image1}" data-imagezoom="true" class="img-responsive"> </div>
                     </li>
                     <li data-thumb="${g.image2}">
                        <div class="thumb-image"> <img src="${g.image2}" data-imagezoom="true" class="img-responsive"> </div>
                     </li> 
                  </ul>
               </div>
            </div> 
            <div class="col-md-4 single-grid simpleCart_shelfItem">       
               <h3>${g.name}</h3>
               <div class="tag">
                  <p>分类 : <a href="goods_list?typeid=${g.type.id}">${g.type.name}</a></p>
               </div>
               <p>${g.intro}</p>
               <div class="galry">
                  <div class="prices">
                     <h5 class="item_price">¥ ${g.price}</h5>
                  </div>
                  <div class="clearfix"></div>
               </div>
               <div class="btn_form">
                  <a href="javascript:;" class="add-cart item_add" onclick="buy(${g.id})">加入购物车</a>
               </div>
            </div>
            <div class="col-md-4 single-grid1">
               <!-- <h2>商品分类</h2> -->
               <ul>
                        <li><a  href="/goods_list">全部系列</a></li>

                        <c:forEach items="${typeList}" var="t">
                            <li><a href="/goods_list?typeid=${t.id}">${t.name}</a></li>
                        </c:forEach>
               </ul>
            </div>
            <div class="clearfix"> </div>
         </div>
      </div>
   </div>
    <jsp:include page="/footer.jsp"></jsp:include>
</body>
</html>

其页面效果如下

所有商品列表页面中,都能点击商品进行该查看商品详情信息页面,这里不再一一讲解。

购物车实现步骤

该项目中会存在“立即购买”和“加入购物车”的字样,这里都表示为将该商品添加至购物车,这里的购物车是临时存储,并不会添加到数据库中进行存储,只有用户注册登录之后,才能将购物车中的数据进行购买,形成购买订单信息。

那么当这些按钮被点击时,需要向服务器发送请求

 被点击时,都将会触发按钮的点击事件执行buy方法,并携带当前商品编号,该方法中对加入购物车的库存进行判断,这里采用Ajax的请求方式访问服务器,并且接收服务器返回的数据信息

因此需要在servlet包中创建GoodsBuyServlet类,接收用户的加入购物车的请求

package servlet;

import model.Goods;
import model.Order;
import service.GoodsService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "goods_buy",urlPatterns = "/goods_buy")
public class GoodsBuyServlet extends HttpServlet {
    private GoodsService gService = new GoodsService();
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Order o = null;
        if(request.getSession().getAttribute("order") != null) {
            o = (Order) request.getSession().getAttribute("order");
        }else {
            o = new Order();
            request.getSession().setAttribute("order", o);
        }
        int goodsid = Integer.parseInt(request.getParameter("goodsid"));
        Goods goods = gService.getGoodsById(goodsid);
        if(goods.getStock()>0) {
            o.addGoods(goods);
            response.getWriter().print("ok");
        }else {
            response.getWriter().print("fail");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

以上代码中,需要封装订单实体类,判断当前加入购物车的商品是否还有库存,如果有则将该商品添加至订单实体类中,并返回用户ok,否则返回用户fail,表示当前商品没有库存。在model包中创建Order实体类

package model;

import utils.PriceUtils;

import java.util.*;

public class Order {
    private int id;
    private float total;//总价
    private int amount;// 商品总数
    private int status;//1未付款/2已付款/3已发货/4已完成
    private int paytype;//1微信/2支付宝/3货到付款
    private String name;
    private String phone;
    private String address;
    private Date datetime;
    private User user;
    private Map<Integer,OrderItem> itemMap = new HashMap<Integer,OrderItem>();
    private List<OrderItem> itemList = new ArrayList<OrderItem>();

    public void setUsername(String username) {
        user = new User();
        user.setUsername(username);
    }
    public void addGoods(Goods g) {
        if(itemMap.containsKey(g.getId())) {
            OrderItem item = itemMap.get(g.getId());
            item.setAmount(item.getAmount()+1);
        }else {
            OrderItem item = new OrderItem(g.getPrice(),1,g,this);
            itemMap.put(g.getId(), item);
        }
        amount++;
        total = PriceUtils.add(total, g.getPrice());
    }

    public List<OrderItem> getItemList() {
        return itemList;
    }

    public void setItemList(List<OrderItem> itemList) {
        this.itemList = itemList;
    }

    public void lessen(int goodsid) {
        if(itemMap.containsKey(goodsid)) {
            OrderItem item = itemMap.get(goodsid);
            item.setAmount(item.getAmount()-1);
            amount--;
            total = PriceUtils.subtract(total, item.getPrice());
            if(item.getAmount()<=0) {
                itemMap.remove(goodsid);
            }
        }
    }
    public void delete(int goodsid)
    {
        if(itemMap.containsKey(goodsid)) {
            OrderItem item = itemMap.get(goodsid);
            total = PriceUtils.subtract(total, item.getAmount()*item.getPrice());
            amount-=item.getAmount();
            itemMap.remove(goodsid);
        }
    }

    public Map<Integer, OrderItem> getItemMap() {
        return itemMap;
    }

    public void setItemMap(Map<Integer, OrderItem> itemMap) {
        this.itemMap = itemMap;
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public float getTotal() {
        return total;
    }
    public void setTotal(float total) {
        this.total = total;
    }
    public int getAmount() {
        return amount;
    }
    public void setAmount(int amount) {
        this.amount = amount;
    }
    public int getStatus() {
        return status;
    }
    public void setStatus(int status) {
        this.status = status;
    }
    public int getPaytype() {
        return paytype;
    }
    public void setPaytype(int paytype) {
        this.paytype = paytype;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public Date getDatetime() {
        return datetime;
    }
    public void setDatetime(Date datetime) {
        this.datetime = datetime;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public Order() {
        super();
    }
}

以上Order实体类中,为后期用户提交订单购物商品做准备,需要封装用户信息实体类User,以及多个商品子订单实体类OrderItem,因此需要创建封装该两个实体类

package model;

public class User {
    private int id;
    private String username;
    private String email;
    private String password;
    private String name;
    private String phone;
    private String address;
    private boolean isadmin=false;
    private boolean isvalidate=false;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", email=" + email + ", password=" + password + ", name="
                + name + ", phone=" + phone + ", address=" + address + ", isadmin=" + isadmin + ", isvalidate="
                + isvalidate + "]";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public boolean isIsadmin() {
        return isadmin;
    }
    public void setIsadmin(boolean isadmin) {
        this.isadmin = isadmin;
    }
    public boolean isIsvalidate() {
        return isvalidate;
    }
    public void setIsvalidate(boolean isvalidate) {
        this.isvalidate = isvalidate;
    }
    public User(int id, String username, String email, String password, String name, String phone, String address,
                boolean isadmin, boolean isvalidate) {
        super();
        this.id = id;
        this.username = username;
        this.email = email;
        this.password = password;
        this.name = name;
        this.phone = phone;
        this.address = address;
        this.isadmin = isadmin;
        this.isvalidate = isvalidate;
    }
    public User( String username, String email, String password, String name, String phone, String address) {
        this.username = username;
        this.email = email;
        this.password = password;
        this.name = name;
        this.phone = phone;
        this.address = address;
        this.isadmin = false;
        this.isvalidate = false;
    }
    public User() {
        super();
    }


}
package model;

public class OrderItem {
    private int id;
    private float price;
    private int amount;
    private String goodsName;
    private Goods goods;
    private Order order;// order_id

    public void setName(String name) {
        this.goodsName=name;
    }

    public String getGoodsName() {
        return goodsName;
    }

    public void setGoodsName(String goodsName) {
        this.goodsName = goodsName;
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
    public int getAmount() {
        return amount;
    }
    public void setAmount(int amount) {
        this.amount = amount;
    }
    public Goods getGoods() {
        return goods;
    }
    public void setGoods(Goods goods) {
        this.goods = goods;
    }
    public Order getOrder() {
        return order;
    }
    public void setOrder(Order order) {
        this.order = order;
    }
    public OrderItem() {
        super();
    }
    public OrderItem(float price, int amount, Goods goods, Order order) {
        super();
        this.price = price;
        this.amount = amount;
        this.goods = goods;
        this.order = order;
    }
}

其页面效果如下

点击购物车图标,进行查看当前购物车中的商品

在head.jsp头部页面中点击购物车图标,触发超链接,直接跳转至购物车页面,因为购物车的商品信息只是临时存储在Order实体类中,而并没有存储至数据库,因此不需要查询数据库

接着创建该购物车页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE html>
<html>
<head>
   <title>购物车</title>
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <link type="text/css" rel="stylesheet" href="css/bootstrap.css">
   <link type="text/css" rel="stylesheet" href="css/style.css">
   <script type="text/javascript" src="js/jquery.min.js"></script>
   <script type="text/javascript" src="js/bootstrap.min.js"></script>
   <script type="text/javascript" src="layer/layer.js"></script>
   <script type="text/javascript" src="js/cart.js"></script>
</head>
<body>
   <jsp:include page="header.jsp">
      <jsp:param name="flag" value="7"></jsp:param>
   </jsp:include>
   <div class="cart-items">
      <div class="container">
         <h2>我的购物车</h2>
         <c:forEach items="${order.itemMap }" var="item">
            <div class="cart-header col-md-6">
               <div class="cart-sec simpleCart_shelfItem">
                  <div class="cart-item cyc">
                     <a href="/goods_detail?id=${item.key}">
                        <img src="${pageContext.request.contextPath }${item.value.goods.cover}" class="img-responsive">
                     </a>
                  </div>
                  <div class="cart-item-info">
                     <h3><a href="/goods_detail?id=${item.key}">${item.value.goods.name}</a></h3>
                     <h3><span>单价: ¥ ${item.value.price}</span></h3>
                     <h3><span>数量: ${item.value.amount}</span></h3>
                     <a class="btn btn-info" href="javascript:buy(${item.key});">增加</a>
                     <a class="btn btn-warning" href="javascript:lessen(${item.key});">减少</a>
                     <a class="btn btn-danger" href="javascript:deletes(${item.key});">删除</a>
                  </div>
                  <div class="clearfix"></div>
               </div>
            </div>
         </c:forEach>
         
         <div class="cart-header col-md-12">
            <hr>
            <h3>订单总金额: ¥ ${order.total}</h3>
            <a class="btn btn-success btn-lg" style="margin-left:74%" href="/order_submit">提交订单</a>
         </div>
      </div>
   </div>
   <jsp:include page="footer.jsp"></jsp:include>

</body>
</html>

 其页面效果如下

以上效果图中,点击增加,则会触发JavaScript事件Buy方法,点击减少会触发lessen方法,点击删除会触发deletes方法,其代码如下

该方法会通过Ajax向服务器发送请求,从Order实体类中减少商品数量,因此需要创建GoodsLessenServlet类,其代码如下

package servlet;

import model.Order;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "goods_lessen",urlPatterns = "/goods_lessen")
public class GoodsLessenServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Order o = (Order) request.getSession().getAttribute("order");
        int goodsid = Integer.parseInt(request.getParameter("goodsid"));
        o.lessen(goodsid);
        response.getWriter().print("ok");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

 

该方法会通过Ajax向服务器发送请求,从Order实体类中删除该商品,因此需要创建GoodsDeleteServlet类,其代码如下

package servlet;

import model.Order;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "goods_delete",urlPatterns = "/goods_delete")
public class GoodsDeleteServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Order o = (Order) request.getSession().getAttribute("order");
        int goodsid = Integer.parseInt(request.getParameter("goodsid"));
        o.delete(goodsid);
        response.getWriter().print("ok");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1644485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构(C):玩转链表

&#x1f37a;0.前言 言C之言&#xff0c;聊C之识&#xff0c;以C会友&#xff0c;共向远方。各位博友的各位你们好啊&#xff0c;这里是持续分享数据结构知识的小赵同学&#xff0c;今天要分享的数据结构知识是链表&#xff0c;在这一章&#xff0c;小赵将会向大家展开聊聊链表…

c语言排序算法之八(桶排序)

前言 以下内容是被验证可以有效理解桶排序&#xff0c;代码也较容易理解。如果你发现还有很多需要增加的&#xff0c;欢迎留言。 为什么要单独写排序算法这一系列&#xff0c;看过一些贴子普遍篇幅较长。看完依旧难以直观理解原理及整个过程。代码永远是基于理解的基础上才能…

Carla基础 | Carla预编译版安装与ROS联合仿真图文教程

目录 1 什么是Carla&#xff1f;2 Carla预编译版安装2.1 独立显卡配置2.2 安装ROS2.3 启动虚拟环境2.4 安装Carla预编译版2.5 安装carla-ros-bridge 3 测试案例常见问题 1 什么是Carla&#xff1f; Carla是由西班牙巴塞罗那自治大学计算机视觉中心指导开发的开源仿真模拟器&…

Redis-五大数据类型-Set(集合)

五大数据类型-Set&#xff08;集合&#xff09; 简介 与List类似是一个列表功能&#xff0c;但Set是自动排重的&#xff0c;当需要存储一个列表数据&#xff0c;又不希望出现重复数据时&#xff0c;Set是一个很好的选择。 Set是String类型的无序集合&#xff0c;它底层其实是…

学生宿舍智能电表系统改造升级意义

石家庄光大远通电气有限公司学生宿舍智能电表控制系统改造升级功能与意义** 一、实时监测 宿舍智能电表控制系统具备实时监测功能&#xff0c;能够实时收集、记录和分析每个宿舍的用电数据。这种监测不仅可以帮助管理者掌握用电情况&#xff0c;还可以为用户提供详细的用电报…

重生奇迹mu魔剑士怎么转职

重生奇迹MU中的魔剑士怎么才可以转职? 随便建个角色升级到220级&#xff0c;然后小退重建就有魔剑士了。另外魔剑不用二转。400的三转和其他职业一样。 战士不能转魔剑的。当帐号中已经拥有一位等级超过220级以上的角色时&#xff0c;才可以创造职业为魔剑士的新角色。 魔剑…

gcc编译器分析

gcc编译器分析 参考词法分析语法分析预读一个符号语法分析函数调用关系重点函数分析c_parse_filec_parser_translation_unit 参考 《gcc源码分析》 词法分析 词法分析的过程就是将源代码识别成一个一个的词法符号&#xff0c;并在词法分析的过程中创建一些树节点&#xff0c…

YashanDB与帆软信创商业智能软件完成兼容互认证

近日&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB与帆软信创商业智能软件&#xff08;V6.0&#xff09;顺利完成兼容性互认证&#xff0c;经严格测试&#xff0c;双方产品能够相互兼容&#xff0c;稳定运行。 崖山数据库系统YashanDB是深圳计算科学研究院自主研发设计…

一分钱不花从HTTP升级到HTTPS

HTTP升级到HTTPS是一个涉及安全性和技术实施的过程&#xff0c;主要目的是为了提升网站数据传输的安全性&#xff0c;防止数据被窃取或篡改。以下是一些关于从HTTP升级到HTTPS的技术性要点和步骤概述&#xff0c;结合上述信息资源&#xff1a; 一、理解HTTPS的重要性 HTTPS (…

[图解]SysML和EA建模住宅安全系统-01

1 00:00:00,980 --> 00:00:03,100 接下来&#xff0c;我们来看一下案例 2 00:00:04,930 --> 00:00:06,750 我们这次课程的案例 3 00:00:07,090 --> 00:00:13,800 选用了SysML实用指南的书上 4 00:00:13,810 --> 00:00:16,180 第十七章这个案例 5 00:00:16,350 …

《QT实用小工具·五十六》自适应界面变化的控件

1、概述 源码放在文章末尾 该项目实现了网格显示多张带文字的图片在界面中自适应布局 特点 跟随窗口大小变换位置&#xff0c;并带移动动画 响应鼠标事件&#xff0c;图片缩放动画 点击水波纹动画 项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #i…

​可视化大屏C位图:3D模型,可视化大屏的画龙点睛之处

Hello&#xff0c;我是大千UI工场&#xff0c;本期可视化大屏的焦点图&#xff08;C位&#xff09;分享将图表作为焦点图的情形&#xff0c;欢迎友友们关注、评论&#xff0c;如果有订单可私信。 3D模型在可视化大屏中有很大的价值&#xff0c;以下是一些相关的优点&#xff1a…

优优嗨聚集团:法律明灯,个债处理中的法律咨询力量

在现代社会&#xff0c;个人债务问题日益突出&#xff0c;无论是因生活消费、投资失利还是其他原因&#xff0c;债务问题都可能成为个人财务的一大负担。面对复杂的债务困境&#xff0c;许多人感到迷茫和无助。此时&#xff0c;法律咨询如同一盏明灯&#xff0c;能够为个人债务…

GEE数据集——全球冰川海拔变化产品(2000-2019 年)

全球冰川海拔变化产品&#xff08;2000-2019 年&#xff09; 该数据集提供了 2000 年至 2019 年期间冰川海拔和质量变化的全面且全球一致的记录。它利用大量卫星图像&#xff08;主要来自美国国家航空航天局&#xff08;NASA&#xff09;的高级星载热发射和反射辐射计&#xf…

ABAP开发(1)事物代码

文章目录 1、查看系统部分功能的T-code2、T-code使用3、查看未知程序的T-code4、常用T-code 在SAPGUI中&#xff0c;事务代码&#xff08;transaction code&#xff09;&#xff0c;简称T-code&#xff0c;是一个特定的编号&#xff0c;支持自定义&#xff0c;使用户能够快速访…

【AI+音视频总结】如何在几分钟内用智能工具摘取音视频精华?揭秘下一代学习和内容创作神器!

今天无意发现一个网站&#xff0c;可以一步到位完成AI音视频总结。 我之前对于音视频总结的步骤还是借助 工具下载 剪映来完成的。详情可以参考之前写的一篇文章 【AI应用】模仿爆款视频二次创作短视频操作步骤 。 这里介绍的网站是 BibiGPT 。 BibiGPT AI 音视频助理 - 它是…

项目管理-项目沟通管理

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 1.项目沟通管理-主要内容 项目沟通管理过程--重点&#xff1a; ①ITTO 输入&#xff0c;输出工具和技术。 ②问题和解决方案。 ③论文…

公共代理IP和独享代理IP之间的区别?

公共代理IP和独享代理IP在网络应用中扮演着不同的角色&#xff0c;它们之间的区别主要体现在使用方式、性能、安全性以及隐私保护等方面。以下是对这两种代理IP的详细对比和分析。 第一点就是使用的方式以及成本上的不同&#xff0c;公共代理IP&#xff0c;顾名思义&#xff0…

同向双指针(滑动窗口)算法

209. 长度最小的子数组 这里的更新结果就题来定 class Solution {public int minSubArrayLen(int target, int[] nums) {int sum 0;int len 0;int f 0;for(int left 0, right 0; right < nums.length;){//求和sum nums[right];while(sum > target){//lenint t ri…

浪漫编码:手把手教你实现校园表白墙功能

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;浪漫编码&#xff1a;手把手教你实现校园表白墙功能 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 这里写目录标题 表白墙数据准备引入MyBatis和MySQL驱动依赖…