首页 > 其他分享 >一个Servlet类实现多个请求处理(Servlet优化)

一个Servlet类实现多个请求处理(Servlet优化)

时间:2022-11-05 11:56:23浏览次数:82  
标签:HttpServletRequest 请求 Servlet resp req HttpServletResponse returns 优化 String

参考:https://blog.csdn.net/weixin_44676935/article/details/106649260

一、优化Servlet类

思路说明:

对于刚接触Servlet来说,在我们在处理,jsp+servlet增删改查时,需要建立多个Servlet来处理,不同功能中的请求。

其实,我们只需要一个Servlet就可以处理多个请求,这只需要我们在jsp页面向servlet发送请求时候,并传递一个参数,这个参数值是用来标记此请求,进入BeanServlet类我们只需要对这个参数值进行判断,然后创建对应的处理请求的方法即可!

具体实现
JSP页面
`<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>

<%
// 把绝对路径封装成一个变量
String ctx = request.getContextPath();
pageContext.setAttribute("ctx", ctx);
%>

Insert title here 添加商品 删除商品 更新商品 ${returns} ` ###BeanServlet.java `package Test;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/beanServlet")
public class beanServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求标记
String action = req.getParameter("action");

		String returns = null;
		// 对比请求标记值
		if(action.equals("add")) {
			// 调用处理方法接受返回值
			returns = add(req, resp);
		}
		// 对比请求标记值
		if(action.equals("del")) {
			// 调用处理方法接受返回值
			returns = del(req, resp);
		}
		// 对比请求标记值
		if(action.equals("update")) {
			// 调用处理方法接受返回值
			returns = update(req, resp);
		}
		// 将返回用请求值返回页面
		req.setAttribute("returns",returns);
		//这个做一个判空
		if(returns!=null) {
			req.getRequestDispatcher("/bean.jsp").forward(req, resp);
		}
	}
