一、分类的根据id删除

分析sql:

  1. delete from category where cid = ?

传参:cid

代码实现:

category_list.jsp

  1. <a href="javascript:void(0)" onclick="delByCid(${c.cid})" >删除</a>
  2. <script>
  3. //删除分类
  4. function delByCid(cid){
  5. if(confirm("是否确定删除呢?")){
  6. location.href = "/xm/category?method=delByCid&cid="+cid;
  7. }
  8. }
  9. </script>

Servlet:

  1. protected void delByCid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. //1、获取数据
  3. String cid = request.getParameter("cid");
  4. //2、调用业务
  5. CategoryService cs = new CategoryService();
  6. int row = cs.delByCid(cid);
  7. //3、结果展示
  8. if(row >0) {
  9. //删除成功
  10. response.sendRedirect("/xm/category?method=selectClistByPage&pageNumber=1");
  11. }else {
  12. response.getWriter().write("删除分类失败!!");
  13. }
  14. }

Service:

  1. public int delByCid(String cid) {
  2. // TODO Auto-generated method stub
  3. return cd.delByCid(cid);
  4. }

Dao:

  1. public int delByCid(String cid) {
  2. String sql = "delete from category where cid = ?";
  3. try {
  4. return qr.update(sql, cid);
  5. } catch (SQLException e) {
  6. // TODO Auto-generated catch block
  7. e.printStackTrace();
  8. return 0;
  9. }
  10. }

二、商品模块的环境准备

表结构

  1. CREATE TABLE `product` (
  2. `pid` INT(10) PRIMARY KEY AUTO_INCREMENT, #主键 自增
  3. `pname` VARCHAR(50) NOT NULL,#商品名称
  4. `color` VARCHAR(50),#商品颜色
  5. `price` DOUBLE NOT NULL,#价格
  6. `description` VARCHAR(500),#描述
  7. `pic` VARCHAR(200), # 图片
  8. `state` INT(5) DEFAULT '0',#0:普通 1:热门产品 2:为你推荐 3:新品 4:小米明星单品
  9. `version` VARCHAR(50), # 型号
  10. `product_date` DATETIME, # 生产日期
  11. cid INT(10) # 所属分类的主键
  12. ) ;

表关系:

  • 一对多、多对一(分类和商品)
  • 多对多(演员和角色)
  • 一对一(丈夫和妻子)

页面结构

  1. product_list.jsp 商品列表展示
  2. product_add.jsp:添加

product_update.jsp:修改

包结构:

  1. pojoservletservicedao

三:商品模块的分页查询

思路分析:

Day04笔记1 - 图1

代码实现:略

Product:

  1. public class Product {
  2. private Category category;
  3. ..
  4. }

Service:

  1. public PageBean<Product> selectPistByPage(PageBean<Product> pb) {
  2. //1、查询当前页的数据
  3. List<Product> result = pd.selectPlistByPage(pb);
  4. for(Product p : result) {
  5. //获取cid的值
  6. int cid = p.getCid();
  7. Category category = cd.selectByCid(cid+"");
  8. p.setCategory(category);
  9. }
  10. pb.setResult(result);
  11. //2、查询总记录数
  12. int totalCount = pd.selectCount();
  13. pb.setTotalCount(totalCount);
  14. return pb;
  15. }

product_list取出分类名称:

  1. <td>${p.category.cname}</td>

四、添加商品

1、跳转到添加商品页面

问题:直接跳转还是走数据库查询然后跳转?

因为跳转到添加页面时,需要回显所有分类名称,所以需要查询数据库

分析sql:

  1. select * from category

代码实现:

product_list.jsp

  1. <li onclick="toAdd()" style="cursor: pointer;" id="addProduct" ><span><img src="${pageContext.request.contextPath}/admin/images/t01.png" /></span>添加商品</li>
  2. <script type="text/javascript">
  3. //跳转到添加商品页面
  4. function toAdd(){
  5. location.href = "/xm/product?method=toAdd";
  6. }
  7. </script>

Servlet:

  1. //跳转到添加商品页面
  2. protected void toAdd(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  3. //1、获取数据(暂无)
  4. //2、调用业务
  5. CategoryService cs = new CategoryService();
  6. List<Category> clist = cs.selectClist();
  7. //3、结果的展示
  8. request.setAttribute("clist", clist);
  9. request.getRequestDispatcher("/admin/product_add.jsp").forward(request, response);
  10. }

Service:

  1. public List<Category> selectClist() {
  2. // TODO Auto-generated method stub
  3. return cd.selectClist();
  4. }

