多个请求共用一个Servlet(JavaWEB)
我们在对JavaWEB工程进行开发的时候,我们经常会遇到这样一个问题,在jsp中发送到Servlet的每一个请求都要写一个对应的Servlet,这样会造成一个工程完成下来需要写几十个Servlet,那么怎么可以做到多个请求共用一个Servlet呢?
下面介绍两种方法(第一种比较难理解一点,第二种相对容易):
一、利用反射原理(根据获取到的url-pattern,截取出相应的方法名,进而调用相应的方法)
1.配置web.xml文件,<url-pattern>中设置以 *.扩展名 的方式进行匹配(下面的例子以 *.do 匹配,调用的Servlet为 StaffServlet,对Staff表的查询query 和删除delete 请求进行处理)
- <servlet>
- <servlet-name>StaffServlet</servlet-name>
- <servlet-class>cn.edu.lingnan.servlet.StaffServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>StaffServlet</servlet-name>
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
所有以 .do 结尾的请求都会调用StaffServlet
2.编写Servlet(例子:StaffServlet)
- public class StaffServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- doPost(request, response);
- }
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- //1.获取能够与“url-pattern”中匹配的路径
- String method = request.getServletPath();
- //(此时处理的请求是查询 query.do)
- System.out.println("request.getServletPath()获取的值为: " + method);//输出 /query.do
- //2.通过字符串截取,把方法名 query 截取出来
- method = method.substring(1, method.length()-3);
- System.out.println("截取后的值为: "+ method);
- Method m = null;
- try {
- //3.获取当前类中名字为 method 的方法
- m = this.getClass().getDeclaredMethod(method,
- HttpServletRequest.class, HttpServletResponse.class);
- //4.调用 method 方法
- m.invoke(this, request, response);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private void query(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- System.out.println("query方法被调用");
- }
- private void delete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- System.out.println("delete方法被调用");
- }
- }
3. jsp 中发送请求调用servlet
- <%@ 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>Insert title here</title>
- </head>
- <body>
- <a href="query.do">这是一个查询请求,调用Servlet中的query方法</a>
- <br>
- <br>
- <a href="delete.do">这是一个删除请求,调用Servlet中的delete方法</a>
- </body>
- </html>
点查询和删除的超链接后台输出结果如下:
如还需要添加其他操作请求,只需在Servlet中添加相应名字的方法,如更新请求 jsp中 update.do, servlet中添加如下方法:
- private void update(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- }
其他请求也是如上操作即可,注意: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 方法为例子)
- <servlet>
- <servlet-name>StudentServlet</servlet-name>
- <servlet-class>servlet.StudentServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>StudentServlet</servlet-name>
- <url-pattern>/studentServlet</url-pattern>
- </servlet-mapping>
2.编写Servlet(StudentServlet)
- package servlet;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /**
- * Servlet implementation class StudentServlet
- */
- public class StudentServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- this.doPost(request, response);
- }
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- //获取请求参数 method
- String method = request.getParameter("method");
- System.out.println("获取到的method参数为: " + method);
- //调用 method 方法
- if(method.equals("query")) {
- this.query(request, response);
- }else {
- if(method.equals("delete")) {
- this.delete(request, response);
- }
- }
- }
- private void query(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- System.out.println("query 方法被调用");
- }
- private void delete(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- System.out.println("delete 方法被调用");
- }
- }
3. jsp中发送请求调用Servlet
- <%@ 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>Insert title here</title>
- </head>
- <body>
- <a href="studentServlet?method=query">这是一个查询请求,调用Servlet中的query方法</a>
- <br>
- <br>
- <a href="delete.do?method=delete">这是一个删除请求,调用Servlet中的delete方法</a>
- </body>
- </html>
点查询和删除超链接后台输出结果如下:
多个请求共用一个Servlet(JavaWEB)的更多相关文章
- [原创]java WEB学习笔记22:MVC案例完整实践(part 3)---多个请求对应一个Servlet解析
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- java web(六)多个请求对应一个Servlet
概要: 提交请求的常用方式有两种,get/post , 运行程序后被请求,在加载执行web.xml文件时通过该文件中的映射关系找到即将要执行的Servlet; 而在要执行的Servlet文件中可通过反 ...
- MVC案例之多个请求对应一个servlet
CustomerServlet package com.aff.mvcapp.servlet; import java.io.IOException; import java.lang.reflec ...
- Servlet(五):一个Servlet处理多个请求
一.为什么要使用一个Servlet来处理多个请求? 当浏览器发送了一次请求到服务器时,servlet容器会根据请求的url-pattern找到对应的Servlet类,执行对应的doPost或doGet ...
- servlet的一个web容器中有且只有一个servlet实例或有多个实例的理解1
servlet的一个web容器中有且只有一个servlet实例或有多个实例的理解 (2013-06-19 19:30:40) 转载▼ servlet的非线程安全,action的线程安全 对提交 ...
- javaWEB总结(1):第一个servlet程序
1.新建一个javaWeb工程,工程的目录如下 2.在com.dao.chu的包下新建一个HelloServlet.java类 package com.dao.chu; import java.io. ...
- JavaWeb知识回顾-使用IDEA开发一个servlet.
刚刚开始学习使用IDEA进行开发,好多都不会,本来想直接导入一个eclipse项目,但是出现了好多错误,一时不知道怎么修改,所以就从最基本的servlet开始着手,慢慢熟悉这个工具,下面是使用IDEA ...
- 一个servlet处理多个请求(使用Method的反射机制)
方法一 可以通过在请求的时候加上参数,然后在servlet中获取请求的参数,再去调用对应的方法.达到一个servlet处理多个请求的目的 test.jsp: <%@ page language= ...
- 如何用一个servlet处理多个请求
一个servlet处理多个请求,原理:利用反射机制获取在selvlet类中的其他方法1.前端页面<%@ page language="java" contentType=&q ...
随机推荐
- IDEA中看Flink 1.9源码时报Sources not found for: org.apache.flink:flink-shaded-hadoop-2:2.4.1-7.0
1.场景 在阅读Flink 1.9源码时,个别类如YarnClientImpl.java只能查看.class文件,想查看对应的.java source文件,点击Download source时,报So ...
- 解决zabbix_web显示中文乱码问题
zabbix图形中文显示设置 如果想将zabbix的界面改成中文,点击类似于管理员头像,可以直接修改 检测中---图形,却显示乱码,这个问题是由于zabbix的web端没有中文字库,我们最需要把中文字 ...
- 微博MySQL优化之路
数据库是所有架构中不可缺少的一环,一旦数据库出现性能问题,那对整个系统都回来带灾难性的后果.并且数据库一旦出现问题,由于数据库天生有状态(分主从)带数据(一般还不小),所以出问题之后的恢复时间一般不太 ...
- 大数据之路week07--day05 (Hive的搭建部署)
在之前博客中我有记录安装JDK和Hadoop和Mysql的过程,如果还没有安装,请先进行安装配置好,对应的随笔我也提供了百度云下载连接. 安装JDK: https://www.cnblogs.co ...
- vue input只允许输入数字
template: <input type="text" v-model="pageIndex" @keyup="inputChange&quo ...
- Oracle字符串中包含数字、特殊符号的排序
问题描述: 某小区,需要按照小区.楼栋.单元号.房间号进行排序,但是按照地址描述排序时,因为字符串中包含数字,所以造成了如下的结果, 1号楼之后应该是2号楼,但是查询结果却是10号楼 . 尝试解决 使 ...
- Chocolatey——windows下的包管理器
前言 windows 包管理器 | https://chocolatey.org/ 命令 文档 | https://chocolatey.org/docs 根据使用会补充命令
- 防止js全局变量污染方法总结-待续
javaScript 可以随意定义保存所有应用资源的全局变量.但全局变量可以削弱程序灵活性,增大了模块之间的耦合性.在多人协作时,如果定义过多的全局变量 有可能造成全局变量冲突,也就是全局变量污染问题 ...
- django后台管理
后台管理 1) 本地化 语言和时区的本地化. 修改settings.py文件. # LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'zh-hans' # TIME_ ...
- win10 安装python模块objgraph+PyCharm环境配置
1. 打开win10的命令行窗口 2.在命令行中输入python -m pip install objgraph,系统会自动帮忙安装 3.安装完成后,可以用命令python -m pip list查看 ...