Servlet(五):一个Servlet处理多个请求
一、为什么要使用一个Servlet来处理多个请求?
当浏览器发送了一次请求到服务器时,servlet容器会根据请求的url-pattern找到对应的Servlet类,执行对应的doPost或doGet方法,再将响应信息返回给浏览器,这种情况下,一个具体的Servlet类只能处理对应的web.xml中配置的url-pattern请求,一个Servlet类,一对配置信息。如果业务扩展,需要三个Servlet来处理请求,就需要再加上两个具体的Servlet类,两对配置信息,如果继续向上扩展,是不是会认为如此写法的效率非常低下?并且会浪费更多的资源?
为了避免重复的操作(多次编写配置文件,多次新建具体的Servlet类)影响效率,就衍生出一套简单的操作来提高效率,一次配置,多次使用;一个Servlet具体类,处理多个请求。
二、如何使用一个Servlet来处理多个请求?
首先聊聊解决思路,有两种方法。一是根据请求的地址,截取其中的具体方法名,然后使用if-else判断匹配,再执行具体的方法。二是根据截取出来的方法名,使用反射机制,来执行具体的方法。
第一种方案很笨拙,需要不断的使用if-else来判断。第二种方法相对来讲,灵活的处理了原先需要使用if-else的判断逻辑,由类根据方法名自主去执行。
1、新建一个Maven项目,建好一个Servlet类
/**
* 使用一个servlet处理多个请求
* @author 小川94
* @date 2018年6月14日
*/
public class CustomerServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
} @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取请求的URI地址信息
String url = request.getRequestURI();
// 截取其中的方法名
String methodName = url.substring(url.lastIndexOf("/")+1, url.lastIndexOf("."));
Method method = null;
try {
// 使用反射机制获取在本类中声明了的方法
method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
// 执行方法
method.invoke(this, request, response);
} catch (Exception e) {
throw new RuntimeException("调用方法出错!");
}
} private void queryEmp(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("执行查询员工的方法...");
response.setContentType("text/html;charset=utf8");
PrintWriter pw = response.getWriter();
pw.println("<h1>查询员工的方法</h1>");
pw.flush();
pw.close();
} private void addEmp(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("执行新增员工的方法...");
response.setContentType("text/html;charset=utf8");
PrintWriter pw = response.getWriter();
pw.println("<h1>新增员工的方法</h1>");
pw.flush();
pw.close();
} private void deleteEmp(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("执行删除员工的方法...");
response.setContentType("text/html;charset=utf8");
PrintWriter pw = response.getWriter();
pw.println("<h1>删除员工的方法</h1>");
pw.flush();
pw.close();
} private void queryEmpList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("执行查询所有员工的方法...");
response.setContentType("text/html;charset=utf8");
PrintWriter pw = response.getWriter();
pw.println("<h1>查询所有员工的方法</h1>");
pw.flush();
pw.close();
}
}
2、配置web.xml文件信息
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>servlet.CustomerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
3、编写jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试一个Servlet处理多个请求</title>
</head>
<body> <h1>一个Servlet处理多个请求</h1>
<hr>
<a href="queryEmp.do">查询员工信息</a>
<br/>
<br/>
<a href="addEmp.do">新增员工信息</a>
<br/>
<br/>
<a href="deleteEmp.do">删除员工信息</a>
<br/>
<br/>
<a href="queryEmpList.do">查询所有员工信息</a> </body>
</html>
4、测试



测试的结果和预期一致,编写了一个servlet类,处理了页面的多个请求,也处理了四种不同的业务需求。
文章首发于我的个人公众号:悦乐书。喜欢分享一路上听过的歌,看过的电影,读过的书,敲过的代码,深夜的沉思。期待你的关注!

