传统设计

分类管理需要:增加,删除,编辑,修改,查询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所说的重复性代码被封装在这个方法里。

 

最新文章

  1. AppCan开发者资料分享(定期更新)
  2. Asp.Net MVC4入门指南(5):从控制器访问数据模型
  3. android 事件传递机制 心得
  4. python走起之第三话
  5. MyBatis知多少(12)私有数据库
  6. 【Android UI设计与开发】1.引导界面(一)ViewPager介绍和简单实现
  7. css样式(二)(伪类 | 伪元素 | 导航 | 图像拼合 | 属性选择器 )
  8. C语言警告:warning C4018: &ldquo;&lt;&rdquo;: 有符号/无符号不匹配
  9. 学习笔记之DB2 9 Fundamentals 730
  10. ExtJS实例1
  11. ER图与UML图
  12. 敏捷开发-Scrum 真实
  13. 【数据库】Mean web开发 03-MongoDB客户端管理工具NoSQL Manager for MongoDB的使用
  14. [LeetCode] Longest Uncommon Subsequence II 最长非共同子序列之二
  15. 2018-4-5-cadence skill
  16. 页面的input唤醒软键盘再收起后,页面会出现软键盘高度的空白背景
  17. 元组tuple 可迭代对象
  18. Python抓取百度汉字笔画的gif
  19. 两个select一个选中,另一个就没有选中的那个值
  20. Win10系统安装过程小记

热门文章

  1. HDU 5725 Game
  2. MATLAB 之MATLAB2016b 安装破解教程
  3. 【Linux常见命令】tail命令
  4. Linux shell基础(五)sed命令
  5. 原生JS设计轮播图
  6. 题解 CF1286A 【Garland】
  7. Java λ表达式
  8. Spring Cloud学习 之 Spring Cloud Hystrix(流程分析)
  9. Spring Cloud学习 之 Spring Cloud Hystrix(基础知识铺垫)
  10. openshift 4.3 Istio的搭建(istio 系列一)