1、为何要使用一个Servlet来处理多个请求?html
当浏览器发送了一次请求到服务器时,servlet容器会根据请求的url-pattern找到对应的Servlet类,执行对应的doPost或doGet方法,再将响应信息返回给浏览器,这种状况下,一个具体的Servlet类只能处理对应的web.xml中配置的url-pattern请求,一个Servlet类,一对配置信息。若是业务扩展,须要三个Servlet来处理请求,就须要再加上两个具体的Servlet类,两对配置信息,若是继续向上扩展,是否是会认为如此写法的效率很是低下?而且会浪费更多的资源?java
为了不重复的操做(屡次编写配置文件,屡次新建具体的Servlet类)影响效率,就衍生出一套简单的操做来提升效率,一次配置,屡次使用;一个Servlet具体类,处理多个请求。web
2、如何使用一个Servlet来处理多个请求?浏览器
首先聊聊解决思路,有两种方法。一是根据请求的地址,截取其中的具体方法名,而后使用if-else判断匹配,再执行具体的方法。二是根据截取出来的方法名,使用反射机制,来执行具体的方法。服务器
第一种方案很笨拙,须要不断的使用if-else来判断。第二种方法相对来说,灵活的处理了原先须要使用if-else的判断逻辑,由类根据方法名自主去执行。app
一、新建一个Maven项目,建好一个Servlet类jsp
/** * 使用一个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(); } }
二、配置web.xml文件信息ide
<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>
三、编写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>
四、测试测试
测试的结果和预期一致,编写了一个servlet类,处理了页面的多个请求,也处理了四种不一样的业务需求。
文章首发于个人我的公众号:悦乐书。喜欢分享一路上听过的歌,看过的电影,读过的书,敲过的代码,深夜的沉思。期待你的关注!
公众号后台输入关键字“Java学习电子书”,便可得到12本Java学习相关的电子书资源,若是经济能力容许,还请支持图书做者的纸质正版书籍,创做不易。