Servlet(五):一個Servlet處理多個請求

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學習相關的電子書資源,若是經濟能力容許,還請支持圖書做者的紙質正版書籍,創做不易。

相關文章
相關標籤/搜索