书城项目
书城项目
day01
1、需求分析
2、数据库设计
1、实体分析
- 图书 Book
- 用户 User
- 订单 OrderBean
- 订单详情 OrderItem
- 购物车项 CartItem
2、 实体属性分析
- 图书 : 书名、作者、价格、销量、库存、封面、状态
- 用户 : 用户名、密码、邮箱
- 订单 : 订单编号、订单日期、订单金额、订单数量、订单状态、用户
- 订单详情 : 图书、数量、所属订单
- 购物车项 : 图书、数量、所属用户
day02
1、显示主页面(index页面)
- 新建BookDAO 、 BookDAOImpl : getBookList()
- 新建BookService 、 BookServiceImpl : getBookList()
- 新建BookController : index()
- 编辑index.html
2、首页上登录成功之后显示欢迎语和购物车数量
3、点击具体图书的添加到购物车按钮
4、购物车详情
5、结账
- 订单表添加一条记录
- 订单详情表添加7条记录
- 购物车项表中需要删除对应的7条记录
6、关于订单信息中的订单数量问题
7、编辑购物车
8、关于金额的精度问题
1 | SELECT SUM(t3.buyCount) AS totalBookCount , t3.orderBean FROM |
9、过滤器判断是否是合法用户
-
解决方法:新建SessionFilter , 用来判断session中是否保存了currUser
对于session 中保存了 currUser 的用户, 在前端页面内 的thymeleaf 表达式直接请求controller 即可
-
如果没有currUser,表明当前不是一个登录合法的用户,应该跳转到登录页面让其登录
-
现在添加了过滤器之后,出现了如下错误:
-
localhost 将您重定向的次数过多。
尝试清除 Cookie.
ERR_TOO_MANY_REDIRECTS
-
day03
验证码
问题 :无法通过session 获取 真正的验证码
解决方法: 通过web.xml配置文件即可
- web.xml
1 |
|
解决办法:
最后发现是获取session的键值对写错了,把
1 | com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY改为setAttribute对应的key,我的是web.xml中帮我创建放到session中了,键值对为captcha。 |
如果没在web.xml中配置,则要自己手动创建,参考这篇文章:http://t.csdn.cn/iCgqu
regis.html
1 | <input type="text" name="verifyCode" placeholder="" /> |
注意要写 name=“verifyCode”;
修改
-
在DispacherServlet添加了对于
operate
方法执行的返回值的判断,现在可以返回null or 空字符串1
2
3
4
5
6
7
8
9
10
11String 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 渲染前端页面
} -
完善注册功能, 主要在于
UserController.java
- regist方法如下
- 返回空字符串, 并且通过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
26public 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
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
public void regist(User user) {
userDAO.addUser(user);
}
- regist方法如下
注意在 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
12public 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’
解决方法
- 出现这个问题的原因是DispacherServlet在输出 methodReturnStr时,调用的是println() 方法, 多输出了一个换行符
将println改成print()即可
writer.print(jsonStr);
问题解决
问题2
regist.html在引入js文件时, 标签的src 写成了href, 导致虽然通过ctrl+鼠标单击可以找到js
文件,但实际执行时js代码却会失效。