我们在对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. I、Mac 下的Vue

    Mac 下的Vue 1. 安装brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/i ...

  2. The Essential Burp Suite

    OK   we have download teh burp suite .let's begin start the tool 1.if  we  want to use the total mem ...

  3. 使用Cloudera Manager搭建HDFS完全分布式集群

    使用Cloudera Manager搭建HDFS完全分布式集群 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于Cloudera Manager的搭建我这里就不再赘述了,可以参考 ...

  4. python抽象基类

    抽象基类 抽象基类提了一种方式,用以组织对象的层次结构,做出关于所需方法的断言,以及实现其他一些功能 要定义抽象基类,需要使用abc模块,该模块定义了一个元类(ABCMeta) 和一组装饰器(@abs ...

  5. linux下svn的使用

    环境搭建: yum install subversion       yum安装svn服务 svn --version 检查是否安装 cd /usr/local/svn/conf 找到conf 文件 ...

  6. EF映射——从数据库更新实体

    最近在做ITOO项目,由于更新了数据库,需要重新从数据库映射到实体,本来看过关于EF的学习资料,直接可以从数据库更新到实体,但这种小事也是有很多问题的,必须在更新的时候做好选择.下面分享一下如何从数据 ...

  7. java -static的特性和使用,静态类/方法/块/内部类/回收机制

    mark一下,今天的作业. java-core P115 如果将域定义为static,每个类中只有一个这样的域.(这里的域应该是指一片物理数据空间,而不是单纯的指代某一个变量,而是静态域). publ ...

  8. flask处理数据,页面实时刷新展示

    背景: 后端 flask(python)处理数据,页面实时刷新,类似于打包页面的动态展示,展示效果如图: 代码如下: 前端主要使用以下循环处理, 2--- 2秒刷新一次 {% if 0 == stop ...

  9. SVM: 直观上理解大间距分类器

    在SVM中,增加安全的间距因子 那么增加了这个间距因子后,会出现什么样的结果呢,我们将C设置为很大(C=100000) SVM决策边界 当我们将C设置得很大进,要想SVM的cost function最 ...

  10. learning java AWT 布局管理器FlowLayout

    AWT提供了FlowLayout   从左到右排列所有组件,遇到边界就会折回下一行重新开始. import java.awt.*; public class FlowLayoutTest { publ ...