前言:为了深入web原理,本项目没有使用框架,主要描述了从请求到页面展现的思路,详情请见文末的具体项目

一、为什么要用filter?直接servlet实现不就行了

因为天猫这样的项目需要很多servlet处理具体种类的业务,比如后台的管理页面有增删改查,订单页面也有增删改查,每一个操作都需要写一个servlet。使用filter+反射可以解决这个冗余的问题。

二、从浏览器输入路径到filter

举个例子,我们本地天猫项目的首页地址为http://127.0.0.1:8080/tmall/forehome,tmall此处是项目名,我们在web.xml设置filter拦截所有请求,url-pattern设置的/*,所有请求都会映射到tmall.filter.ForeServletFilter这个Java类。

ForeServletFilter

tmall.filter.ForeServletFilter

ForeServletFilter

/*

在filter的doFilter方法里面判断请求,如是/fore开头的,跳转到前台对应的servlet再做具体逻辑数据处理。

@WebFilter(filterName = "ForeServletFilter")

public class ForeServletFilter implements Filter {

@Override

public void destroy() {

}

@Override

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

HttpServletRequest request = (HttpServletRequest) req;

HttpServletResponse response = (HttpServletResponse) resp;

//获取从项目名开始的路径

String uri = request.getRequestURI();

//获取项目名路径

String contextPath = request.getContextPath();

//获得路径后缀

String path = StringUtils.remove(uri, contextPath);

if(path.startsWith("/fore")&&!path.startsWith("/foreServlet")) {

//需要将方法名取出并且放到session里面

String method = StringUtils.substringAfterLast(path, "fore");

request.setAttribute("method", method);

//跳转向foreServlet

request.getRequestDispatcher("/foreServlet").forward(request, response);

return;

}

chain.doFilter(request, response);

}

@Override

public void init(FilterConfig config) throws ServletException {

}

}

三、从filter跳转到servlet

web.xml设置servlet映射,跳转后来到ForeServlet这个Java类。

ForeServlet

tmall.servlet.ForeServlet

ForeServlet

/foreServlet

这里我们只写具体方法而不写service方法,让它继承其父类BaseForeServlet的service方法。这里的具体方法就包括了前面所说的各种后台的管理页面和订单页面的增删改查方法,此处举个首页的例子,定义一个home()方法:

public class ForeServlet extends BaseForeServlet {

public String home(HttpServletRequest request, HttpServletResponse response, Page page) {

List cs = categoryDAO.list(page.getStart(), page.getCount());

//填充数据

request.setAttribute("cs", cs);

new ProductDAO().fill(cs);

new ProductDAO().fillByRow(cs);

return "home.jsp";

}

}

四、使用反射调用具体方法

那么是如何调用到这个子类servlet的home()方法的呢?

这里我们通过BaseForeServlet的service方法,首先截取路径里面的方法名,然后使用反射执行子类的home()方法,将数据填充好。

@WebServlet(name = "BaseForeServlet")

public abstract class BaseForeServlet extends HttpServlet {

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();

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String method = (String)req.getAttribute("method");

Method md = null;

Page page = new Page(1, 5);

try {

md = this.getClass().getMethod(method, javax.servlet.http.HttpServletRequest.class,

javax.servlet.http.HttpServletResponse.class, Page.class);

String redirect = md.invoke(this, req, resp, page).toString();

if (redirect.startsWith("@")) {

resp.sendRedirect(redirect);

}else if (redirect.startsWith("%")) {

resp.sendRedirect(redirect);

}else {

req.getRequestDispatcher(redirect).forward(req, resp);

}

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

}

五、页面呈现

foreServlet返回home.jsp到父类,父类判断路径前缀,然后跳转到对应的页面。

String redirect = md.invoke(this, req, resp, page).toString();

if (redirect.startsWith("@")) {

resp.sendRedirect(redirect);

}else if (redirect.startsWith("%")) {

resp.sendRedirect(redirect);

}else {

req.getRequestDispatcher(redirect).forward(req, resp);

}

四、总结

本项目我们还暗含了MVC的设计模式,Model是Dao、Bean等数据,View是jsp页面,Control是servlet。因为篇幅有限,很多内容都没有展示,具体项目详见网上一个大神的项目:天猫J2EE项目

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[基于servlet+filter+反射模拟实现天猫首页的后端]http://www.zyiz.net/tech/detail-96542.html

java 天猫模拟登陆_基于servlet+filter+反射模拟实现天猫首页的后端相关推荐

  1. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  2. java如何模拟抢单_基于jsp的抢单兼职-JavaEE实现抢单兼职 - java项目源码

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的抢单兼职, 该项目可用各类java课程设计大作业中, 抢单兼职的系统架构分为前后台两部分, 最终实现在线上进行抢单 ...

  3. java 写字板源代码_基于JAVA的模拟写字板的设计与实现(含录像)

    基于的模拟写字板的设计与实现(含录像)(任务书,开题报告,中期检查表,外文翻译,毕业论文18800字,程序代码,答辩PPT,答辩视频录像) 摘要 目前,很多新的技术领域都涉及到了Java语言,Java ...

  4. java实现模拟考试系统,基于jsp的驾照模拟考试系统a-JavaEE实现驾照模拟考试系统a - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的驾照模拟考试系统a, 该项目可用各类java课程设计大作业中, 驾照模拟考试系统a的系统架构分为前后台两部分, 最 ...

  5. java校园足球管理系统_基于jsp的校园足球管理平台-JavaEE实现校园足球管理平台 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的校园足球管理平台, 该项目可用各类java课程设计大作业中, 校园足球管理平台的系统架构分为前后台两部分, 最终实 ...

  6. java员工请假系统_基于jsp的员工请假管理系统-JavaEE实现员工请假管理系统 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的员工请假管理系统, 该项目可用各类java课程设计大作业中, 员工请假管理系统的系统架构分为前后台两部分, 最终实 ...

  7. java家具网站需求分析_基于jsp的家具销售-JavaEE实现家具销售 - java项目源码

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的家具销售, 该项目可用各类java课程设计大作业中, 家具销售的系统架构分为前后台两部分, 最终实现在线上进行家具 ...

  8. java房产源码_基于jsp的房屋交易管理系统-JavaEE实现房屋交易管理系统 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的房屋交易管理系统, 该项目可用各类java课程设计大作业中, 房屋交易管理系统的系统架构分为前后台两部分, 最终实 ...

  9. Java EE 企业网站_基于jsp的企业网站系统-JavaEE实现企业网站系统 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的企业网站系统, 该项目可用各类java课程设计大作业中, 企业网站系统的系统架构分为前后台两部分, 最终实现在线上 ...

最新文章

  1. _捷豹F-pace汽车音响改装黄金声学,中道隔音——哈尔滨小蒋
  2. SQL 2008中修改表结构提示“阻止保存要求重新创建表的更改”
  3. ios可变数组的操作
  4. Java EE官方文档汇总
  5. 零基础带你飞web前端教程带你探究web前端趋势
  6. mysql5.7.21备份脚本_Shell脚本使用汇总整理——mysql数据库5.7.8以后备份脚本
  7. 元宇宙时代,技术长什么样
  8. 3Eclipse的下载、安装、配置
  9. ES6、7学习笔记(尚硅谷)-3-变量的解构赋值
  10. vs2010 c++项目创建简易教程
  11. java23种设计模式
  12. 旁路电容、滤波电容、去耦电容的作用与应用原理详解
  13. html编辑器的回车换行问题解决方案
  14. app运营中,如何提高用户活跃度?
  15. 洛谷 P1357 花园
  16. 基于51单片机的智能大棚浇花系统设计 花盆浇水灌溉补光散热方案原理图程序
  17. 网站运营如何做好活动策划(转载)
  18. 静态扫描之Yara第一话--安装及使用Yara
  19. 2222222222222
  20. 【camera】模组结构

热门文章

  1. SAP Spartacus 如何重定义登录 Login Component
  2. 深入理解 ngrx effect 背后的工作机制
  3. SAP Spartacus Organization Unit User页面的实现层级结构
  4. SAP Spartacus里使用injection token提供默认配置的一个例子
  5. 使用关键字SCAN ABAP-SOURCE对ABAP源代码进行语法扫描
  6. ABAP BSP的工具类CL_BSP_UTILITY
  7. when is Lessifier triggered to be loaded
  8. Controller FioriTest.view.LineItem couldn't be instantiated
  9. 如何使用点击超链接的方式打开Android手机上的应用
  10. SAP CRM WebClient UI搜索结果界面的扩展字段显示