目录

模仿天猫商城的J2EE商城网站项目后端2——需求分析

代码工作流程图(也是整个项目的代码工作流程图)

举例分析

1 后台servlet过滤器BackServletFilter对其进行拦截,并进行处理:

2 跳转到相应的servlet类的方法(仍以 CategoryServlet.list() 为例)

2.1 Servlet的CategoryServlet类与其父类BaseBackServlet类的分析

2.2 后台servlet的父类BaseBackServlet 类

2.3 CatgoryServlet.list()


模仿天猫商城的J2EE商城网站项目后端1——项目总览https://blog.csdn.net/qq_37154145/article/details/121612930https://blog.csdn.net/qq_37154145/article/details/121612930

模仿天猫商城的J2EE商城网站项目后端2——需求分析https://blog.csdn.net/qq_37154145/article/details/121637045https://blog.csdn.net/qq_37154145/article/details/121637045

代码工作流程图(也是整个项目的代码工作流程图)

举例分析

假设访问的后台页面为http://localhost:8080/tmall/admin_category_list,那么

1 后台servlet过滤器BackServletFilter对其进行拦截,并进行处理:

package tmall.filter;import org.apache.commons.lang.StringUtils;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** 网站后台servlet过滤器。* 作用是从获取的contextPath和uri中,解析出所需调用的Servlet类和该类的具体方法* @author LSB*/
public class BackServletFilter implements Filter {@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) res;String contextPath = request.getServletContext().getContextPath(); // 获得“/tmall”,如“http://localhost:8080/tmall/admin_category_list”中的“/tmall”String uri = request.getRequestURI(); // 获得访问URI,如“http://localhost:8080/tmall/admin_category_list”中的“/tmall/admin_category_list”uri = StringUtils.remove(uri, contextPath); // 截取URI访问路径部分,如“/admin_category_list”if (uri.startsWith("/admin_")) {String servletPath = StringUtils.substringBetween(uri, "_", "_") + "Servlet"; // categoryServletString method = StringUtils.substringAfterLast(uri, "_"); // listrequest.setAttribute("method", method); // 将method传递到前端,以便servlet获取method并进行反射req.getRequestDispatcher("/" + servletPath).forward(request, response); // 跳转到对应的CategoryServlet类中,并调用list方法。服务端跳转,算同一次请求,数据可以放request里传递return;}chain.doFilter(request, response);}public void destroy() {}public void init(FilterConfig arg0) {}
}

也就是说,若访问的路径为http://localhost:8080/tmall/admin_category_list,那么BackServletFilter就会解析出需要调用的方法为CategoryServlet.list()。

2 跳转到相应的servlet类的方法(仍以 CategoryServlet.list() 为例)

2.1 Servlet的CategoryServlet类与其父类BaseBackServlet类的分析

servlet分为前台servlet和后台servlet,前后台servlet又分别有各自的父类BaseForeServlet类和BaseBackServlet类。这样做的理由是,两个父类均负责做重复性工作,如BaseBackServlet类负责1、为CategoryServlet、UserServlet等子类提供CRUD及edit接口;2、对DAO进行实例化;3、获取并处理分页信息;3、从前端获取前面filter设置的method并调用method;4、进行前端页面跳转;5、解析上传的文件(图片)。

这五个功能,CategoryServlet类、UserServlet类等都会频繁使用,所以为了减少重复代码和维护成本,便给这些类一个统一的父类BaseBackServlet类。前台的Servlet类同理。

BaseBackServlet 类和CategoryServlet类关系如图,其他UserServlet、ProductServlet等类同理:

2.2 后台servlet的父类BaseBackServlet 类

前面“1、filter拦截”部分,已经在项目前端设置了method,并跳转到响应的CategoryServlet类,CategoryServlet类的功能为:

