我们在对JavaWEB工程进行开发的时候,我们经常会遇到这样一个问题,在jsp中发送到Servlet的每一个请求都要写一个对应的Servlet,这样会造成一个工程完成下来需要写几十个Servlet,那么怎么可以做到多个请求共用一个Servlet呢?

下面介绍两种方法(第一种比较难理解一点,第二种相对容易):

一、利用反射原理(根据获取到的url-pattern,截取出相应的方法名,进而调用相应的方法)

1.配置web.xml文件,<url-pattern>中设置以 *.扩展名 的方式进行匹配(下面的例子以 *.do 匹配,调用的Servlet为 StaffServlet,对Staff表的查询query 和删除delete 请求进行处理)

  1.  
    <servlet>
  2.  
    <servlet-name>StaffServlet</servlet-name>
  3.  
    <servlet-class>cn.edu.lingnan.servlet.StaffServlet</servlet-class>
  4.  
    </servlet>
  5.  
    <servlet-mapping>
  6.  
    <servlet-name>StaffServlet</servlet-name>
  7.  
    <url-pattern>*.do</url-pattern>
  8.  
    </servlet-mapping>

所有以 .do 结尾的请求都会调用StaffServlet

2.编写Servlet(例子:StaffServlet)

  1.  
    public class StaffServlet extends HttpServlet {
  2.  
    private static final long serialVersionUID = 1L;
  3.  
     
  4.  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  5.  
    doPost(request, response);
  6.  
    }
  7.  
     
  8.  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  9.  
    //1.获取能够与“url-pattern”中匹配的路径
  10.  
    String method = request.getServletPath();
  11.  
     
  12.  
    //(此时处理的请求是查询 query.do)
  13.  
    System.out.println("request.getServletPath()获取的值为: " + method);//输出 /query.do
  14.  
     
  15.  
    //2.通过字符串截取,把方法名 query 截取出来
  16.  
    method = method.substring(1, method.length()-3);
  17.  
     
  18.  
    System.out.println("截取后的值为: "+ method);
  19.  
     
  20.  
    Method m = null;
  21.  
    try {
  22.  
    //3.获取当前类中名字为 method 的方法
  23.  
    m = this.getClass().getDeclaredMethod(method,
  24.  
    HttpServletRequest.class, HttpServletResponse.class);
  25.  
     
  26.  
    //4.调用 method 方法
  27.  
    m.invoke(this, request, response);
  28.  
    } catch (Exception e) {
  29.  
    e.printStackTrace();
  30.  
    }
  31.  
    }
  32.  
     
  33.  
    private void query(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  34.  
    System.out.println("query方法被调用");
  35.  
     
  36.  
    }
  37.  
     
  38.  
    private void delete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  39.  
    System.out.println("delete方法被调用");
  40.  
     
  41.  
    }
  42.  
    }

  3. jsp 中发送请求调用servlet

  1.  
    <%@ page language="java" contentType="text/html; charset=UTF-8"
  2.  
    pageEncoding="UTF-8"%>
  3.  
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4.  
    <html>
  5.  
    <head>
  6.  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7.  
    <title>Insert title here</title>
  8.  
    </head>
  9.  
    <body>
  10.  
    <a href="query.do">这是一个查询请求,调用Servlet中的query方法</a>
  11.  
    <br>
  12.  
    <br>
  13.  
    <a href="delete.do">这是一个删除请求,调用Servlet中的delete方法</a>
  14.  
    </body>
  15.  
    </html>

点查询和删除的超链接后台输出结果如下:

如还需要添加其他操作请求,只需在Servlet中添加相应名字的方法,如更新请求 jsp中 update.do,  servlet中添加如下方法:

  1.  
    private void update(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2.  
     
  3.  
    }

其他请求也是如上操作即可,注意:url-pattern 中的扩展名可以是任意字符,不一定要是 .do , 例如也可以是 .doStaff , 但是改了扩展名了要注意修改截取的字符串的位置,如修改由.do 修改为 .doStaff 时,doPost中

