基于javaweb的JSP+Servlet网上图书商城(java+servlet+jsp+mysql)

运行环境

Java≥8、MySQL≥5.7、Tomcat≥8

开发工具

eclipse/idea/myeclipse/sts等均可配置运行

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

272023280609

282023280609

292023280609

312023280609

322023280609

332023280609

342023280609

352023280609

362023280609

372023280609

基于javaweb的JSP+Servlet网上图书商城(java+servlet+jsp+mysql)

后台管理员:
http://localhost:8080/adminjsps/login.jsp
admin 123456

前台用户:
http://localhost:8080
user1 123456
user2 123456

项目采用MVC三层架构,使用(JSP + Sevlvet + JavaBean)技术
前台功能模块有:登录注册(校验)
加入购物车
订单管理(下订单和确认收货或者取消)
后台功能模块:图书分级管理(一级和二级)
图书管理(图书增删改查)
订单管理

用到的技术
开发环境:MyEclipse, Tomcat, Mysql
后台技术: JSP, Servlet, JavaBean
前端技术: JSP, CSS, HTML5, CSS3, jQuery, Javascript

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
		errors.put("email", "Email格式错误!");
} else if(!userService.ajaxValidateEmail(email)) {
errors.put("email", "Email已被注册!");
}
//5. 验证码校验
String verifyCode = formUser.getVerifyCode();
String vcode = (String) session.getAttribute("vCode");
if(verifyCode == null || verifyCode.trim().isEmpty()) {
errors.put("verifyCode", "验证码不能为空!");
} else if(!verifyCode.equalsIgnoreCase(vcode)) {
errors.put("verifyCode", "验证码错误!");
}
return errors;
}



//修改密码 
public String updatePassword(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
User formUser = CommonUtils.toBean(req.getParameterMap(), User.class);
User user = (User)req.getSession().getAttribute("sessionUser");
if(user == null) {
req.setAttribute("msg", "您还没有登录!");
return "f:/jsps/user/login.jsp";
}
try {
userService.updatePassword(user.getUid(), formUser.getNewpass(),
formUser.getLoginpass());
req.setAttribute("msg", "修改密码成功");
req.setAttribute("code", "success");
return "f:/frontpages/msg1.jsp";
} catch (UserException e) {
req.setAttribute("msg", e.getMessage());//保存异常信息到request
req.setAttribute("user", formUser);//为了回显
return "f:/frontpages/user/pwd.jsp";
}
}

//退出功能
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
// 用户名是否注册校验
public String ajaxValidateLoginname(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String loginname = req.getParameter("loginname");
boolean b = userService.ajaxValidateLoginname(loginname);
resp.getWriter().print(b);
return null;
}

//Email是否注册校验
public String ajaxValidateEmail(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String email = req.getParameter("email");
boolean b = userService.ajaxValidateEmail(email);
resp.getWriter().print(b);
return null;
}

//图片验证码是否正确校验
public String ajaxValidateVerifyCode(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String verifyCode = req.getParameter("verifyCode");
String vcode = (String) req.getSession().getAttribute("vCode");
boolean b = verifyCode.equalsIgnoreCase(vcode);
resp.getWriter().print(b);
return null;
}

//注册功能
public String regist(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

User formUser = CommonUtils.toBean(req.getParameterMap(), User.class);//拿到表单数据
//校验之, 如果校验失败,保存错误信息,返回到regist.jsp显示
Map<String,String> errors = validateRegist(formUser, req.getSession());
if(errors.size() > 0) {
req.setAttribute("form", formUser);
req.setAttribute("errors", errors);
return "f:/frontpages/user/register.jsp";
}
//使用service完成业务
userService.regist(formUser);
//保存成功信息,转发到msg.jsp显示!
req.setAttribute("code", "success");
req.setAttribute("msg", "注册成功!");
return "f:/frontpages/msg.jsp";
}

//注册校验 * 对表单的字段进行逐个校验,如果有错误,使用当前字段名称为key,错误信息为value,保存到map中
private Map<String,String> validateRegist(User formUser, HttpSession session) {
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
	
// 删除一级分类
public String deleteParent(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String cid = req.getParameter("cid");
int cnt = categoryService.findChildrenCountByParent(cid);
if(cnt > 0) {
req.setAttribute("msg", "该分类下还有子分类,不能删除!");
return "f:/adminjsps/msg.jsp";
} else {
categoryService.delete(cid);
return findAll(req, resp);
}
}

// 删除2级分类
public String deleteChild(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String cid = req.getParameter("cid");
int cnt = bookService.findBookCountByCategory(cid);
if(cnt > 0) {
req.setAttribute("msg", "该分类下还存在图书,不能删除!");
return "f:/adminjsps/msg.jsp";
} else {
categoryService.delete(cid);
return findAll(req, resp);
}
}
}


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


//我的订单
public String myOrders(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
int pc = getPc(req);
String url = getUrl(req);
User user = (User)req.getSession().getAttribute("sessionUser");
PageBean<Order> pb = orderService.myOrders(user.getUid(), pc);
pb.setUrl(url);
req.setAttribute("pb", pb);
return "f:/frontpages/order/list.jsp";
}