//    请求处理	
public String add(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{    	
	return "添加成功!";
}
public String del(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{	
	return "删除成功!";	
}
public String update(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{
	return "更新成功!";
}

}
`
这样我们就实现了Servlet类的一个小小的优化,解决了需创建多个Servlet类的问题,但是这样还不是我们想要达到的目标,因为现在只有三个请求,当请求过多时,按照这种方法我们要写很多的if语句,这并不是我们理想的。

二、使用反射进行优化

思路说明:

提起反射就不得不提一下Java的类加载机制,什么是类加载机制,我在这就不阐述了,我找到了一个博主的详解,感兴趣的可以看一下。点击这里:Java类加载机制

使用反射进行优化,具体步骤就是,我们先要获取当前类的一个字节码文件,它返回的是这个类的字节码对象,然后运用getMethod()将从页面获取到的请求标志传入,并传入两个请求和响应类,

具体实现:

`package Test;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/beanServlet")
public class beanServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求标记
String action = req.getParameter("action");
try {
// 获取当前类的字节码文件
Class<? extends beanServlet> clazz = this.getClass();
/**
* clazz.getMethod();
* 查找当前类,有没有action值所对应的处理方法,它相当于:
* if(action.equals("add")){}
*/
Method method = clazz.getMethod(action,HttpServletRequest.class,HttpServletResponse.class);
// 判断是否为空!
if(method!=null) {
// method.invoke(this, req,resp);是去执行匹配的请求处理方法
String returns=(String) method.invoke(this, req,resp);
// 判空,传值,跳转
if(returns != null) {
req.setAttribute("returns", returns);
req.getRequestDispatcher("/bean.jsp").forward(req, resp);
}
}

		} catch (Exception e) {
			e.printStackTrace();
		}
//    请求处理  注意:使用反射优化,这里的方法必须是 public	公有的
public String add(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{    	
	return "添加成功!";
}
public String del(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{	
	return "删除成功!";	
}
public String update(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{
	return "更新成功!";
}

}
`

三、进一步优化

我们可以将反射的方法进行分发处理这个模块封装成一个BeanServlet类,然后让其他Servlet继承此类,就可以进一步优化了。

beanServlet

`public class BaseServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

 @Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 获取请求标记
		String action = req.getParameter("action");
		try {
			//  获取当前类的字节码文件	
			Class<? extends beanServlet> clazz = this.getClass(); 
			/** 
			 * clazz.getMethod();
			 * 查找当前类,有没有action值所对应的处理方法,它相当于:
			 * if(action.equals("add")){}
			 */
			Method method = clazz.getMethod(action,HttpServletRequest.class,HttpServletResponse.class);
		    // 判断是否为空!
			if(method!=null) {
				//  method.invoke(this, req,resp);是去执行匹配的请求处理方法
				String returns=(String) method.invoke(this, req,resp);
		        //  判空,传值,跳转
				if(returns != null) {
					req.setAttribute("returns", returns);
					req.getRequestDispatcher("/bean.jsp").forward(req, resp);
				}
			}
		
		} catch (Exception e) {
			e.printStackTrace();
		}

}

`

Servlet

public class Servlet extends BeanServlet { private static final long serialVersionUID = 1L; // 请求处理 注意:使用反射优化,这里的方法必须是 public 公有的 public String add(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{ return "添加成功!"; } public String del(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{ return "删除成功!"; } public String update(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{ return "更新成功!"; } }

标签:HttpServletRequest,请求,Servlet,resp,req,HttpServletResponse,returns,优化,String
From: https://www.cnblogs.com/lunalight/p/16859905.html

相关文章

  • Servlet
    Servlet1.web基本概念2.Tomcat3.HTTP协议4.Maven5.Servlet6.Cookie/Session7.JSP详解8.MVC三层架构9.Filter过滤器10.监听器11.原生Web应用开发......
  • Maven下web项目配置Servlet与Mybatis及注意事项
    在之前的学习过程中,我一直在使用Maven项目(因为相对比较方便),但是在配置时出现了各种问题,在此总结一下。先放一下配置好的项目结构1.用Maven配置web项目1>首先确保......
  • python模拟CSR证书请求
    CSR——pythonTTP处理证书创建证书签名请求(CSR):类似于填写签证信息将CSR发送给可信的第三方(TTP):这就像将你的信息发送到签证申请TTP办公室验证信息:不管怎样,TTP需要验证......
  • Ansible - 7 - 性能优化
    性能优化在默认设置的情况下,Ansible的执行效率已经可以满足大多数场景。面对巨量目标主机时,可以通过一些配置优化去再提高ansible的执行效率。基本设置#通过time命......
  • 【Android Gradle 插件】自定义 Gradle 插件优化图片 ③ ( 识别 png 图片中的 alpha
    文章目录​​一、识别png图片中的alpha通道信息​​​​1、png图片的文件头信息​​​​2、png图片的数据块​​​​3、png图片的IHDR类型数据块​​​​4、IHDR......
  • @webservlet
    这是我在学习servlet中遇到的问题,不是路径没有加“/”的问题,也不是web.xml版本太低的问题,可能就是tomcat设置的路径与查找路径的问题,最后解决的办法也比较笨。我把idea卸......
  • 基于GA优化的竞价博弈频谱分配算法的matlab仿真
    目录​​一、理论基础​​​​二、核心程序​​​​三、仿真测试结果​​作者ID:fpga和matlab擅长技术:1.无线基带,无线图传,编解码2.机器视觉,图像处理,三维重建3.人工智......
  • Visual Studio:优化了复制/移动省略
    蝎子为了能发文,标题中的复制/移动省略是Copy/MoveElision的硬翻译,请各位大大海涵。下文中我会同时使用这两种术语。VisualStudio中Copy/MoveElision的变化在Visual......
  • Redis Desktop Manager连不上服务器的redis; Java 死锁; 泛型; 事务; servlet; Spring事务;
    RedisDesktopManager连不上服务器的redis1、首先有没有设置密码,输入的密码是否正确2、那个IP是内网IP嘛?外网的要加SSH总结一下无论是连MySQL、MongoDB、还是redisip如果......
  • CS149笔记03并行程序性能优化
    Part1:WorkDistributionandScheduling为了高性能优化目标:在所有可执行资源上达到负载均衡降低communication,避免stalls减少额外的overhead负载均衡在assign1......