Javaweb学习-书城项目相关

资料来源于:B站尚硅谷JavaWeb教程(全新技术栈,全程实战) ,本人才疏学浅,记录笔记以供日后回顾
由于是多个视频内容混合在一起,因此只放了第一个链接
本文参考价值不高,随便写写罢了
视频链接

讲师的大致思考逻辑及需要实现的功能

第一日内容:
1. 需求分析
2. 数据库设计
 1) 实体分析
    - 图书                Book
    - 用户                User
    - 订单                OrderBean
    - 订单详情             OrderItem
    - 购物车项             CartItem
 2) 实体属性分析
    - 图书 : 书名、作者、价格、销量、库存、封面、状态
    - 用户 : 用户名、密码、邮箱
    - 订单 : 订单编号、订单日期、订单金额、订单数量、订单状态、用户
    - 订单详情 : 图书、数量、所属订单
    - 购物车项 : 图书、数量、所属用户

第二日内容:
1. 显示主页面(index页面)
  - 新建BookDAO 、 BookDAOImpl : getBookList()
  - 新建BookService 、 BookServiceImpl : getBookList()
  - 新建BookController : index()
  - 编辑index.html
2. 首页上登录成功之后显示欢迎语和购物车数量
3. 点击具体图书的添加到购物车按钮
4. 购物车详情
5. 结账
   1) 订单表添加一条记录
   2) 订单详情表添加7条记录
   3) 购物车项表中需要删除对应的7条记录
6. 关于订单信息中的订单数量问题
7. 编辑购物车
8. 关于金额的精度问题
9. 过滤器判断是否是合法用户:
   - 解决方法:新建SessionFilter , 用来判断session中是否保存了currUser
   - 如果没有currUser,表明当前不是一个登录合法的用户,应该跳转到登录页面让其登录

   - 现在添加了过滤器之后,出现了如下错误:
   localhost 将您重定向的次数过多。
   尝试清除 Cookie.
   ERR_TOO_MANY_REDIRECTS

2. 第三日内容:
  1. 在注册页面显示验证码
  2. 注册功能实现

SessionFilter.java

过滤器判断是否是合法用户

点击查看代码
package com.ypf.z_book.filters;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@WebFilter(urlPatterns = {"*.do","*.html"},
        initParams = {
            @WebInitParam(name = "bai",
                    value = "/pro25/page.do?operate=page&page=user/login,/pro25/user.do?null")
        })
public class SessionFilter implements Filter {

    //白名单列表
    List<String> baiList = null ;

    @Override
    public void init(FilterConfig config) throws ServletException {
        String bai = config.getInitParameter("bai");
        String[] baiArr = bai.split(",");
        baiList = Arrays.asList(baiArr);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest ;
        HttpServletResponse response = (HttpServletResponse)servletResponse;

        //http://localhost:8080/pro25/page.do?operate=page&page=user/login
        System.out.println("request.getRequestURI() = " + request.getRequestURI());
        System.out.println("request.getQueryString() = " + request.getQueryString());

        String uri = request.getRequestURI() ;
        String queryString = request.getQueryString() ;
        String str = uri + "?" + queryString ;
        if(baiList.contains(str)){
            filterChain.doFilter(request,response);
        }else{
            HttpSession session = request.getSession() ;
            Object currUserObj = session.getAttribute("currUser");

            if(currUserObj==null){
                response.sendRedirect("page.do?operate=page&page=user/login");
            }else{
                filterChain.doFilter(request,response);
            }
        }
    }

    @Override
    public void destroy() {

    }
}

添加验证码的检验

UserController类

点击查看代码
package com.ypf.book.controller;

import com.ypf.book.pojo.Cart;
import com.ypf.book.pojo.User;
import com.ypf.book.service.CartItemService;
import com.ypf.book.service.UserService;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

public class UserController {

    private UserService userService ;
    private CartItemService cartItemService ;

    public String login(String uname , String pwd , HttpSession session){

        User user = userService.login(uname, pwd);
        if(user!=null){
            Cart cart = cartItemService.getCart(user);
            user.setCart(cart);
            session.setAttribute("currUser",user);
            return "redirect:book.do";
        }
        return "user/login";
    }

