书城项目

day01

1、需求分析

2、数据库设计

image-20220724195522375

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

day02

1、显示主页面(index页面)

  • 新建BookDAO 、 BookDAOImpl : getBookList()
  • 新建BookService 、 BookServiceImpl : getBookList()
  • 新建BookController : index()
  • 编辑index.html

2、首页上登录成功之后显示欢迎语和购物车数量

3、点击具体图书的添加到购物车按钮

4、购物车详情

5、结账

  1. 订单表添加一条记录
  2. 订单详情表添加7条记录
  3. 购物车项表中需要删除对应的7条记录

6、关于订单信息中的订单数量问题

7、编辑购物车

8、关于金额的精度问题

1
2
3
SELECT SUM(t3.buyCount) AS totalBookCount , t3.orderBean FROM 
(SELECT t1.id , t2.buyCount , t2.orderBean FROM t_order t1 INNER JOIN t_order_item t2 ON t1.id = t2.orderBean WHERE t1.orderUser = ?
) t3 WHERE t3.orderBean = ? GROUP BY t3.orderBean

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

  • 解决方法:新建SessionFilter , 用来判断session中是否保存了currUser

    对于session 中保存了 currUser 的用户, 在前端页面内 的thymeleaf 表达式直接请求controller 即可

  • 如果没有currUser,表明当前不是一个登录合法的用户,应该跳转到登录页面让其登录

  • 现在添加了过滤器之后,出现了如下错误:

    • localhost 将您重定向的次数过多。

      尝试清除 Cookie.
      ERR_TOO_MANY_REDIRECTS

day03

验证码

问题 :无法通过session 获取 真正的验证码

解决方法: 通过web.xml配置文件即可

  • web.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?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>
<!-- <param-value>pages/</param-value>-->
<!-- <param-value>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.session.key</param-name>
<param-value>kaptcha_session_key</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.img.width</param-name> <!--图片 宽度-->
<param-value>100</param-value>
</init-param>
<init-param>
<param-name>kaptcha.img.height</param-name> <!--图片 高度-->
<param-value>35</param-value>
</init-param>
<init-param>
<param-name>kaptcha.text.producer.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>

img

解决办法:

最后发现是获取session的键值对写错了,把

1
com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY改为setAttribute对应的key,我的是web.xml中帮我创建放到session中了,键值对为captcha。

img

如果没在web.xml中配置,则要自己手动创建,参考这篇文章:http://t.csdn.cn/iCgqu

regis.html

1
<input type="text" name="verifyCode" placeholder="" />

注意要写 name=“verifyCode”;

修改

  1. DispacherServlet添加了对于operate 方法执行的返回值的判断,现在可以返回null or 空字符串

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    String methodReturnStr = (String)returnObj ;
    if(StringUtil.isEmpty(methodReturnStr))
    {
    return;
    }else if(methodReturnStr.startsWith("redirect:")){ //比如: redirect:fruit.do
    String redirectStr = methodReturnStr.substring("redirect:".length());
    response.sendRedirect(redirectStr);
    }else{
    /*这里错了*/
    super.processTemplate(methodReturnStr,request,response); // thymeleaf 渲染前端页面
    }
  2. 完善注册功能, 主要在于UserController.java

    • regist方法如下
      1. 返回空字符串, 并且通过js 代码提示 用户操作, 然后通过js 代码直接完成跳转,不需要再返回操作通过DispacherServlet处理
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public String regist(String verifyCode, String uname, String pwd, String email, HttpSession session, HttpServletResponse response) throws IOException  
    /* 普通的参数 根据 前端页面提交的表单直接 获得 ,同时需要通过session获取验证码*/
    {
    Object kaptchaObj=session.getAttribute("kaptcha_session_key");
    // verifyCode 参数 是表单提交的验证码 ,需要与 从session 获取的真正的对比
    if(kaptchaObj==null||!verifyCode.equals(kaptchaObj))
    {
    response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");
    PrintWriter printWriter=response.getWriter();
    printWriter.print("<script language='javaScript'>alert('验证码错误');window.location.href='page.do?operate=page&page=user/regist'; </script>");
    return null;
    } else
    {
    if(verifyCode.equals(kaptchaObj))
    {
    response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");
    PrintWriter printWriter=response.getWriter();
    printWriter.print("<script language='javaScript'>alert('注册成功,即将返回登陆页面');" +
    "window.location.href='page.do?operate=page&page=user/login'; </script>");
    userService.regist(new User(uname,pwd,email));
    return null;
    }
    }
    // 只有 第一个if 错误 ,else里面的if 也错误才会执行这个语句 ,也就是 从后台获取到了
    return"user/regist";
    }
    • UserDAOImpl.java

      1
      2
      3
      4
      5
      @Override
      public void addUser(User user) {
      super.executeUpdate("insert into t_user value(0,?,?,?,1)",
      user.getUname(),user.getPwd(),user.getEmail());
      }
    • UserService.java

      1
      2
      3
      4
      @Override
      public void regist(User user) {
      userDAO.addUser(user);
      }

注意在 html 文件链接 js文件不要用href 要用 src

1
<script language="JavaScript" th:src="@{/static/script/old_regist.js}"></script>

day04

  • 添加了注册时确定用户名唯一的功能

    • 使用ajax

    • 添加了User getUser (String uname) 的相关方法

    • 在UserController 中添加了public String ckUname(String uname) 返回json格式的字符串

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      public String ckUname(String uname)
      {
      User user=userService.getUser(uname);
      if(user!=null)
      {
      return "json:{'uname':'1'}";
      // 或者 return "ajax:1";
      }else{
      return "json:{'uname':'0'}";
      // 或者 return "ajax:0";
      }
      }
    • 在DispacherServlet添加了对于operate执行返回的字符串的json格式的处理方式

      1

问题1

在js 代码 收到后端发送来的字符串验证过程中有问题

  • 通过浏览器debug发现是因为 后端返回的字符串中 被添加了 ‘\r\n’
  • image-20220714153939159

解决方法

  • 出现这个问题的原因是DispacherServlet在输出 methodReturnStr时,调用的是println() 方法, 多输出了一个换行符

将println改成print()即可

image-20220714154249221

writer.print(jsonStr);

问题解决

问题2

regist.html在引入js文件时, 标签的src 写成了href, 导致虽然通过ctrl+鼠标单击可以找到js

文件,但实际执行时js代码却会失效。