Dao:

  1. public List<Category> selectClist() {
  2. String sql = "select * from category";
  3. try {
  4. return qr.query(sql,new BeanListHandler<Category>(Category.class));
  5. } catch (SQLException e) {
  6. // TODO Auto-generated catch block
  7. e.printStackTrace();
  8. return null;
  9. }
  10. }

product_add.jsp

  1. <!-- 商品分类信息 -->
  2. <li>
  3. <label>商品分类</label>
  4. <select name="cid" class="dfinput">
  5. <option value="0">===请选择===</option>
  6. <c:if test="${not empty clist}">
  7. <c:forEach items="${clist}" var="c">
  8. <option value="${c.cid}">${c.cname}</option>
  9. </c:forEach>
  10. </c:if>
  11. </select>
  12. </li>

2、添加商品

思路:

页面:

  1. 文件上传:filepostenctype

Servlet:

  1. 获取所有参数列表、使用BeanUtils封装到product对象中
  2. @MultipartCongfiggetPart()、writer
  3. pic字段存什么值

代码:参考用户注册

五、网站前台首页—头部的显示

目前:访问的项目路径名写死了 ,如果后期更改了项目名,那么所有涉及之前项目名路径的地方都要进行修改

解决:动态获取项目名

  • Servlet:String contextPath = request.getContextPath();
  • Jsp:${pageContext.request.contextPath}

登录的两种情况:

  • 用户未登录:

    1. 显示 登录、注册 提示用户去注册登录
  • 用户已登录:

    1. 显示:欢迎您:xxx

如何判断用户是否登录了呢? 登录后将用户信息存到session中

代码:

UserService中登录成功将用户信息存到session中:

  1. if(code != null && (phoneNumber+code).equals(sessionCode)) {
  2. //3、登录成功
  3. request.getSession().setAttribute("qianUser", user);
  4. return "2";
  5. }

index.jsp中进行判断:

  1. <c:if test="${empty qianUser}">
  2. <a class="mix" href="${pageContext.request.contextPath}/login.jsp">登录 </a>
  3. <a href="${pageContext.request.contextPath}/register.jsp">注册</a>
  4. </c:if>
  5. <c:if test="${not empty qianUser}">
  6. <span><font color="red">欢迎您:${qianUser.username}</font> </span>
  7. </c:if>

六、动态查询分类名称显示在首页

思路:

  1. 登录成功----请求服务器从数据库中将所有分类查出来-----跳转到index.jsp-----取出数据

分析sql:

需求:展示的效果要进行排序,根据order_number 从小到大进行排序

  1. select * from category order by order_number asc;

代码实现:

login.jsp 登录成功请求Servlet

  1. else if(msg == "2"){
  2. //$("#msg").html("登录成功!!");
  3. //跳转到index.jsp
  4. //location.href = "${pageContext.request.contextPath}/index.jsp";
  5. location.href = "${pageContext.request.contextPath}/category?method=selectClist";
  6. }

Servlet:

  1. //查询所有分类
  2. protected void selectClist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  3. //1、获取数据
  4. //2、调用业务
  5. CategoryService cs = new CategoryService();
  6. List<Category> clist = cs.selectClist();
  7. //3、结果展示
  8. request.setAttribute("clist", clist);
  9. request.getRequestDispatcher("/index.jsp").forward(request, response);
  10. }

Service:

  1. public List<Category> selectClist() {
  2. // TODO Auto-generated method stub
  3. return cd.selectClist();
  4. }

Dao:

  1. public List<Category> selectClist() {
  2. String sql = "select * from category order by order_number asc";
  3. try {
  4. return qr.query(sql,new BeanListHandler<Category>(Category.class));
  5. } catch (SQLException e) {
  6. // TODO Auto-generated catch block
  7. e.printStackTrace();
  8. return null;
  9. }
  10. }

index.jsp:

  1. <!--动态展示 -->
  2. <c:if test="${not empty clist}">
  3. <c:forEach items="${clist}" var ="category">
  4. <li class="scr_li"><a href="">${category.cname}</a><i class="scr_i"></i></li>
  5. </c:forEach>
  6. </c:if>

问题:用户直接访问index.jsp时,不显示分类名称?

解决思路:

  • 在第一个用户访问index.jsp之前就 存好了分类信息
  • 服务器启动时查询分类名称,存到域对象中(如何做到??)

监听器Listener:监听到某种行为就采取某种操作

  1. 某种行为:服务器启动时
  2. 采取操作:执行方法查询分类信息

代码实现:

