一晕粪、為什么要一個(gè)Servlet處理多個(gè)請(qǐng)求
在實(shí)際應(yīng)用過程中,經(jīng)常遇到一次請(qǐng)求就要對(duì)應(yīng)一個(gè)servlet渐裸,比如做一個(gè)簡(jiǎn)單的登錄注冊(cè)巫湘,那么登錄對(duì)應(yīng)一個(gè)servlet,注冊(cè)也需要一個(gè)servlet昏鹃,登錄成功后尚氛,還需要添加,刪除洞渤,編輯等等阅嘶,對(duì)需要一個(gè)對(duì)應(yīng)的servlet,那么有沒有什么辦法载迄,可以把這些請(qǐng)求用一個(gè)servlet來處理讯柔,下面我們就來看看。
二护昧、原理介紹:
1魂迄、分析
- 我們一般使用的servlet是繼承了HttpServlet,里邊有兩個(gè)方法捏卓,一個(gè)doGet一個(gè)是doPost
- 服務(wù)器執(zhí)行時(shí)极祸,會(huì)調(diào)用里邊的service方法根據(jù)請(qǐng)求方式調(diào)這兩個(gè)方法,
2怠晴、具體實(shí)現(xiàn)思路
- 根據(jù)這個(gè)我們可以改下service方法,我們改寫了service方法遥金,實(shí)現(xiàn)獲取一個(gè)method的參數(shù),獲取到了
- 使用前面學(xué)過的反射蒜田,因?yàn)楹筮厡懙膕ervlet會(huì)繼承這個(gè)改寫后的servlet稿械,使用需要拿到的類就是當(dāng)前這個(gè)類,
- 拿到這個(gè)類后冲粤,獲取method參數(shù)的方法美莫,如果沒有就表示不存在這個(gè)方法,不能調(diào)用梯捕,存在的話厢呵,給兩個(gè)參數(shù),
- 一個(gè)HttpServletreRuest.class和HttpServletResonse.class調(diào)用使用當(dāng)前對(duì)象來調(diào)用傀顾,
- 然后寫一個(gè)servlet繼承自定義的這個(gè)servlet把你的請(qǐng)求業(yè)務(wù)寫成一個(gè)方法襟铭,
- 例如:
login(HttpServletreRuest req, HttpServletResonse res );
register(HttpServletreRuest req,HttpServletResonse res ); 等等 , - 最后每次請(qǐng)求,只要給請(qǐng)求的servlet帶一個(gè) method= login 或者 method=register的參數(shù)寒砖,就會(huì)自動(dòng)去調(diào)用對(duì)應(yīng)的方法赐劣,這樣就達(dá)到了,一個(gè)servlet處理多個(gè)請(qǐng)求
三哩都、示例代碼
- 封裝代碼
public class BaseServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("method");//獲取方法名 //其中method可以是可以任意取得魁兼,如getParameter("service")等 if(name == null || name.isEmpty()){ throw new RuntimeException("method parameter does not exist"); } Class c = this.getClass();//獲得當(dāng)前類的Class對(duì)象 Method method = null; try { //獲得Method對(duì)象 method = c.getMethod(name,HttpServletRequest.class,HttpServletResponse.class); } catch (Exception e) { } try { method.invoke(this, req,resp);//反射調(diào)用方法 } catch (Exception e) { throw new RuntimeException(e); } } }
- 繼承代碼
http://localhost:8080/app/account?method=login http://localhost:8080/app/account?method=register public class AccountServlet extends BaseServlet { public void login(HttpServletRequest request, HttpServletResponse response) { //登陸的方法 } public void register(HttpServletRequest request, HttpServletResponse response) { // 注冊(cè)的方法 } }
- web.xml 注冊(cè)
<!--賬號(hào)管理Servlet--> <servlet> <servlet-name>AccountServlet</servlet-name> <servlet-class>com.werner.demo.AccountServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AccountServlet</servlet-name> <url-pattern>/account</url-pattern> </servlet-mapping>