设计模式:Filter+Servlet+反射
传统设计
分类管理需要:增加,删除,编辑,修改,查询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> ************************************************* 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)获取访问路径中的category和list这两个字符串 String servletName=StringUtils.substringBetween(uri,"_", "_"); String method=StringUtils.substringAfterLast(uri,"_" ); (4)确定要进入的Servlet类类名和要调用的方法名 String servletPath = servletName + "Servlet"; (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+反射的更多相关文章
- web.xml中的主要元素说明(listener, filter, servlet)
web.xml中加载的顺序为:context-param ---> listener ---> filter ---> servlet. listener:主要针对的是对象的操作,如 ...
- [.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦
[.net 面向对象程序设计进阶] (21) 反射(Reflection)(下)设计模式中利用反射解耦 本节导读:上篇文章简单介绍了.NET面向对象中一个重要的技术反射的基本应用,它可以让我们动态的调 ...
- web.xml之context-param,listener,filter,servlet加载顺序及其周边
先以加载spring为例子看看加载顺序的作用: Spring加载可以利用ServletContextListener 实现,也可以采用load-on-startup Servlet 实现,但比如fil ...
- springboot 2.1.3.RELEASE添加filter,servlet源码学习
Servlet规范中,通过ServeltContext来注册Filter.Servlet,这里分析Filter,Servlet是相同逻辑 springboot2.0中,我们通过 FilterRegis ...
- Spring MVC中Filter Servlet Interceptor 执行顺序
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springfr ...
- servlet反射、生命周期、接口
什么是Servlet Servlet是JavaWeb的三大组件之一,它属于动态资源.Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要: l ...
- servlet/filter/listener/interceptor区别与联系
转自:http://www.cnblogs.com/doit8791/p/4209442.html servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是 ...
- Servlet、Filter、Listener、Interceptor
首先,JSP/Servlet规范中定义了Servlet.Filter.Listener这三种角色,并没有定义Interceptor这个角 色,Interceptor是某些MVC框架中的角色,比如Str ...
- servlet、filter、listener、interceptor之间的区别和联系
一.概念 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层. 2.filter: ...
随机推荐
- optparse--强大的命令行参数处理包
optparse,它功能强大,而且易于使用,可以方便地生成标准的.符合Unix/Posix 规范的命令行说明. optparse的简单示例: from optparse import OptionPa ...
- 使用nodejs + wecharty打造你的个人微信机器人
开源地址:https://github.com/isnl/wechat-robot 注: 从2017年6月下旬开始,使用基于web版微信接入方案存在大概率的被限制登陆的可能性. 主要表现为:无法登陆W ...
- 腾讯视频怎么转成mp4模式 软件 工具 方法 最新【已解决】
1.搜索: 小白兔视频格式在线转换 2.转换好后视频已经是MP4格式了. 转载于:https://blog.51cto.com/14204019/2396896
- [New Portal]Windows Azure Web Site (3) 创建Web Site和云端数据库
<Windows Azure Platform 系列文章目录> 在前一章的内容里,我介绍了使用Windows Azure Management Portal创建Web Site.本章,我将 ...
- CultureInfo 类中需要的【区域性名称】查询
2019独角兽企业重金招聘Python工程师标准>>> 提供有关特定区域性的信息(对于非托管代码开发,则称为"区域设置"). 这些信息包括区域性的名称.书写系统. ...
- 一只简单的网络爬虫(基于linux C/C++)————socket相关及HTTP
socket相关 建立连接 网络通信中少不了socket,该爬虫没有使用现成的一些库,而是自己封装了socket的相关操作,因为爬虫属于客户端,建立套接字和发起连接都封装在build_connect中 ...
- Nginx模块开发(4)————使用subrequest访问第三方服务
该模块可以完成如下的功能,当我们输入http://你的ip/lcw?s_sh000001时,会使用subrequest方式得到新浪服务器上的上证指数,代码如下: //start from the ve ...
- P1220 关路灯(提高+)
以下内容转自z2415445508 只是为了方便自己复习而已 题目传送门-->关路灯 我是一条憨憨的分割线 关灯不需要额外的时间,经过了灯就关了.但是可能折返回去关某一个大灯会比继续往下走关接下 ...
- E. Marbles 状压dp
E. Marbles 这个是一个状压dp 题目大意是:给你一个数组,数组的数在1到20之间,有一个操作就是交换相邻的两个数,问 让所有相同的数相邻的最小操作次数 dp[s] 表示s状态下的操作次数,w ...
- Spring Boot学习 之 Spring Boot Actuator(一)
Spring Boot版本:2.1.4.RELEASE 启用: spring-boot-actuator模块提供了一系列的用于监控的端点.最简单的开启这个功能的方法就是,在pom文件中添加如下的依赖. ...
