• 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学习相关的电子书资源,如果经济能力允许,还请支持图书作者的纸质正版书籍,创作不易。

  • 相关阅读:
    ios tablevie 圆角
    IOS window(窗口)、视图(view)frame的学习
    iOS 测试用代码
    自定义导航条UINavigationbar
    前端正则表达式书写以及常用的方法
    JavaScript中的类、原型、原型链、继承(转载)
    简单详细讲解js闭包(转载)
    前端中的事件循环eventloop机制(转载)
    CSS优化技巧,可缩短页面加载时间(转载)
    程序员如何快速提高编程能力?快来看大牛的方法(转)
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/9184444.html
Copyright © 2020-2023  润新知