多个请求共用一个Servlet(JavaWEB)

    我们在对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>

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

        

 

转载于:https://www.cnblogs.com/guohu/p/11345033.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要创建一个Servlet类,首先需要创建一个类继承自javax.servlet.http.HttpServlet,实现doGet()和doPost()方法即可。好的,下面是创建一个Servlet类的步骤: 1. 创建一个Java Web项目,可以使用任何Java Web开发工具,如Eclipse、IntelliJ IDEA等。 2. 在src目录下创建一个Java包,用于存放Servlet类。 3. 在该包下创建一个Java类,该类必须继承javax.servlet.http.HttpServlet类。 4. 实现doGet或doPost方法(或者两者都实现),根据业务需求进行相应的逻辑处理。 5. 配置Servlet映射,将Servlet类与请求URL进行关联。可以在web.xml文件中配置Servlet映射,或使用注解@WebServlet进行配置。 6. 将项目部署到Web服务器中。 下面是一个示例Servlet类: ```java import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(name = "HelloServlet", urlPatterns = {"/hello"}) public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); response.getWriter().write("<h1>Hello Servlet!</h1>"); } } ``` 在这个示例中,我们创建了一个名为HelloServletServlet类,并将其映射到URL“/hello”。在doGet方法中,我们设置了响应内容的类型为"text/html;charset=utf-8",并输出了一条简单的HTML文本响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值