传统设计

分类管理需要:增加,删除,编辑,修改,查询5个服务端功能。

一个路径对应一个Servlet的思路,就需要设计5个Servlet类,并且在web.xml中配置5个路径。

CategoryAddServlet
CategoryDeleteServlet
CategoryEditServlet
CategoryUpdateServlet
CategoryListServlet
改进设计

每种实体类,对应了一个Servlet,而不是对应了5个,这样首先从Servlet数量上来讲,就大大的减少了。

原理流程图

那么是如何做到一个CategoryServlet类,就能完成本来需要5个Servlet类才能完成的功能的呢?

思路:(1)要有Servlet类的类名className,才能进入对应的Servlet类。

(2)要有方法名method,才能通过反射机制获得该Method对象,调用此方法。

关键在于访问路径的设计:

借助流程图来分析,为什么访问admin_category_list的时候,CategoryServlet的list()方法会被调用。

在web.xml配置文件中,让所有的请求【/*】都会经过BackServletFilter

<filter>
<filter-name>BackServletFilter</filter-name>
<filter-class>tmall.filter.BackServletFilter</filter-class>
</filter> <filter-mapping>
<filter-name>BackServletFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

*************************************************

1、过滤器BackServletFilter要完成什么事?

(1)获取访问路径的"/admin_category_list"字符串

String contextPath=request.getServletContext().getContextPath();

String uri = request.getRequestURI();

uri =StringUtils.remove(uri, contextPath);

(2)对以"/admin_"开头的路径,进行判断。

如果条件成立,实施步骤(3、4、5)。

不成立的,进行下一个路径的拦截。

       if(uri.startsWith("/admin_")){
//(3)
//(4)
//(5)
return;
}
chain.doFilter(request, response);

(3)获取访问路径中的category和list这两个字符串

String  servletName=StringUtils.substringBetween(uri,"_", "_");

String method=StringUtils.substringAfterLast(uri,"_" );

(4)确定要进入的Servlet类类名和要调用的方法名

String servletPath = servletName + "Servlet";
String method = StringUtils.substringAfterLast(uri,"_" );

(5)服务端跳转到指定的Servlet,同时在请求中传递一个参数

request.setAttribute("method", method);

req.getRequestDispatcher("/" + servletPath).forward(request, response);

2、指定的Servlet类(这里指CategoryServlet)要完成什么事?

(1)获取请求中的参数

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

(2)根据参数创建Method对象m

 Method m = this.getClass().getMethod(method);

(3)调用m

m.invoke(this);

3、根据调用m后返回的结果,进行不同的处理。

String redirect = m.invoke(this);

(1)客户端跳转

if(redirect.startsWith("@"))

response.sendRedirect(redirect.substring(1));

(2)服务端跳转

else

request.getRequestDispathcher(redirect).forword(request,response);

(3)输出字符串

esle if(redirect.startsWith("%"))

response.getWriter().print(redirect.substring(1));

注意:

(1)服务端跳转的话,路径不变,跳转前后还是同一个请求,

可以以此获得请求中的参数或者session值。

(2)客户端跳转的话,路径改变,请求改变。

(3)有数值要传递的话优先服务端跳转。

在CategoryServlet类中,有5种方法可供调用,返回的结果各不相同。

1、add()方法,最后要跳转到/admin_category_list路径

return  ——>@admin_category_list

2、delete()方法,最后要跳转到/admin_category_list路径

return  ——>@admin_category_list

3、edit()方法,最后要跳转到edit.jsp页面

return   ——>admin/editCategory.jsp

4、update()方法,最后要跳转到/admin_category_list路径

return  ——>@admin_category_list

5、list()方法,最后要跳转到list.jsp页面

return   ——>admin/listCategory.jsp

注意:BaseBackServlet类重写了service()方法,

2和3所说的重复性代码被封装在这个方法里。

 

设计模式:Filter+Servlet+反射的更多相关文章

  1. web.xml中的主要元素说明(listener, filter, servlet)

    web.xml中加载的顺序为:context-param ---> listener ---> filter ---> servlet. listener:主要针对的是对象的操作,如 ...

  2. [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦

    [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...

  3. web.xml之context-param,listener,filter,servlet加载顺序及其周边

    先以加载spring为例子看看加载顺序的作用: Spring加载可以利用ServletContextListener 实现,也可以采用load-on-startup Servlet 实现,但比如fil ...

  4. springboot 2.1.3.RELEASE添加filter,servlet源码学习

    Servlet规范中,通过ServeltContext来注册Filter.Servlet,这里分析Filter,Servlet是相同逻辑 springboot2.0中,我们通过 FilterRegis ...

  5. Spring MVC中Filter Servlet Interceptor 执行顺序

    <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springfr ...

  6. servlet反射、生命周期、接口

    什么是Servlet Servlet是JavaWeb的三大组件之一,它属于动态资源.Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要: l  ...

  7. servlet/filter/listener/interceptor区别与联系

    转自:http://www.cnblogs.com/doit8791/p/4209442.html servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是 ...

  8. Servlet、Filter、Listener、Interceptor

    首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角 色,Interceptor是某些MVC框架中的角色,比如Str ...

  9. servlet、filter、listener、interceptor之间的区别和联系

    一.概念 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层. 2.filter: ...

随机推荐

  1. TCP 3-Way Handshake

    TCP是面向连接的协议,其数据传输过程分为建立连接.数据传送.释放连接三个阶段. 0 建立连接 建立连接的过程也就是常说的"三次握手": 客户端向服务器端发送一个SYN报文(SYN ...

  2. [Docker]compose一键部署nginx

    Docker-compose部署nginx 创建配置文件 mkdir -p /usr/local/docker/nginx cat > /usr/local/docker/nginx/docke ...

  3. P1518 两只塔姆沃斯牛 The Tamworth Two(简单的搜索题)

    题目描述 两只牛逃跑到了森林里.农夫John开始用他的专家技术追捕这两头牛.你的任务是模拟他们的行为(牛和John). 追击在10x10的平面网格内进行.一个格子可以是: 一个障碍物, 两头牛(它们总 ...

  4. java基于socket的网络通信,实现一个服务端多个客户端的群聊,传输文件功能,界面使用Swing

    最近在复习java的io流及网络编程.但复习写那些样板程序总是乏味的.便准备写个项目来巩固.想来想去还是聊天项目比较好玩.如果日后完成的比较好自己也可以用(哈哈哈).并且自己后面也要继续巩固java多 ...

  5. windows中配置安装mysql数据库

    MySql 是一种免费的关系型数据库,相较于 MsSqlServer 和 Oracle 比较轻量化,安装也很简单,而且免费不需要的版权费用,个人认为一般的小项目采用还是比较合适的,当然也有部分数据量很 ...

  6. 最短路径树:Dijstra算法

    一.背景 全文根据<算法-第四版>,Dijkstra算法.我们把问题抽象为2步:1.数据结构抽象   2.实现 二.算法分析 2.1 数据结构 顶点+边->图.注意:Dijkstra ...

  7. 微信小程序使用GoEasy实现websocket实时通讯

    不需要下载安装,便可以在微信好友.微信群之间快速的转发,用户只需要扫码或者在微信里点击,就可以立即运行,有着近似APP的用户体验,使得微信小程序成为全民热爱的好东西~ 同时因为微信小程序使用的是Jav ...

  8. 用ArcGIS?37个Arcmap常用操作技巧可能帮到您

    1. 要素的剪切与延伸 实用工具 TASK 任务栏 Extend/Trim feature 剪切所得内容与你画线的方向有关. 2. 自动捕捉跟踪工具 点击Editor工具栏中Snapping来打开Sn ...

  9. python语法学习第九天--else和with语句

    else: while/for else:正常执行完循环(非break)执行else中代码 try else:未捕捉到异常,执行else中代码 with: 语法格式: with open('666.t ...

  10. Arrays.binarySearch的返回值

    如果查找的值包含在数组中,返回搜索的第一个值的下标: 如果查找的值不在数组中,返回(-插入点-1):插入点即为第一个大于此查找值的元素下标 插入点 为将该值插入数组的那一点:即第一个大于此键的元素下标 ...