公众号后台输入关键字“Java学习电子书”,即可获得12本Java学习相关的电子书资源,如果经济能力允许,还请支持图书作者的纸质正版书籍,创作不易。
Servlet(五):一个Servlet处理多个请求的更多相关文章
- 第一个Servlet
一,第一个Servlet的编写过程 1,建立JavaWeb应用目录 HelloServlet--web应用名称 classes:Servlet就放在此处 lib web.xml 2,classes目录 ...
- 一个servlet处理多个请求(使用Method的反射机制)
方法一 可以通过在请求的时候加上参数,然后在servlet中获取请求的参数,再去调用对应的方法.达到一个servlet处理多个请求的目的 test.jsp: <%@ page language= ...
- [原创]java WEB学习笔记22:MVC案例完整实践(part 3)---多个请求对应一个Servlet解析
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 多个请求共用一个Servlet(JavaWEB)
我们在对JavaWEB工程进行开发的时候,我们经常会遇到这样一个问题,在jsp中发送到Servlet的每一个请求都要写一个对应的Servlet,这样会造成一个工程完成下来需要写几十个Servlet,那 ...
- 如何用一个servlet处理多个请求
一个servlet处理多个请求,原理:利用反射机制获取在selvlet类中的其他方法1.前端页面<%@ page language="java" contentType=&q ...
- java web(六)多个请求对应一个Servlet
概要: 提交请求的常用方式有两种,get/post , 运行程序后被请求,在加载执行web.xml文件时通过该文件中的映射关系找到即将要执行的Servlet; 而在要执行的Servlet文件中可通过反 ...
- 【WEB小工具】BaseServlet—一个Servlet处理多个请求
package cn.itcast.test.web.servlet; import java.io.IOException; import java.io.PrintWriter; import j ...
- Android发送请求到不同的Servlet,但都是一个Servlet处理
错误原因,在Servlet文件中 @WebServlet("/ServletForGETMethod") 与实际的ServletForQUERYMethod 文件名不符. @Web ...
- MVC案例之多个请求对应一个servlet
CustomerServlet package com.aff.mvcapp.servlet; import java.io.IOException; import java.lang.reflec ...
随机推荐
- QT 应用程序测试
添加环境 export QTEDIR='/Qt5' export QTINC='/Qt5/include/' export QTLIB='/Qt5/lib' export QT_QPA_FB_TSLI ...
- JavaScript 系列博客(三)
JavaScript 系列博客(三) 前言 本篇介绍 JavaScript 中的函数知识. 函数的三种声明方法 function 命令 可以类比为 python 中的 def 关键词. functio ...
- Try Catch 嵌套问题
程序错误 问题描述: 在一个事物中,插入两张表数据,但是第一个成功,第二个失败了,没有起到所谓的事物的功能,这让我百思不得其解 问题所在: 本质上其实报错了,但是错误被吃掉了,具体来说,就是 try ...
- [android] 保存文件到SD卡
/****************2016年5月4日 更新*****************************/ 知乎:为什么很多Android应用要把文件写到/sdcard目录下而不是写到/d ...
- 21.QT-QTreeWidget,QTabWidget
QTreeWidget树形列表 设置标签相关函数 void QTreeWidget::setHeaderItem (QTreeWidgetItem * item ); void QTreeWidget ...
- Java基础篇——集合浅谈
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10703558.html,否则将追究法律责任!!! Set(基于Map来实现的,不细说) H ...
- mapreduce中文乱码,已解决
问题: mapreduce中文乱码 原因: 再用Hadoop处理数据的时候,发现输出的时候,总是会出现乱码,这是因为Hadoop在设计编码的时候,是写死的.默认是UTF-8,所以当你处理的文件编码格式 ...
- 8张图让你一步步看清 async/await 和 promise 的执行顺序
摘要: 面试必问 原文:8张图帮你一步步看清 async/await 和 promise 的执行顺序 作者:ziwei3749 Fundebug经授权转载,版权归原作者所有. 为什么写这篇文章? 说实 ...
- JavaScript中Map和ForEach的区别
译者按: 惯用Haskell的我更爱map. 原文: JavaScript — Map vs. ForEach - What’s the difference between Map and ForE ...
- vim编辑器头部自动插入注释和shell的高亮显示
1.基本语法 语法高亮 :syntax on/off 显示行号 set number/nonumber 自动缩进 set autoindent set cindent 2.自动加入文件头 在etc/v ...