监听器:作用 服务器启动时执行

  1. @WebListener
  2. public class MyListener implements ServletContextListener {
  3. public void contextDestroyed(ServletContextEvent arg0) {
  4. }
  5. //服务器启动时执行
  6. public void contextInitialized(ServletContextEvent sce) {
  7. //查询分类信息
  8. CategoryService cs = new CategoryService();
  9. List<Category> clist = cs.selectClist();
  10. //3、结果展示
  11. sce.getServletContext().setAttribute("clist", clist);
  12. }
  13. }

login.jsp 登录成功直接跳转到index.jsp

  1. location.href = "${pageContext.request.contextPath}/index.jsp";

七、查询小米明星单品(前五条)

分析sql:

  1. select * from product where state = 4 limit 0,5;

代码实现:

MyListener:

  1. ProductService ps = new ProductService();
  2. List<Product> plist = ps.selectStarPlist();
  3. sce.getServletContext().setAttribute("starList", plist);

Service:

  1. public List<Product> selectStarPlist() {
  2. // TODO Auto-generated method stub
  3. return pd.selectStarPlist();
  4. }

Dao:

  1. public List<Product> selectStarPlist() {
  2. String sql = "select * from product where state = 4 limit 0,5;";
  3. try {
  4. return qr.query(sql, new BeanListHandler<Product>(Product.class));
  5. } catch (SQLException e) {
  6. // TODO Auto-generated catch block
  7. e.printStackTrace();
  8. return null;
  9. }
  10. }

八、点击商品跳转到商品详情页面

product_detail.jsp 负责商品数据的回显

分析sql:

  1. select * from product where pid = ?

index.jsp

  1. <a href="${pageContext.request.contextPath}/product?method=toProductDetail&pid=${star.pid}" target="_blank">
  2. <img class="time_min" style="width:234px;height: 234px;" src="/xm_upload/${star.pic}" alt="">
  3. </a>

Servlet:

  1. //跳转到商品详情页面
  2. protected void toProductDetail(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  3. String pid = request.getParameter("pid");
  4. ProductService ps = new ProductService();
  5. Product product = ps.selectByPid(pid);
  6. request.setAttribute("product", product);
  7. request.getRequestDispatcher("/product_detail.jsp").forward(request, response);
  8. }

Service:

  1. public Product selectByPid(String pid) {
  2. // TODO Auto-generated method stub
  3. return pd.selectByPid(pid);
  4. }

Dao:

  1. public Product selectByPid(String pid) {
  2. String sql = "select * from product where pid = ?";
  3. try {
  4. return qr.query(sql, new BeanHandler<Product>(Product.class),pid);
  5. } catch (SQLException e) {
  6. // TODO Auto-generated catch block
  7. e.printStackTrace();
  8. return null;
  9. }
  10. }

prodcut_detail.jsp

九、购物车分析&实现

如何封装购物车相关的数据:

思路:

  • 目标:在购物车页面进行数据的展示
  • 如果要进行数据展示:封装pojo中的JavaBean
  • 如何封装数据:根据已有的购物车页面分析

Day04笔记1 - 图2

JavaBean封装的实现:

  1. //购物项
  2. public class CartItem {
  3. //商品
  4. private Product product;
  5. //购买数量
  6. private int count;
  7. //小计
  8. private double subTotal;
  9. //计算小计
  10. public double getSubTotal() {
  11. return subTotal = (getProduct().getPrice())*getCount();
  12. }
  13. ....
  14. }
  1. //购物车
  2. public class Cart {
  3. /*
  4. * 问题:用什么集合存CartItem对象
  5. *
  6. * 需求:
  7. * 1、购物车中的商品是有序的
  8. * 2、移除购物车方便
  9. *
  10. * Set:无序不可重复 pass
  11. * List:有序可以重复 删除不方便 pass
  12. * Map<key,value> remove(key) LinkedHashMap(选它)
  13. * key:pid
  14. * value:CartIem
  15. * */
  16. private Map<Integer,CartItem> cartmap = new LinkedHashMap<Integer,CartItem>();
  17. //总价格
  18. private double total;
  19. //计算总价格
  20. public double getTotal() {
  21. total = 0.0;
  22. Set<Integer> keys = cartmap.keySet();
  23. for(Integer key:keys) {
  24. CartItem cartItem = cartmap.get(key);
  25. total += cartItem.getSubTotal();
  26. }
  27. return total;
  28. }
  29. ....
  30. }

逻辑分析:

点加入购物车按钮时,要传什么参数过去:

  1. pid、购买数量count

业务:将购物项对象加入到购物车对象中

  • 购物项对象
  • 购物车对象
  • 将购物项对象添加到购物车中