1. 程式人生 > >多個請求使用一個Servlet!

多個請求使用一個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型別,也就是要跳轉到的目標地址。這個方法中就可以寫

針對這個請求的具體操作了。

 

快開啟編譯器試一試吧!