package tmall.servlet;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import tmall.dao.*;
import tmall.util.Page;import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;
import java.util.List;
import java.util.Map;/*** 网站后台Servlet的统一父类* 负责重复性工作:* 1、为CategoryServlet、UserServlet等子类提供CRUD及edit接口;* 2、对DAO进行实例化;3、获取并处理分页信息;* 3、从前端获取前面filter设置的method并调用method;* 4、进行前端页面跳转;* 5、解析上传的文件(图片)* @author LSB*/
public abstract class BaseBackServlet extends HttpServlet {// CRUD及edit抽象方法public abstract String add(HttpServletRequest request, HttpServletResponse response, Page page);public abstract String delete(HttpServletRequest request, HttpServletResponse response, Page page);public abstract String edit(HttpServletRequest request, HttpServletResponse response, Page page);public abstract String update(HttpServletRequest request, HttpServletResponse response, Page page);public abstract String list(HttpServletRequest request, HttpServletResponse response, Page page);// 实例化DAO类protected CategoryDAO categoryDAO = new CategoryDAO();protected OrderDAO orderDAO = new OrderDAO();protected OrderItemDAO orderItemDAO = new OrderItemDAO();protected ProductDAO productDAO = new ProductDAO();protected ProductImageDAO productImageDAO = new ProductImageDAO();protected PropertyDAO propertyDAO = new PropertyDAO();protected PropertyValueDAO propertyValueDAO = new PropertyValueDAO();protected ReviewDAO reviewDAO = new ReviewDAO();protected UserDAO userDAO = new UserDAO();@Overridepublic void service(HttpServletRequest request, HttpServletResponse response) {try {/*获取分页信息并进行处理*/int start = 0;int count = 5;try {start = Integer.parseInt(request.getParameter("page.start"));} catch (Exception e) {}try {count = Integer.parseInt(request.getParameter("page.count"));} catch (Exception e) {}Page page = new Page(start, count);String method = (String) request.getAttribute("method"); // 假设method=list,Servlet=CategoryServlet/** 借助反射,调用对应的方法利用反射,调用对应业务类的方法* 注意此处的 this 并不是指本类的对象,而是具体的业务类,如 CategoryServlet 对象* 为什么呢?因为上面的 filter 跳转目的地是 CategoryServlet* 而CategoryServlet 又继承了BaseBackServlet。也就是说,其实BaseBackServlet 只是作为CategoryServlet 的一个部分运行而已*/Method m = this.getClass().getMethod(method, javax.servlet.http.HttpServletRequest.class,javax.servlet.http.HttpServletResponse.class, Page.class); // CategoryServlet.list(..)/** 下面这句代码,通过反射,调用CategoryServlet.list()* 也是从这句代码,程序开始跳转到子类中运行——如CategoryServlet.list()中——直到子类return*/String redirect = m.invoke(this, request, response, page).toString(); // redirect="admin/listCategory.jsp";/*根据方法的返回值redirect,进行相应的客户端跳转,服务端跳转,或者仅仅是输出字符串*/if (redirect.startsWith("@"))response.sendRedirect(redirect.substring(1)); // 客户端跳转,即重定向,原request会失效else if (redirect.startsWith("%"))response.getWriter().print(redirect.substring(1)); // 输出字符串elserequest.getRequestDispatcher(redirect).forward(request, response); // 服务端跳转} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();throw new RuntimeException(e);}}/*** 解析上传的文件(其实就是图片)* @param request* @param params* @return*/public InputStream parseUpload(HttpServletRequest request, Map<String, String> params) {InputStream is = null;try {DiskFileItemFactory factory = new DiskFileItemFactory(); // DiskFileItemFactory,以便接下来将图片文件封装成FileItem实例,并将其保存在内存ServletFileUpload upload = new ServletFileUpload(factory); // 利用ServletFileUpload关联FileItem列表factory.setSizeThreshold(1024 * 10240); // 设置上传文件的大小限制为10MList items = upload.parseRequest(request); // 解析request为FileItem的List// 利用迭代器遍历itemsIterator iter = items.iterator();while (iter.hasNext()) {FileItem item = (FileItem) iter.next();if (!item.isFormField()) {// 文件表单,进入输入流System.out.println("上传文件:进入获取输入流。!item.isFormField为true,为文件表单");// item.getInputStream() 获取上传文件的输入流is = item.getInputStream();} else {// 普通表单,不进入输入流System.out.println("上传文件:未进入获取输入流。!item.isFormField为false,为普通表单");String paramName = item.getFieldName();String paramValue = item.getString();System.out.println(paramName + ":" + paramValue);paramValue = new String(paramValue.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);params.put(paramName, paramValue);}}} catch (Exception e) {e.printStackTrace();}return is;}}

2.3 CatgoryServlet.list()

从代码“String redirect = m.invoke(this, request, response, page).toString();”,调用CategoryServlet 本类方法CategoyServlet.list(),直到CategoyServlet.list() return之后,回到父类BaseBackServlet 中运行。而return的字符串,就是跳转的目标页面路径。这个list() 方法,其实是对BaseBackServlet 类list 接口的实现。

public String list(HttpServletRequest request, HttpServletResponse response, Page page) {List<Category> categories = categoryDAO.list(page.getStart(), page.getCount());int total = categoryDAO.getTotal();page.setTotal(total);request.setAttribute("thecs", categories);request.setAttribute("page", page);return "admin/listCategory.jsp";}

模仿天猫商城的J2EE商城网站项目后端——servlet+filter配合详细分析相关推荐

  1. 模仿天猫商城的J2EE商城网站项目后端5——bean包