/*生成订单*/
public String createOrder(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String cartItemIds = req.getParameter("cartItemIds");
List<CartItem> cartItemList = cartItemService.loadCartItems(cartItemIds);
if(cartItemList.size() == 0) {
req.setAttribute("code", "error");
req.setAttribute("msg", "您没有选择要购买的图书,不能下单!");
return "f:/frontpages/msg1.jsp";
}

Order order = new Order();
order.setOid(CommonUtils.uuid());//设置主键
order.setOrdertime(String.format("%tF %<tT", new Date()));//下单时间
order.setStatus(1);//设置状态,1表示未付款
order.setAddress(req.getParameter("address"));//设置收货地址
User owner = (User)req.getSession().getAttribute("sessionUser");
order.setOwner(owner);//设置订单所有者

BigDecimal total = new BigDecimal("0");
for(CartItem cartItem : cartItemList) {
total = total.add(new BigDecimal(cartItem.getSubtotal() + ""));
}
order.setTotal(total.doubleValue());//设置总计

List<OrderItem> orderItemList = new ArrayList<OrderItem>();
for(CartItem cartItem : cartItemList) {
OrderItem orderItem = new OrderItem();
orderItem.setOrderItemId(CommonUtils.uuid());//设置主键
orderItem.setQuantity(cartItem.getQuantity());
orderItem.setSubtotal(cartItem.getSubtotal());
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
	return;
}
// 校验图片的尺寸
// 保存上传的图片,把图片new成图片对象:Image、Icon、ImageIcon、BufferedImage、ImageIO
//获取真实路径
String savepath = this.getServletContext().getRealPath("/book_img");
// 创建目标文件
File destFile = new File(savepath, filename);
// 保存文件
try {
fileItem.write(destFile);//它会把临时文件重定向到指定的路径,再删除临时文件
} catch (Exception e) {
throw new RuntimeException(e);
}
// 校验尺寸
// 1. 使用文件路径创建ImageIcon
ImageIcon icon = new ImageIcon(destFile.getAbsolutePath());
// 2. 通过ImageIcon得到Image对象
Image image = icon.getImage();
// 3. 获取宽高来进行校验
if(image.getWidth(null) > 350 || image.getHeight(null) > 350) {
error("您上传的图片尺寸超出了350*350!", request, response);
//destFile.delete();//删除图片
return;
}
// 把图片的路径设置给book对象
book.setImage_w("book_img/" + filename);
// 获取文件名
fileItem = fileItemList.get(2);//获取小图
filename = fileItem.getName();
// 截取文件名,因为部分浏览器上传的绝对路径
index = filename.lastIndexOf("\\");
if(index != -1) {
filename = filename.substring(index + 1);
}
// 给文件名添加uuid前缀,避免文件同名现象
filename = CommonUtils.uuid() + "_" + filename;
// 校验文件名称的扩展名
if(!filename.toLowerCase().endsWith(".jpg")) {
error("上传的图片扩展名必须是JPG", request, response);
return;
}
// 校验图片的尺寸
// 保存上传的图片,把图片new成图片对象:Image、Icon、ImageIcon、BufferedImage、ImageIO
//获取真实路径
savepath = this.getServletContext().getRealPath("/book_img");
//创建目标文件
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

public class CartItemServlet extends MyServlet {

private CartItemService cartItemService = new CartItemService();

//显示多个CartItem
public String loadCartItems(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String cartItemIds = req.getParameter("cartItemIds");
double total = Double.parseDouble(req.getParameter("total"));
List<CartItem> cartItemList = cartItemService.loadCartItems(cartItemIds);
req.setAttribute("cartItemList", cartItemList);
req.setAttribute("total", total);
req.setAttribute("cartItemIds", cartItemIds);
return "f:/frontpages/cart/showitem.jsp";
}

public String updateQuantity(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String cartItemId = req.getParameter("cartItemId");
int quantity = Integer.parseInt(req.getParameter("quantity"));
CartItem cartItem = cartItemService.updateQuantity(cartItemId, quantity);
// 给客户端返回一个json对象
StringBuilder sb = new StringBuilder("{");
sb.append("\"quantity\"").append(":").append(cartItem.getQuantity());
sb.append(",");
sb.append("\"subtotal\"").append(":").append(cartItem.getSubtotal());
sb.append("}");
System.out.println(sb);
resp.getWriter().print(sb);
return null;
}

// 批量删除功能
public String batchDelete(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String cartItemIds = req.getParameter("cartItemIds");
System.out.println(cartItemIds);
cartItemService.batchDelete(cartItemIds);
return myCart(req, resp);
}

//添加购物车条目
public String add(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Map map = req.getParameterMap();
CartItem cartItem = CommonUtils.toBean(map, CartItem.class);
Book book = CommonUtils.toBean(map, Book.class);
User user = (User)req.getSession().getAttribute("sessionUser");


项目链接:
https://javayms.github.io?id=262023280609201et
https://javayms.pages.dev?id=262023280609201et