method = method.substring(1, method.length()-3);需修改为(.do 为三个字符)

method = method.substring(1, method.length()-8);(.doStaff 为八个字符)

jsp 中调用时,则也相应修改 query.do ---> query.doStaff

二、利用URL中的参数传送需要调用的方法名

1.配置web.xml, 映射Servlet路径(以下以 StudentServlet 调用 Servlet 中的 query 和 delete 方法为例子)

  1.  
    <servlet>
  2.  
    <servlet-name>StudentServlet</servlet-name>
  3.  
    <servlet-class>servlet.StudentServlet</servlet-class>
  4.  
    </servlet>
  5.  
    <servlet-mapping>
  6.  
    <servlet-name>StudentServlet</servlet-name>
  7.  
    <url-pattern>/studentServlet</url-pattern>
  8.  
    </servlet-mapping>

2.编写Servlet(StudentServlet)

  1.  
    package servlet;
  2.  
     
  3.  
    import java.io.IOException;
  4.  
    import javax.servlet.ServletException;
  5.  
    import javax.servlet.annotation.WebServlet;
  6.  
    import javax.servlet.http.HttpServlet;
  7.  
    import javax.servlet.http.HttpServletRequest;
  8.  
    import javax.servlet.http.HttpServletResponse;
  9.  
     
  10.  
    /**
  11.  
    * Servlet implementation class StudentServlet
  12.  
    */
  13.  
     
  14.  
    public class StudentServlet extends HttpServlet {
  15.  
    private static final long serialVersionUID = 1L;
  16.  
     
  17.  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18.  
    this.doPost(request, response);
  19.  
    }
  20.  
     
  21.  
     
  22.  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  23.  
    //获取请求参数 method
  24.  
    String method = request.getParameter("method");
  25.  
     
  26.  
    System.out.println("获取到的method参数为: " + method);
  27.  
    //调用 method 方法
  28.  
    if(method.equals("query")) {
  29.  
    this.query(request, response);
  30.  
    }else {
  31.  
    if(method.equals("delete")) {
  32.  
    this.delete(request, response);
  33.  
    }
  34.  
    }
  35.  
    }
  36.  
     
  37.  
    private void query(HttpServletRequest request, HttpServletResponse response)
  38.  
    throws ServletException, IOException {
  39.  
    System.out.println("query 方法被调用");
  40.  
    }
  41.  
     
  42.  
    private void delete(HttpServletRequest request, HttpServletResponse response)
  43.  
    throws ServletException, IOException {
  44.  
    System.out.println("delete 方法被调用");
  45.  
    }
  46.  
    }

 3. jsp中发送请求调用Servlet

  1.  
    <%@ page language="java" contentType="text/html; charset=UTF-8"
  2.  
    pageEncoding="UTF-8"%>
  3.  
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4.  
    <html>
  5.  
    <head>
  6.  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7.  
    <title>Insert title here</title>
  8.  
    </head>
  9.  
    <body>
  10.  
    <a href="studentServlet?method=query">这是一个查询请求,调用Servlet中的query方法</a>
  11.  
    <br>
  12.  
    <br>
  13.  
    <a href="delete.do?method=delete">这是一个删除请求,调用Servlet中的delete方法</a>
  14.  
    </body>
  15.  
    </html>

点查询和删除超链接后台输出结果如下:

