多个请求使用一个Servlet!

阅读本篇文章大约花费您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类型,也就是要跳转到的目标地址。这个方法中就可以写

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

快打开编译器试一试吧!

猜你喜欢

转载自blog.csdn.net/tianc_pig/article/details/85267206