多个请求使用一个Servlet!

本文介绍了在JavaWeb开发中,如何通过反射机制和BaseServlet来高效处理多个请求。传统方式是每个请求对应一个Servlet,但这种方法浪费资源。通过在doPost/doGet中使用反射,可以根据参数调用不同方法,但仍然需要重复代码。为了解决这个问题,作者提出了BaseServlet的概念,所有自定义Servlet继承BaseServlet,并通过'method'参数调用相应方法,实现了代码的复用和简化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阅读本篇文章大约花费您4分钟!


在写JavaWeb的项目时,MVC模式是一个基本思想,不使用任何框架的情况下,当我们的功能模块变多以后,我们的请求也会变多,这些请求往servlet传送的时候,都会调用doPost()或者doGet()方法,但是一个servlet只有一个doPost()或者doGet(),处理这么多请求显然是忙不过来的。

我们应该如何解决这个问题?

一.一个请求写一个Servlet

面对上面的问题,最容易最简单的方法就是一个请求使用一个Servlet;

这样写的缺点也很明显,Servlet会非常多,用一次就没下次了,真的好浪费啊!

肯定是不会这么做的。

 

二.doPost/doGet中使用反射

如果你对Java的反射机制有一定的理解,你肯定能想到这个方法,在doPost/doGet方法中利用反射机制来调用不用的方法,这样要求JSP传递的参数的键应该是固定的,而值最好是调用的方法名,这样可以很容易的调用不同的方法。

实现这个功能也很简单,只需要写一段反射代码;但是这样还是有一个问题,我们在处理不同的功能模块时,会使用不同的servlet,比如项目中有两个不用的模块,我需要两个servlet,每个servlet里面都要写这样的反射代码块,代码还是不够简洁!

我之前介绍过HttpServlet是对servlet的两次封装后的结果,顺着这个思路,我们可以再对HttpServlet进一步封装,将反射代码块写在里面,然后自己创建的Servlet都统一继承这个再次封装的Servlet,这个再次封装的Servlet叫做BaseServlet。

三.使用BaseServlet

上面提到,BaseServlet是对HttpServlet的再次封装,话不多说,直接上代码:

public BaseServlet extends HttpServlet {
	
	protected void service(HttpServletRequest request,HttpServletResponse) 
				throws ServletException,IOException {
		String methodName=request.getParameter("method");
		try{
			Method method=this.getClass().getDeclaredMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
			String result=(String)method.invoke(this,request,response);
			if(result!=null){
				request.getRequestDispatcher(result).forward(request,response);
			}
		}catch(Exception e){
			e.printStackTrace();
		}				
	}
}

代码其实也不复杂,对反射有一点了解就可以理解,如果对反射不了解也没有关系,直接拷贝粘贴也可以直接使用,不过要保证请求要附带一个参数,参数的名字必须是method,参数值和具体调用的方法名一致。

在BaseServlet中,重写了service()方法,这样就不会调用doGet()/doPost()方法,而是会调用具体的自定义的方法;当然如果重写doPost()/doGet()方法也是可以的。

当有一个新请求时,只需要给这个请求携带一个method=xxx参数,然后在具体继承了BaseServlet的类中加一个方法:

public String xxx(HttpServletRequest request,HttpServletResponse response);

返回值是String类型,也就是要跳转到的目标地址。这个方法中就可以写

针对这个请求的具体操作了。

 

快打开编译器试一试吧!

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值