    目录 User.java Product.java Category.java ProductImage.java Property.java PropertyValue.java OrderItem ...

  2. 模仿天猫实战【SSM版】——项目起步

    前言:现在自己的学习似乎遇到了瓶颈,感觉学习了 SSM 之后有一些迷茫,不知道接下来该往哪里去努力了,我觉得这是个很不好的状态,为了度过这段时期,我准备把天猫模仿下来(给自己找点事做)之后开始去巩固 ...

  3. Java Web前后端分离项目—后端servlet实例

    关与作者更多博客请访问云里云外开源社区 文章目录 一.闲谈 二.json字符串的接受和发送 json的发送 json的接收 三.内网穿透或服务上云服务器 四.跨域 背景(为什么) 如何跨域 五.对接出 ...

  4. 模仿天猫实战【SSM版】——后台开发

    上一篇文章链接:模仿天猫实战[SSM版]--项目起步 后台需求分析 在开始码代码之前,还是需要先清楚自己要做什么事情,后台具体需要实现哪些功能: 注意: 订单.用户.订单.推荐链接均不提供增删的功能. ...

  5. 模仿天猫实战【SSM】——总结

    第一篇文章链接:模仿天猫实战[SSM版]--项目起步 第二篇文章链接:模仿天猫实战[SSM版]--后台开发 总结:项目从4-27号开始写,到今天5-7号才算真正的完工,有许多粗糙的地方,但总算完成了, ...

  6. java项目源码-模仿天猫商城网站

    已经部署好了,体验地址 模仿天猫网站 购物车: 确认收货 可以免费学到分页管理 地址

  7. java实战项目源码-模仿天猫商城网站

    已经部署好了,体验地址,可以注册个账号买东西试试,注意不要输入真实的账号密码 模仿天猫网站 可以免费学到分页管理 购物车: 确认收货 地址

  8. 【J2EE】模仿天猫商城(后台篇)

    之前学习了使用J2EE开发一个模仿天猫商城整站的项目,期间学习到了不少知识.但是隔了一段时间再回看代码,居然有点生疏了~所以写下这篇博客,方便日后回顾,温故而知新,也可以和大家交流学习. 本篇介绍项目 ...

  9. SSM项目-模仿天猫网站

    模仿天猫商城网站地址(已经部署在阿里云了) 1. SSM是Spring, SpringMVC, Mybatis 2. SSM实战教程 SSM详细介绍 首先准备数据库 how2java 如果没有安装数据 ...

最新文章

  1. php的POSIX 函数以及进程测试
  2. 菜鸟教程 php跨域,PHP Ajax 跨域问题最佳解决方案
  3. DL-3利用MNIST搭建神经网络模型(三种方法):1.用CNN 2.用CNN+RNN 3.用自编码网络autoencoder
  4. 别名的应用(New-Alias)
  5. apache配置文件httpd.conf----小白福利
  6. Grunt 新手一日入门
  7. Head First JSP---随笔九(部署Web应用)
  8. protobuf string类型_Protobuf3 使用其他消息类型
  9. php 内部异步执行顺序,event_loop中不同异步操作的执行顺序
  10. FreeBSD系统忘记root密码
  11. 华为机试题【11】-报数删除人
  12. iPhone 12不支持双卡5G?媒体实测结论终于让大家安心
  13. 用js代码判断质数_在 JS 中判断,并不是都要用 ===
  14. 【百度地图API】如何制作孪生姐妹地图?
  15. flash播放器android,Flash播放器
  16. coremail服务器无响应,icoremail邮箱系统 邮件收发常见问题|创思Chance
  17. 马哥教育开学感想随笔
  18. 云开发魔都团长头像制作微信小程序源码/带流量主
  19. A Multi-task Learning Framework for Opinion Triplet Extraction (EMNLP 2020)阅读记录
  20. 安卓设备数据转移到ios设备

热门文章

  1. error C4996 ‘pugixml_documentload‘ 被声明为已否决的解决方法
  2. GPRS模块--PPP手动拨号
  3. 首发仿拼多多源码,程序完整版+安装教程+完美运营
  4. c语言 游戏控制器映射,如何在Nintendo游戏控制器上映射控件以充当PC的键盘
  5. RecycledView三种Linear,Grid,Staggered
  6. 最短作业优先(SJF)调度算法
  7. hkust ucl 电子工程比较_香港科技大学(HKUST) 的MSC电子工程(EE)怎么样?
  8. 保持好奇心,让程序员永远年轻
  9. 加密软件那个好用?国内加密软件排行版
  10. Docker使用docker compose创建 轻量级私人云端相册 实时管理个人相片 控制相册访问权限 Lychee 部署搭建