多个请求共用一个Servlet(JavaWEB)的更多相关文章

  1. [原创]java WEB学习笔记22:MVC案例完整实践(part 3)---多个请求对应一个Servlet解析

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  2. java web(六)多个请求对应一个Servlet

    概要: 提交请求的常用方式有两种,get/post , 运行程序后被请求,在加载执行web.xml文件时通过该文件中的映射关系找到即将要执行的Servlet; 而在要执行的Servlet文件中可通过反 ...

  3. MVC案例之多个请求对应一个servlet

     CustomerServlet package com.aff.mvcapp.servlet; import java.io.IOException; import java.lang.reflec ...

  4. Servlet(五):一个Servlet处理多个请求

    一.为什么要使用一个Servlet来处理多个请求? 当浏览器发送了一次请求到服务器时,servlet容器会根据请求的url-pattern找到对应的Servlet类,执行对应的doPost或doGet ...

  5. servlet的一个web容器中有且只有一个servlet实例或有多个实例的理解1

    servlet的一个web容器中有且只有一个servlet实例或有多个实例的理解 (2013-06-19 19:30:40) 转载▼     servlet的非线程安全,action的线程安全 对提交 ...

  6. javaWEB总结(1):第一个servlet程序

    1.新建一个javaWeb工程,工程的目录如下 2.在com.dao.chu的包下新建一个HelloServlet.java类 package com.dao.chu; import java.io. ...

  7. JavaWeb知识回顾-使用IDEA开发一个servlet.

    刚刚开始学习使用IDEA进行开发,好多都不会,本来想直接导入一个eclipse项目,但是出现了好多错误,一时不知道怎么修改,所以就从最基本的servlet开始着手,慢慢熟悉这个工具,下面是使用IDEA ...

  8. 一个servlet处理多个请求(使用Method的反射机制)

    方法一 可以通过在请求的时候加上参数,然后在servlet中获取请求的参数,再去调用对应的方法.达到一个servlet处理多个请求的目的 test.jsp: <%@ page language= ...

  9. 如何用一个servlet处理多个请求

    一个servlet处理多个请求,原理:利用反射机制获取在selvlet类中的其他方法1.前端页面<%@ page language="java" contentType=&q ...

随机推荐

  1. [IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套

    转自:https://mp.weixin.qq.com/s?__biz=MzI0MDk0ODcxMw==&mid=2247483680&idx=1&sn=c5fd069ab3f ...

  2. Jmeter4.0 _Beanshell解析并获取json响应数据数组长度

    我们在做jmeter接口测试的时候,有时候碰到开发没返回数据total,只返回了一条条记录,可是呢,我们又需要知道到底返回了多少条数据时,咋办呢?咋办呢?咋办呢? 不要急,接下来,让我们见证奇迹是如何 ...

  3. 国际化(i18n) 各国语言缩写

    internationalization (国际化)简称:i18n,因为在i和n之间还有18个字符,localization(本地化 ),简称L10n. 一般用语言_地区的形式表示一种语言,如:zh_ ...

  4. suse12安装详解

    1.部署步骤 1.1.启动安装程序 在启动页面上选择Installation,然后按Enter键,这将载入SUSE Linux服务器安装程序并以普通模式安装. 1.2.选择安装语言 Language和 ...

  5. WEB监控手段

    WEB监控手段: 1.端口       本地: ss . netstat .lsof         ss -ntlp|grep 80|wc -l    (大于等于1)          netsta ...

  6. 小程序框架之视图层 View~基础组件

    框架为开发者提供了一系列基础组件,开发者可以通过组合这些基础组件进行快速开发.详细介绍请参考组件文档. 什么是组件: 组件是视图层的基本组成单元. 组件自带一些功能与微信风格一致的样式. 一个组件通常 ...

  7. keras模块学习之层(layer)的使用-笔记

    本笔记由博客园-圆柱模板 博主整理笔记发布,转载需注明,谢谢合作! keras的层主要包括: 常用层(Core).卷积层(Convolutional).池化层(Pooling).局部连接层.递归层(R ...

  8. Burp Suite的代理Brup Proxy的使用详解

    Burp Proxy 是Burp Suite以用户驱动测试流程功能的核心,通过代理模式,可以让我们拦截.查看.修改所有在客户端和服务端之间传输的数据.  

  9. Idea导入maven项目

    1.idea中有项目的关闭项目  File>>close project  回到截图 下一步>下一步

  10. 2017.10.3 国庆清北 D3T2 公交车

    题目描述 LYK在玩一个游戏. 有k群小怪兽想乘坐公交车.第i群小怪兽想从xi出发乘坐公交车到yi.但公交车的容量只有M,而且这辆公交车只会从1号点行驶到n号点. LYK想让小怪兽们尽可能的到达自己想 ...