基于javaweb的在线购书商城系统(java+jsp+mysql+servlert+ajax)

运行环境

Java≥8、MySQL≥5.7、Tomcat≥8

开发工具

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

适用

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

功能说明

基于javaweb+jsp的在线购书商城系统(java+jsp+mysql+servlert+ajax)

一、项目简述

功能:一个基于JavaWeb的网上书店的设计与实现,归纳 出了几个模块,首先是登录注册模块,图书查找模块,购 物车模块,订单模块,个人中心模块,用户管理模块,图 书管理模块等。 该项目是javaJeb技术的实战操作,采用了MVC设计模 式,包括基本的entity, jscriipt, servlet,以及ajax异步请 求,查询分页,持久化层方法的封装等等,对javaweb技 术的巩固很有帮助,为J2EE的学习打下基础,适用于课程 设计,毕业设计。

二、项目运行

环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。

项目技术: JSP + Entity+ Servlert + html+ css + JavaScript + JQuery + Ajax + Fileupload 等等。

用户信息控制层:

@Controller

@RequestMapping(“/user”)

public class UserController {

@Autowired

private IUserService userService;

@Autowired

private IMailService mailService;

@Autowired

private IStoreService storeService;

@Value(“${mail.fromMail.addr}”)

private String from;

@Value(“${my.ip}”)

private String ip;

private final String USERNAME_PASSWORD_NOT_MATCH = “用户名或密码错误”;

private final String USERNAME_CANNOT_NULL = “用户名不能为空”;

@RequestMapping(“/login”)

public String login(@RequestParam(value = “username”, required = false) String username,

@RequestParam(value = “password”, required = false) String password,

HttpServletRequest request, Model model) {

if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {

return “login”;

//未认证的用户

Subject userSubject = SecurityUtils.getSubject();

if (!userSubject.isAuthenticated()) {

UsernamePasswordToken token = new UsernamePasswordToken(username, password);

token.setRememberMe(false);//禁止记住我功能

try {

//登录成功

userSubject.login(token);

User loginUser = (User) userSubject.getPrincipal();

request.getSession().setAttribute(“loginUser”, loginUser);

Store store = storeService.findStoreByUserId(loginUser.getUserId());

request.getSession().setAttribute(“loginStore”, store);

SavedRequest savedRequest = WebUtils.getSavedRequest(request);

String url = “/”;

if (savedRequest != null) {

url = savedRequest.getRequestUrl();

if(url.contains(request.getContextPath())){

url = url.replace(request.getContextPath(),“”);

if(StringUtils.isEmpty(url) || url.equals(“/favicon.ico”)){

url = “/”;

return “redirect:” + url;

} catch (UnknownAccountException | IncorrectCredentialsException uae) {

model.addAttribute(“loginMsg”, USERNAME_PASSWORD_NOT_MATCH);

return “login”;

} catch (LockedAccountException lae) {

model.addAttribute(“loginMsg”, “账户已被冻结!”);

return “login”;

} catch (AuthenticationException ae) {

model.addAttribute(“loginMsg”, “登录失败!”);

return “login”;

} else {

//用户已经登录

return “redirect:/index”;

@RequestMapping(“/info”)

public String personInfo(){

return “user_info”;

/* @RequestMapping(“/login1”)

public String login1(@RequestParam(value = “username”, required = false) String username,

@RequestParam(value = “password”, required = false) String password,

Model model, HttpServletRequest request) {

if (StringUtils.isEmpty(username)) {

model.addAttribute(“loginMsg”, USERNAME_CANNOT_NULL);

return “login”;

if (StringUtils.isEmpty(password)) {

model.addAttribute(“loginMsg”, “密码不能为空”);

return “login”;

BSResult bsResult = userService.login(username, password);

//登录校验失败

if (bsResult.getData() == null) {

model.addAttribute(“loginMsg”, bsResult.getMessage());

return “login”;

//登录校验成功,重定向到首页

User user = bsResult.getData();

//置密码为空

user.setPassword(“”);

request.getSession().setAttribute(“user”, user);

return “redirect:/”;

*/

//shiro框架帮我们注销

@RequestMapping(“/logout”)

@CacheEvict(cacheNames=“authorizationCache”,allEntries = true)

public String logout() {

SecurityUtils.getSubject().logout();

return “redirect:/page/login”;

/**

  • 注册 检验用户名是否存在

  • @param username

  • @return

*/

@RequestMapping(“/checkUserExist”)

@ResponseBody

public BSResult checkUserExist(String username) {

if (StringUtils.isEmpty(username)) {

return BSResultUtil.build(200, USERNAME_CANNOT_NULL, false);

return userService.checkUserExistByUsername(username);

/**

  • 注册,发激活邮箱

  • @param user

  • @return

*/

@RequestMapping(“/register”)

public String register(User user, Model model) {

BSResult isExist = checkUserExist(user.getUsername());

//尽管前台页面已经用ajax判断用户名是否存在,

// 为了防止用户不是点击前台按钮提交表单造成的错误,后台也需要判断

if ((Boolean) isExist.getData()) {

user.setActive(“1”);

BSResult bsResult = userService.saveUser(user);

//获得未激活的用户

User userNotActive = (User) bsResult.getData();

/* try {

mailService.sendHtmlMail(user.getEmail(), “<dd书城>—用户激活—”,

“亲爱的” + user.getUsername() +

“,请您点击此链接前往激活”);

} catch (Exception e) {

e.printStackTrace();

model.addAttribute(“registerError”, “发送邮件异常!请检查您输入的邮箱地址是否正确。”);

return “fail”;

}*/

model.addAttribute(“username”, user.getUsername());

return “register_success”;

} else {

//用户名已经存在,不能注册

model.addAttribute(“registerError”, isExist.getMessage());

return “register”;

@RequestMapping(“/active”)

public String activeUser(String activeCode, Model model) {

BSResult bsResult = userService.activeUser(activeCode);

if (!StringUtils.isEmpty(bsResult.getData())) {

model.addAttribute(“username”, bsResult.getData());

return “active_success”;

} else {

model.addAttribute(“failMessage”, bsResult.getMessage());

return “fail”;

@RequestMapping(“/update”)

@ResponseBody

public BSResult updateUser(User user, HttpSession session){

User loginUser = (User) session.getAttribute(“loginUser”);

loginUser.setNickname(user.getNickname());

loginUser.setLocation(user.getLocation());

loginUser.setDetailAddress(user.getDetailAddress());

loginUser.setGender(user.getGender());

loginUser.setUpdated(new Date());

loginUser.setPhone(user.getPhone());

loginUser.setIdentity(user.getIdentity());

loginUser.setPhone(user.getPhone());

BSResult bsResult = userService.updateUser(loginUser);

session.setAttribute(“loginUser”, loginUser);

return bsResult;

@RequestMapping(“/password/{userId}”)

@ResponseBody

public BSResult changePassword(@PathVariable(“userId”) int userId,String oldPassword,String newPassword){

if(StringUtils.isEmpty(oldPassword) || StringUtils.isEmpty(newPassword)){

return BSResultUtil.build(400, “密码不能为空”);

return userService.compareAndChange(userId,oldPassword,newPassword);

订单控制层:

@Controller

@RequestMapping(“/order”)

public class OrderController {

@Autowired

private IOrderService orderService;

@Autowired

private ICartService cartService;

@Autowired

private IBookInfoService bookInfoService;

/**

  • 填写订单信息页面

  • @param bookId

  • @param buyNum

  • @param request

  • @return

*/

@GetMapping(“/info”)

public String orderInfo(@RequestParam(required = false, defaultValue = “0”) int bookId,

@RequestParam(required = false, defaultValue = “0”) int buyNum,

HttpServletRequest request) throws BSException {

if (bookId != 0) {

//点了立即购买,放到request域中,也session的立即购买域中以区分购物车中的书籍

BookInfo bookInfo = bookInfoService.findById(bookId);

if (bookInfo != null) {

BSResult bsResult = cartService.addToCart(bookInfo, null, buyNum);

request.getSession().setAttribute(“buyNowCart”, bsResult.getData());

request.setAttribute(“cart”, bsResult.getData());

return “order_info”;

} else {

request.setAttribute(“exception”, “不好意思,书籍库存不足或不存在了!”);

return “exception”;

//没有点立即购买,购物车中的总金额大于0才让填写订单信息

Cart cart = (Cart) request.getSession().getAttribute(“cart”);

if (cart != null && cart.getTotal() > 0) {

return “order_info”;

} else {

return “cart”;

@GetMapping(“/payPage/{orderId}”)

public String toPay(@PathVariable(“orderId”) String orderId, Model model) {

BSResult bsResult = orderService.findOrderById(orderId);

if (bsResult.getCode() == 200) {

model.addAttribute(“order”, bsResult.getData());

return “payment”;

return “exception”;

@RequestMapping(“/deletion/{orderId}”)

public String deletion(@PathVariable(“orderId”) String orderId) {

BSResult bsResult = orderService.deleteOrder(orderId);

if (bsResult.getCode() == 200) {

return “redirect:/order/list”;

return “exception”;

/**

  • 订单列表

  • @return

*/

@GetMapping(“/list”)

public String orderList(HttpServletRequest request) {

User loginUser = (User) request.getSession().getAttribute(“loginUser”);

List orderCustoms = orderService.findOrdersByUserId(loginUser.getUserId());

request.setAttribute(“orderCustoms”, orderCustoms);

return “order_list”;

/**

  • 创建订单

  • @return

*/

@PostMapping(“/creation”)

public String createOrder(User userDTO, String express, int payMethod, HttpServletRequest request) {

//立即购买,优先创建订单

Cart buyNowCart = (Cart) request.getSession().getAttribute(“buyNowCart”);

User loginUser = (User) request.getSession().getAttribute(“loginUser”);

userDTO.setUserId(loginUser.getUserId());

userDTO.setZipCode(loginUser.getZipCode());

if (buyNowCart != null) {

BSResult bsResult = orderService.createOrder(buyNowCart, userDTO, express, payMethod);

if (bsResult.getCode() == 200) {

request.setAttribute(“order”, bsResult.getData());

cartService.clearCart(request, “buyNowCart”);

return “payment”;

} else {

request.setAttribute(“exception”, bsResult.getMessage());

return “exception”;

//普通购物车

Cart cart = (Cart) request.getSession().getAttribute(“cart”);

if (cart != null) {

BSResult bsResult = orderService.createOrder(cart, userDTO, express, payMethod);

if (bsResult.getCode() == 200) {

request.setAttribute(“order”, bsResult.getData());

cartService.clearCart(request, “cart”);

return “payment”;

} else {

request.setAttribute(“exception”, bsResult.getMessage());

return “exception”;

} else {

request.setAttribute(“exception”, “购物车为空!”);

return “exception”;

/**

  • 确认收货

  • @param orderId

  • @return

*/

@RequestMapping(“/confirm/{orderId}”)

public String confirmReceiving(@PathVariable(“orderId”) String orderId, Model model) {

BSResult bsResult = orderService.confirmReceiving(orderId);

if (bsResult.getCode() == 200) {

return “redirect:/order/list”;

} else {

model.addAttribute(“exception”, bsResult.getMessage());

return “exception”;

书籍信息控制层:

@Controller

@RequestMapping(“/book”)

public class BookInfoController {

@Autowired

private IBookInfoService bookInfoService;

@Autowired

private BookDescMapper bookDescMapper;

/**

  • 查询某一本书籍详情

  • @param bookId

  • @param model

  • @return

*/

@RequestMapping(“/info/{bookId}”)

public String bookInfo(@PathVariable(“bookId”) Integer bookId, Model model) throws BSException {

//查询书籍

BookInfo bookInfo = bookInfoService.findById(bookId);

//查询书籍推荐列表

List recommendBookList = bookInfoService.findBookListByCateId(bookInfo.getBookCategoryId(), 1, 5);

//查询书籍详情

BookDesc bookDesc = bookDescMapper.selectByPrimaryKey(bookId);

//增加访问量

bookInfoService.addLookMount(bookInfo);

Collections.shuffle(recommendBookList);

model.addAttribute(“bookInfo”, bookInfo);

model.addAttribute(“bookDesc”, bookDesc);

model.addAttribute(“recommendBookList”, recommendBookList);

return “book_info”;

/**

  • 通过关键字和书籍分类搜索书籍列表

  • @param keywords

  • @return

*/

@RequestMapping(“/list”)

public String bookSearchList(@RequestParam(defaultValue = “”, required = false) String keywords,

@RequestParam(defaultValue = “0”, required = false) int cateId,//分类Id,默认为0,即不按照分类Id查

@RequestParam(defaultValue = “1”, required = false) int page,

@RequestParam(defaultValue = “6”, required = false) int pageSize,

Model model) {

keywords = keywords.trim();

PageInfo bookPageInfo = bookInfoService.findBookListByCondition(keywords, cateId, page, pageSize,0);//storeId为0,不按照商店Id查询

model.addAttribute(“bookPageInfo”, bookPageInfo);

model.addAttribute(“keywords”, keywords);

model.addAttribute(“cateId”, cateId);

return “book_list”;


基于javaweb的在线购书商城系统(java+jsp+mysql+servlert+ajax)相关推荐

  1. 基于javaweb的在线蛋糕商城系统(java+jsp+jdbc+mysql)

    基于javaweb的在线蛋糕商城系统(java+jsp+jdbc+mysql) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/idea/myeclipse/s ...

  2. 基于javaweb的在线甜品商城系统(java+ssm+jsp+javascript+mysql)

    基于javaweb的在线甜品商城系统(java+ssm+jsp+javascript+mysql) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/idea/m ...

  3. 基于javaweb的二手交易商城系统(java+jsp+javascript+servlet+mysql)

    基于javaweb的二手交易商城系统(java+jsp+javascript+servlet+mysql) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/id ...

  4. 基于javaweb的在线宠物商店系统(java+ssm+mysql+tomcat)

    基于javaweb的在线宠物商店系统(java+ssm+mysql+tomcat) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/idea/myeclipse ...

  5. 基于javaweb的在线奶茶店系统(java+jsp+javascript+servlet+mysql)

    基于javaweb的在线奶茶店系统(java+jsp+javascript+servlet+mysql) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/ide ...

  6. 基于javaweb的仿天猫商城系统(java+jsp+springboot+ssm+mysql)

    基于javaweb的仿天猫商城系统(java+jsp+springboot+ssm+mysql) 运行环境 Java≥8.MySQL≥5.7 开发工具 eclipse/idea/myeclipse/s ...

  7. 基于javaweb的水果蔬菜商城系统(java+ssm+jsp+mysql)

    基于javaweb的水果蔬菜商城系统(java+ssm+jsp+mysql) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/idea/myeclipse/st ...

  8. 基于javaweb的水果生鲜商城系统(java+springboot+mybatis+vue+mysql)

    基于javaweb的水果生鲜商城系统(java+springboot+mybatis+vue+mysql) 运行环境 Java≥8.MySQL≥5.7.Node.js≥10 开发工具 后端:eclip ...

  9. 基于javaweb的网上图书商城系统(java+ssm+jsp+mysql+redis+jwt+shiro+rabbitmq+easyui)

    基于javaweb的网上图书商城系统(java+ssm+jsp+mysql+redis+jwt+shiro+rabbitmq+easyui) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥ ...

  10. 基于javaweb的音乐专辑商城系统(java+ssm+jsp+jquery+mysql)

    基于javaweb的音乐专辑商城系统(java+ssm+jsp+jquery+mysql) 运行环境 Java≥8.MySQL≥5.7.Tomcat≥8 开发工具 eclipse/idea/myecl ...

最新文章

  1. weblogic反序列化漏洞CVE-2018-2628-批量检测脚本
  2. run loop 测试
  3. es python demo
  4. 为docker设置国内镜像【转】
  5. python虚拟环境中文件分部_Python之虚拟环境管理
  6. 全球服务器系统市场份额,IDC发布2017年第一季度全球融合系统报告 超融合市场最火爆...
  7. 剑指offer:二叉树中和为某一值的路径
  8. grpc,protoc, protoc-gen-go,rust
  9. .Net 程序员应该知道的工具和网站
  10. 分贝噪音测试软件文件存储,手机分贝噪音测试软件
  11. java求职英文简历范本2篇_Java英文简历范文
  12. 上海地区房价影响因素预测
  13. 555定时器应用之--多谐振荡器
  14. 单GPU实现20Hz决策,最新基于序列生成模型的高效轨迹规划方法
  15. Caused by: redis.clients.jedis.exceptions.JedisConnectionException: JedisPubSub was not subscribed t
  16. 认清大脑中的一对塑料姐妹花,科学解锁情绪密码
  17. 5、DML语句(数据操纵语言-增删改查)
  18. python 日期大小比较
  19. 便捷建筑工程行业招采管理,供应商协同平台精准匹配企业需求,撮合交易
  20. 北航ccf计算机软件能证排名前18%,CCF成功举办第十一次CCF CSP认证

热门文章

  1. 毕设-基于SpringBoot度假村租房管理系统
  2. 【WinCC V7.5 入门】
  3. Lattice Diamond Reveal SerDes Debug Core简明教程(For ECP5)
  4. Xamarin学习笔记
  5. 使用云存储解决方案,主要有哪些优势
  6. weibo.cn html5,微博爬虫:爬取微博正文、关注人
  7. Windows实现微信多开+美化图标
  8. 易语言静态连接器提取_vc98linker修复静态编译
  9. Android App拥有system权限
  10. 打印机服务器没有响应 请检查设置,打印机服务无法启动的解决办法