2019独角兽企业重金招聘Python工程师标准>>>

传统的Servlet都是一个请求对应一个Servlet。

例子如下:

请求:http://localhost:8080/ServletTest/Login

web.xml配置:

    <servlet><servlet-name>Regist</servlet-name><servlet-class>cn.xiaol.web.servlet.before.RegistServlet</servlet-class></servlet><servlet-mapping><servlet-name>Regist</servlet-name><url-pattern>/Regist</url-pattern></servlet-mapping>

Servlet代码:

public class RegistServlet extends HttpServlet {@Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 重定向到regist页面response.sendRedirect(request.getContextPath() + "/regist.jsp");}// 在url上面测试是用Get方法请求,所以需要重写doGet()让它调用doPost()。// 也可以把doPost()中的代码直接写在doGet()@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

所以当web项目很大时,请求也就很多,web.xml的配置量也就跟着变大,各种Servlet类爆增。

于是我们可以通过反射的方式,将一类方法放在一个Servlet类中。例如User的增删改查请求可以放在一个UserServlet里面处理。

下面做一个例子,将login和regist请求放在一个TestServlet中处理。但是在此之前需要先写一个父类BaseServlet,里面有一个利用反射原理实现的通过方法名调用对应方法的方法。挺绕口的。意思是这个BaseServlet继承HttpServlet,然后重写service()方法,因为每一个请求Servlet都会调用一次service方法,而这个service方法通过反射和请求中带的method参数可以调用自己类中对应的方法。

一个完整的流程就是:

第一步:请求http://localhost:8080/ServletTest/TestServlet?method=login

第二步:子类TestServlet继承了BaseServlet,所以也继承了父类的service方法。一次请求触发一次service方法,于是service方法通过反射调用了TestServlet中的login方法。

第三步:login方法处理完返回处理结果。

下面是例子:

请求:http://localhost:8080/ServletTest/TestServlet?method=login

1、http://localhost:8080/ServletTest/TestServlet是我们要请求的Servlet

2、method=login是我们要请求的Servlet中的方法

web.xml配置:

   <servlet><servlet-name>TestServlet</servlet-name><servlet-class>cn.xiaol.web.servlet.after.TestServlet</servlet-class></servlet><servlet-mapping><servlet-name>TestServlet</servlet-name><url-pattern>/TestServlet</url-pattern></servlet-mapping>

BaseServlet代码:

package cn.xiaol.web.servlet.after;import java.io.IOException;
import java.lang.reflect.Method;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class BaseServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 1、获得方法名称String methodName = request.getParameter("method");Method method = null;// 2、通过方法名和方法所需要的参数获得Method对象try {method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);} catch (Exception e) {throw new RuntimeException("调用的方法:" + methodName + "不存在", e);}// 3、通过Method对象调用方法try {String result = (String) method.invoke(this, request, response);if (result != null && result.trim().length() > 0) {// 如果返回的result不为空int index = result.indexOf(":");// 获得第一个冒号的位置if (index == -1) {// 如果没有冒号,就使用转发request.getRequestDispatcher(result).forward(request, response);} else {// 如果有冒号String start = result.substring(0, index);// 截取前缀String path = result.substring(index + 1);// 截取路径if (start.equalsIgnoreCase("f")) {// 前缀为f表示使用转发request.getRequestDispatcher(path).forward(request, response);} else if (start.equalsIgnoreCase("r")) {// 前缀为r表示使用重定向response.sendRedirect(request.getContextPath() + path);}}}} catch (Exception e) {throw new RuntimeException(e);}}
}

TestServlet代码:

package cn.xiaol.web.servlet.after;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** @date 创建时间:2016年10月15日 上午11:59:25*/
public class TestServlet extends BaseServlet {public String login(HttpServletRequest request, HttpServletResponse response) {System.out.println("login");return "/login.jsp";}public String regist(HttpServletRequest request, HttpServletResponse response) {System.out.println("regist");return "/regist.jsp";}
}

当我们需要增加一个有关Test的请求时,我们可以直接在TestServlet中添加相关方法,而不比再写一个Servlet类。但是请求的时候记得要带上method方法参数。

下面是Demo的完整代码

http://pan.baidu.com/s/1nvuEhBz

转载于:https://my.oschina.net/Shawn1in/blog/759004

