小项目-购物网站个别功能的具体实现思路-中(新手)
第六步:
/* * 根据用户需求添加商品进购物车。 * 首先需要判断用户是否已经进行了登录。 这就需要创建一个过滤器,进行登录请求的过滤。 * 如果用户登录了就获取用户的请求参数,如商品的名称、简介、数量等。 * 如果用户没有登录则需要在过滤器中进行拦截,使其跳转到登录界面。 * * 获取完用户的请求参数之后,需要判断商品是否已经加入购物车。 * 此处需要三个SQL语句: * 查询商品是否加入到购物车。 * 如果商品已经被添加则更新商品的数量。 * 如果没有则将商品添加进入购物车。 * 最后,添加成功则提示添加成功。 * 然后请求转发到原界面。 * * 该Servlet需要配合商品详细信息的JSp页面进行使用。 * */
第七步:
/* * 我的购物车所需要的Servlet。 * 用户点击我的购物车则跳转到此Servlet中,由此Servlet进行完一系列操作之后再转入负责展示数据的JSP页面 * 首先,需要获取到登录数据的关键字,判断用户是否登录,如果用户没有登录则跳转到登录界面。 * 如果用户已经登录过,则获取请求参数(uid),uid在我的数据库表中意为查询我当前账户所添加的所有商品信息。 * 获取请求参数之后调用DAO层,进行数据的查询。 * 最后共享参数和请求转发。 * * 该Servlet需要配合购物车的JSP界面进行使用。 * */
第八步:
/* * 根据用户需求删除购物车的某个商品。 * 获取请求参数,获取用户点击的商品的ID, * 调用DAO层的SQL语句进行删除。 * 请求转发到购物车界面。 * * 该Servlet需要配合购物车的JSp页面进行使用。 * */
第九步:
/* * 根据用户需求删除购物车所有的商品。 * 用户点击购物车删除所有商品按钮之后,则跳转到此Servlet。 * 然后通过Session和Map的键值对读取当前账户的uid,也就是获取购物车那张表里的输入当前账户的商品id * 第二步调取DAO层里的删除商品的SQL语句,对商品进行删除。 * 最后重定向到购物车界面。 * * 该Servlet需要配合购物车的JSP页面进行使用。 * */
第十步:
/* * 注销登录 * 用户点击注销登录按钮则跳转到此Servlet。 * 销毁Session,销毁之后,相当于将登陆信息全部清除。 * 然后重定向到主界面,因为没有数据的存在而且需要地址栏的改变,所以使用重定向。 * * 该Servlet需要配合个人中心的JSP页面进行使用。 * */
- (6)根据用户需求添加商品进购物车。
所需的Servlet:
@WebServlet("/Addcart.do") public class AddcartServlet extends HttpServlet { /* * 根据用户需求添加商品进购物车。 * 首先需要判断用户是否已经进行了登录。 这就需要创建一个过滤器,进行登录请求的过滤。 * 如果用户登录了就获取用户的请求参数,如商品的名称、简介、数量等。 * 如果用户没有登录则需要在过滤器中进行拦截,使其跳转到登录界面。 * * 获取完用户的请求参数之后,需要判断商品是否已经加入购物车。 * 此处需要三个SQL语句: * 查询商品是否加入到购物车。 * 如果商品已经被添加则更新商品的数量。 * 如果没有则将商品添加进入购物车。 * 最后,添加成功则提示添加成功。 * 然后请求转发到原界面。 * * 该Servlet需要配合商品详细信息的JSp页面进行使用。 * */ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 判断当前是否有用户登陆 Map islogin = (Map) req.getSession().getAttribute("W"); // 获取请求参数,商品的名称、简介、数量等。 String pid = req.getParameter("pid"); String num = req.getParameter("num"); Integer uid = (Integer) islogin.get("uid"); IProductDAO dao = new ProductDAOImpl(); // 判断商品是否已经加入购物车 if (dao.AddCart(pid,uid)){ // 如果商品已经被添加就更新商品的数量。 dao.updateCart(pid,num,uid); }else{ // 如果商品没有加入过购物车就将商品加入到购物车。 dao.insertCart(pid,num,uid); } // 如果添加成功,则提示添加成功 req.setAttribute("l","添加成功"); //请求转发。 req.getRequestDispatcher("/product").forward(req,resp); } }
所需要的JSp页面:
<body> <!-- 头部导航 --> <jsp:include page="/views/header.jsp"></jsp:include> <c:choose> <%--empty map 判断的是共享数据是否为空 而不是映射路径 --%> <c:when test="${empty map}"> <h1>对不起,暂无该商品信息</h1> </c:when> <c:otherwise> <div class="wrap"> <img src="${map.pimage}" /> <div class="description"> <form action="/shop/Addcart.do" method="post"> ${l} <h2>${map.pdesc}</h2> <div class="old_price"> 原价: <span> ¥${map.marketPrice} </span> </div> <div class="price"> 折扣价: <span> ¥${map.shopPrice} </span> </div> <div> 尺码:均码 </div> <div class="count"> 数量: <span class="s">-</span> <input type="text" value="1" name="num" class="num" /> <span class="s">+</span> </div> <input type="hidden" name="pid" value="${map.pid}" /> <div> <input type="submit" value="加入购物车" class="goods_cart" /> </div> <div> <input type="submit" value="立即购买" class="buy"/> </div> </form> </div> </div> </c:otherwise> </c:choose>
所需要的接口和实现类:
/* * 判断商品是否已经加入购物车 * 需要返回ID * */ boolean AddCart(String pid,Integer uid); /* * 添加商品进购物车 * 添加Pid、UId和商品数量。 * */ boolean insertCart(String uid,String pid,Integer num); /* * 数量的更新。 * 多次添加同一商品需要进行商品数量的更新 * */ boolean updateCart(String pid,String num,Integer uid); 实现类: /* * 判断商品是否已经加入购物车 * 需要返回ID * */ @Override public boolean AddCart(String pid, Integer uid) { String sql = "select * from car where pid = ? and uid = ?"; List<Map<String, Object>> list = DBUtil.excuteQuery(sql, pid, uid); return list.size()>0; } /* * 添加商品进购物车 * 添加Pid、UId和商品数量。 * */ @Override public boolean insertCart(String pid, String num,Integer uid) { String sql = "insert into car (uid,pid,num) values (?,?,?)"; return DBUtil.excuteUpdate(sql,uid,pid,num); } /* * 数量的更新。 * 多次添加同一商品需要进行商品数量的更新 * */ @Override public boolean updateCart(String pid, String num,Integer uid) { String sql = "update car set num = num+? where uid = ? and pid = ?"; return DBUtil.excuteUpdate(sql,num,uid,pid); }
流程:
根据绑定的ID获取到是哪个商品-进入Servlet中进行购物车是否有此商品的判断、如果有则更新数量、如果没有则添加进去-返回到JSP页面进行提示是否添加成功
- (7)点击进入我的购物车
所需的Servlet:
@WebServlet("/scart.do") public class ScartServlet extends HttpServlet { /* * 我的购物车所需要的Servlet。 * 用户点击我的购物车则跳转到此Servlet中,由此Servlet进行完一系列操作之后再转入负责展示数据的JSP页面 * 首先,需要获取到登录数据的关键字,判断用户是否登录,如果用户没有登录则跳转到登录界面。 * 如果用户已经登录过,则获取请求参数(uid),uid在我的数据库表中意为查询我当前账户所添加的所有商品信息。 * 获取请求参数之后调用DAO层,进行数据的查询。 * 最后共享参数和请求转发。 * * 该Servlet需要配合购物车的JSP界面进行使用。 * */ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取登录数据的关键字,判断是否登录
// W为前文登录时的关键字。
Map islogin = (Map) req.getSession().getAttribute("W"); // 获取请求参数。 Integer uid = (Integer) islogin.get("uid"); // 调用DAO层 IProductDAO dao = new ProductDAOImpl(); List<Map<String, Object>> allcar = dao.allcar(uid); // 共享参数。 req.setAttribute("Wcc",allcar); // 请求转发 req.getRequestDispatcher("/views/goodscart.jsp").forward(req,resp); } }
所需要的JSp页面:
<body> <!-- 头部导航 --> <jsp:include page="/views/header.jsp"></jsp:include> <!-- 購物車 --> <div class="wrap"> <div class="title"> <ul> <li><input type="checkbox" name="" id="" value="" /> 全选</li> <li>商品</li> <li>商品信息</li> <li>单价(元)</li> <li>数量</li> <li>小计(元)</li> <li>操作</li> </ul> </div> <c:forEach var="W" items="${Wcc}"> <div class="goods"> <ul> <li><img src="${W.pimage}"/> ${W.pname}</li> <li>尺碼:均碼</li> <li class="price">${W.pPrice}</li> <li> <div class="count"> <span class="s">-</span> <input type="text" value="${W.num}" name="num" class="num" /> <span class="s">+</span> </div> </li> <li class="subtotal">${W.pPrice}</li> <li> <a href="/shop/delete?oid=${W.oid}">刪除</a> </li> </ul> </div> </c:forEach> <div class="foot"> <ul> ${b} <li><a href="/shop/deletecar">全部刪除</a> <li>總價:¥<span style="color: red; font-size: 30px; font-weight: 600;" id="total">11111</span> <li><a href="#">去付款</a> </ul> </div> </div> </body>
所需要的接口和实现类:
/* * * 查询购物车 * */ List<Map<String,Object>> allcar(int uid); 实现类: /* * 查询购物车商品,使用多表联合查询。 * 多条查询使用List集合。 * */ @Override public List<Map<String, Object>> allcar(int uid) { String sql = "select c.oid,p.pname pname,p.shopPrice pPrice,p.pimage pimage,c.num " + "FROM car c " + "INNER JOIN product p ON p.pid= c.pid where c.uid=?"; return DBUtil.excuteQuery(sql,uid); }
流程:
用户点击我的购物车-进入Servlet获得现登录人员的id找出属于此用户的商品数据-反馈给JSP进行显示。
- (8)根据用户需求删除购物车的某个商品
所需的Servlet:
@WebServlet("/delete") public class DeletionCartServlet extends HttpServlet { /* * 根据用户需求删除购物车的某个商品。 * 获取请求参数,获取用户点击的商品的ID, * 调用DAO层的SQL语句进行删除。 * 请求转发到购物车界面。 * * 该Servlet需要配合购物车的JSp页面进行使用。 * */ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取请求参数。 String oid = req.getParameter("oid"); // 调用DAO获取SQL语句。 IProductDAO dao = new ProductDAOImpl(); dao.deleteCart(Integer.parseInt(oid)); // 请求转发。 req.getRequestDispatcher("/scart.do").forward(req,resp);// 和(7)相连接 } }
所需要的JSP页面:
<body> <!-- 头部导航 --> <jsp:include page="/views/header.jsp"></jsp:include> <!-- 購物車 --> <div class="wrap"> <div class="title"> <ul> <li><input type="checkbox" name="" id="" value="" /> 全选</li> <li>商品</li> <li>商品信息</li> <li>单价(元)</li> <li>数量</li> <li>小计(元)</li> <li>操作</li> </ul> </div> <c:forEach var="W" items="${Wcc}"> <div class="goods"> <ul> <li><img src="${W.pimage}"/> ${W.pname}</li> <li>尺碼:均碼</li> <li class="price">${W.pPrice}</li> <li> <div class="count"> <span class="s">-</span> <input type="text" value="${W.num}" name="num" class="num" /> <span class="s">+</span> </div> </li> <li class="subtotal">${W.pPrice}</li> <li> <a href="/shop/delete?oid=${W.oid}">刪除</a> </li> </ul> </div> </c:forEach> <div class="foot"> <ul> ${b} <li><a href="/shop/deletecar">全部刪除</a> <li>總價:¥<span style="color: red; font-size: 30px; font-weight: 600;" id="total">11111</span> <li><a href="#">去付款</a> </ul> </div> </div> </body>
所需要的接口和实现类:
/* * 删除购物车的某个商品 * * */ boolean deleteCart(int oid); 实现类: /* * 删除单条商品。 * */ @Override public boolean deleteCart(int oid) { String sql = "delete from car where oid= ?"; return DBUtil.excuteUpdate(sql,oid); }
流程:
用户点击删除,根据连接的地址和绑定的ID-转到Servlet处理业务-转到购物车JSp页面重新刷新JSp页面。
- (9)根据用户需求删除购物车的所有商品
所需的Servlet:
@WebServlet("/deletecar") public class DeletecarServlet extends HttpServlet { /* * 根据用户需求删除购物车所有的商品。 * 用户点击购物车删除所有商品按钮之后,则跳转到此Servlet。 * 然后通过Session和Map的键值对读取当前账户的uid,也就是获取购物车那张表里的输入当前账户的商品id * 第二步调取DAO层里的删除商品的SQL语句,对商品进行删除。 * 最后重定向到购物车界面。 * * 该Servlet需要配合购物车的JSP页面进行使用。 * */ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 通过Session和Map的键值对读取当前账户的uid,也就是获取购物车那张表里的输入当前账户的商品id Map user = (Map) req.getSession().getAttribute("W"); Integer uid = (Integer) user.get("uid"); // 调用DAO层。 IProductDAO dao = new ProductDAOImpl(); boolean b = dao.deleteCarts(uid); // 重定向到购物车界面。 resp.sendRedirect("/shop/scart.do");// 和(7)相连接
} }
所需要的JSp页面:
<body> <!-- 头部导航 --> <jsp:include page="/views/header.jsp"></jsp:include> <!-- 購物車 --> <div class="wrap"> <div class="title"> <ul> <li><input type="checkbox" name="" id="" value="" /> 全选</li> <li>商品</li> <li>商品信息</li> <li>单价(元)</li> <li>数量</li> <li>小计(元)</li> <li>操作</li> </ul> </div> <c:forEach var="W" items="${Wcc}"> <div class="goods"> <ul> <li><img src="${W.pimage}"/> ${W.pname}</li> <li>尺碼:均碼</li> <li class="price">${W.pPrice}</li> <li> <div class="count"> <span class="s">-</span> <input type="text" value="${W.num}" name="num" class="num" /> <span class="s">+</span> </div> </li> <li class="subtotal">${W.pPrice}</li> <li> <a href="/shop/delete?oid=${W.oid}">刪除</a> </li> </ul> </div> </c:forEach> <div class="foot"> <ul> ${b} <li><a href="/shop/deletecar">全部刪除</a> <li>總價:¥<span style="color: red; font-size: 30px; font-weight: 600;" id="total">11111</span> <li><a href="#">去付款</a> </ul> </div> </div> </body>
所需要的接口和实现类:
/* * 删除购物车的所有商品 * * */ boolean deleteCarts(int uid); 实现类: /* * 删除多条商品。 * */ @Override public boolean deleteCarts(int uid) { String sql = "delete from car where uid = ?"; return DBUtil.excuteUpdate(sql,uid); }
流程:
用户点击全部删除,跳转到负责处理此业务的Servlet-Servlet根据id信息删除商品-返回给JSp页面进行刷新展示。
- (10)用户注销
hear界面(进入个人中心的方式):
<div class="header_wrap"> <ul> <c:choose> <c:when test="${empty W}"> <li><a href="/shop/views/login.jsp">登录</a></li> <li><a href="/shop/views/register.jsp">注册</a></li> </c:when> <c:otherwise> <li>欢迎您,尊敬的VIP:<a href="/shop/views/persional.jsp">${W.username}</a></li> </c:otherwise> </c:choose> <li><a href="#">我的收藏</a></li> <li><a href="/shop/scart.do">我的购物车</a></li> <li><a href="#">我的订单</a></li> <li><a href="#">帮助中心</a></li> <li><a href="#">商家后台</a></li> </ul> </div>
被跳转的JSP页面:
body> <fieldset> <legend> 欢迎来到您的个人中心 </legend> <div> <ul> <li><a href="/shop/LoginOut">注销当前账户</a></li> <li><a href="/shop/home" >点击返回首页</a></li> <li><a href="/shop/views/login.jsp">返回登陆界面</a></li> <li><a href="/shop/views/login.jsp">点击修改密码</a></li> </ul> </div> <iframe name="show" width="65%" height="85%"></iframe> </fieldset> </body>
所需要的Servlet:
@WebServlet("/LoginOut") public class LoginOutServlet extends HttpServlet { /* * 注销登录 * 用户点击注销登录按钮则跳转到此Servlet。 * 销毁Session,销毁之后,相当于将登陆信息全部清除。 * 然后重定向到主界面,因为没有数据的存在而且需要地址栏的改变,所以使用重定向。 * * 该Servlet需要配合个人中心的JSP页面进行使用。 * */ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 销毁Session,销毁之后,相当于将登陆信息全部清除。 req.getSession().invalidate(); // 注销账号之后,重定向到主界面 resp.sendRedirect("/shop/home"); } }
流程:
用户进入个人中心-跳转到负责展示JSP,点击注销账户-进入Servlet处理业务。