    public String regist(String verifyCode , String uname , String pwd , String email , HttpSession session , HttpServletResponse response) throws IOException {
        Object kaptchaCodeObj = session.getAttribute("KAPTCHA_SESSION_KEY");
        if(kaptchaCodeObj==null || !verifyCode.equals(kaptchaCodeObj)){
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            //out.println("<script language='javascript'>alert('验证码不正确!');window.location.href='page.do?operate=page&page=user/regist';</script>");
            out.println("<script language='javascript'>alert('验证码不正确!');</script>");
            //return "user/regist";
            return "user/regist";
        }else{
            if(verifyCode.equals(kaptchaCodeObj)){
                userService.regist(new User(uname , pwd , email,0));
                return "user/login";
            }
        }
        return "user/login";
    }
}

web.xml文件

点击查看代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <context-param>
        <param-name>view-prefix</param-name>
        <param-value>/WEB-INF/pages/</param-value>
    </context-param>
    <context-param>
        <param-name>view-suffix</param-name>
        <param-value>.html</param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>applicationContext.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>KaptchaServlet</servlet-name>
        <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
        <init-param>
            <param-name>kaptcha.border.color</param-name>
            <param-value>red</param-value>
        </init-param>
        <init-param>
            <param-name>kaptcha.textproducer.char.string</param-name>
            <param-value>abcdefg</param-value>
        </init-param>
        <init-param>
            <param-name>kaptcha.noise.impl</param-name>
            <param-value>com.google.code.kaptcha.impl.NoNoise</param-value>
        </init-param>
        <init-param>
            <param-name>kaptcha.image.width</param-name>
            <param-value>120</param-value>
        </init-param>
        <init-param>
            <param-name>kaptcha.image.height</param-name>
            <param-value>40</param-value>
        </init-param>
        <init-param>
            <param-name>kaptcha.textproducer.font.size</param-name>
            <param-value>28</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>KaptchaServlet</servlet-name>
        <url-pattern>/kaptcha.jpg</url-pattern>
    </servlet-mapping>

</web-app>

regist.html

点击查看代码
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8" />
  <title>尚硅谷会员注册页面</title>
  <link type="text/css" rel="stylesheet" th:href="@{/static/css/style.css}" />
  <link rel="stylesheet" th:href="@{/static/css/register.css}"/>
  <style type="text/css">
    .login_form {
      height: 420px;
      margin-top: 25px;
    }
  </style>
</head>
<body>
<div id="login_header">
  <a href="../index.html">
    <img class="logo_img" alt="" th:src="@{/static/img/logo.gif}" />
  </a>
</div>

<div class="login_banner">
  <div class="register_form">
    <h1>注册尚硅谷会员</h1>
    <form th:action="@{/user.do}" method="post">
      <input type="hidden" name="operate" value="regist"/>
      <div class="form-item">
        <div>
          <label>用户名称:</label>
          <input type="text" placeholder="请输入用户名" name="uname" value="宝2023"/>
        </div>
        <span class="errMess">用户名应为6~16位数字和字母组成</span>
      </div>
      <div class="form-item">
        <div>
          <label>用户密码:</label>
          <input type="password" placeholder="请输入密码" name="pwd" value="ok"/>
        </div>
        <span class="errMess">密码的长度至少为8位</span>
      </div>
      <div class="form-item">
        <div>
          <label>确认密码:</label>
          <input type="password" placeholder="请输入确认密码" value="ok"/>
        </div>
        <span class="errMess">密码两次输入不一致</span>
      </div>
      <div class="form-item">
        <div>
          <label>用户邮箱:</label>
          <input type="text" placeholder="请输入邮箱" name="email" value="bao@126.com"/>
        </div>
        <span class="errMess">请输入正确的邮箱格式</span>
      </div>
      <div class="form-item">
        <div>
          <label>验证码:</label>
          <div class="verify">
            <input type="text" name="verifyCode" placeholder="" />
            <img th:src="@{/kaptcha.jpg}" alt="" />
          </div>
        </div>
        <span class="errMess">请输入正确的验证码</span>
      </div>
      <button class="btn">注册</button>
    </form>
  </div>
</div>
<div id="bottom">
      <span>
        尚硅谷书城.Copyright &copy;2015
      </span>
</div>
</body>
</html>

posted @ 2023-03-21 10:00  飞哥传书  阅读(31)  评论(0)    收藏  举报