Servlet做Controller,实现一个类处理多个请求相关推荐

  1. 如何使用纯Servlet做一个单表的CRUD操作

    目录 第一步:准备一张数据库表.(sql脚本) 第二步:准备一套HTML页面(项目原型)[前端开发工具使用HBuilder] 第三步:分析我们这个系统包括哪些功能? 第四步:在IDEA当中搭建开发环境 ...

  2. 写出一个类People,并由该类做基类派生出子类Employee和Teacher

    写出一个类People,并由该类做基类派生出子类Employee和Teacher.其中People 类具有name.age两个保护成员变量,分别为String类型.整型,且具有公有的getAge成员函 ...

  3. moba寻路_GitHub - ylmbtm/MoBaDemo: 用Unity做的一个类Moba游戏Demo

    游戏整体逻辑 出兵逻辑 游戏会在两个阵营的固定区域在固定的频率中出兵.小兵只能沿着规定好的轨道进行行走,并按照各个防守塔的顺序向敌方进行进攻. 需要注意的点 对于固定出现的小兵来说,不适合在其死亡之后 ...

  4. moba寻路_GitHub - aafasou/MoBaDemo: 用Unity做的一个类Moba游戏Demo

    游戏整体逻辑 出兵逻辑 游戏会在两个阵营的固定区域在固定的频率中出兵.小兵只能沿着规定好的轨道进行行走,并按照各个防守塔的顺序向敌方进行进攻. 需要注意的点 对于固定出现的小兵来说,不适合在其死亡之后 ...

  5. [转载] Java中如何引用另一个类里的集合_Java工程师面试题整理

    参考链接: 在Java中将预定义的类名用作类或变量名 花了一星期把学过的都整理一遍 尽量易懂,从基础到框架 最新版大厂面经汇总出炉,持续更新中 汇总完了上传网盘,设计到后端架构师的一切知识 如果没更新 ...

  6. Servlet入门篇(GenericServlet 类 - HttpServlet 类 -ServletConfig 接口 - HttpServletRequest 接口……)

    1.Servlet 简介 Servlet 对请求的处理和响应过程可分为以下几个步骤: (1)客户端发送请求至服务器端: (2)服务器将请求信息发送至 Servlet : (3)Servlet 生成响应 ...

  7. 在Java代码(非JSP及Action,Servlet,Controller)中获得WebRoot的物理路径

    在开发Web方面的应用时, 常常须要获取 server中当前WebRoot的物理路径; 假设是Servlet , Action , Controller, 或则Filter , Listener , ...

  8. java设计一个bank类实现银行_java定义一个类实现银行账户的概念。

    2016-11-17 13:40黄瞩信 客户经理 比如,只定义了一个抽象方法run(),而要通过系统用极短的时间.这5s内,此后这个线程就不能进入其它状态,进入消亡状态;+i++). 2,另一方面;, ...

  9. java模拟使用接口,关于java:模拟一个类与模拟它的接口

    对于单元测试,我需要模拟几个依赖项.依赖项之一是实现接口的类: public class DataAccessImpl implements DataAccess { ... } 我需要设置一个这个类 ...

  10. 从Preact了解一个类React的框架是怎么实现的(一): 元素创建

    首先欢迎大家关注我的掘金账号和Github博客,也算是对我的一点鼓励,毕竟写东西没法获得变现,能坚持下去也是靠的是自己的热情和大家的鼓励. 之前分享过几篇关于React的文章: React技术内幕: ...

最新文章

  1. 1047.删除字符串中的所有相邻重复项
  2. Mac上Chrome浏览器跨域解决方案
  3. 【原创】.NET读写Excel工具Spire.Xls使用(4)对数据操作与控制
  4. 搭建基于Heartbeat v2+NFS的高可用Web集群
  5. nyoj1121周期串
  6. Numpy-矩阵的运算
  7. 第三次学JAVA再学不好就吃翔(part82)--泛型
  8. 分布式缓存——缓存与数据库数据一致性
  9. 机器学习代码实战——PCA(主成分分析)
  10. java统计空格代码_java统计文件中字符,数字,汉字,空格数目
  11. 华为交换机学习指南基于端口划分VLAN的四种方案
  12. oracle dbms_lob trim,Oracle - DBMS_LOB函数和用法
  13. vue-cli从2升级到3报错error 404 Not Found: @wry/context@^0.4.0
  14. 干货!从AI应用的五大要素看,AI产业存在哪些机会?(算力算法)
  15. 微信小程序云开发如何实现上传视频 以及 图片
  16. java配置jdk和jre_为什么要配置java环境变量?JDK和JRE的区别在哪里?
  17. 解决ping: www.baidu.com: Name or service not known
  18. Python之心算练习程序
  19. 抗量子加密:为什么迫切需要它
  20. 人工智能会“偷走”潜艇的隐身能力吗?

热门文章

  1. 液压系统原理动画_图文讲解液压系统溢流阀分类与工作原理
  2. android自动修音,唱吧自动修音app下载-唱吧自动修音 安卓版v8.6.0-PC6安卓网
  3. 微信小程序多次跳转后不能点_京东小程序 Taro 开发对比原生开发测评
  4. mysql实现分布式锁_数据库实现分布式锁
  5. java 线程类注入失败_如何在多线程中注入bean?!
  6. python,web框架说明
  7. mysql grant记录信息
  8. 图标X轴this显示值自定义
  9. FR按钮调用数据库(MMSQL)存储过程,参数储存有返回值; 模板参数不可见 编辑后可见
  10. wpf程序网络的影响_DotNetCore Web应用程序中的Cookie管理