【servlet】通用的servlet,通過引數指定對應的方法
阿新 • • 發佈:2019-02-11
在寫servlet的時候,每次處理請求都會寫一個servlet,那能不能把每個servlet的共性的程式碼部分抽取出來,讓一個模組只用一個servlet,一個模組
的請求只交個一個servlet來做,所以:
在請求中帶過來一個引數
就像:
登入:http://localhost:8080/xxx/UserServlet?method=login
註冊:http://localhost:8080/xxx/UserServlet?method=regist
通過傳遞不同的引數來使用同一個servlet來處理不同的請求
所以,試著寫一個通過獲取method後的不同的引數,來決定不同的方法
/** * 傳統方式解決不同引數呼叫不同的service層*/ public class TraditionServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //接收引數 String method = request.getParameter("method");if("regist".equals(method)) { //這是註冊的方法 //後面就呼叫註冊的service層 }else if("login".equals(method)) { //這裡就呼叫登入的service層 } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
但是這個程式碼的複用性太差了,每次還要判斷方法,於是在這段程式碼用反射來進行改進,增加這段程式碼的複用性
/** * 通用的SErvlet的編寫: */ public class BaseServlet extends HttpServlet{ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //設定編碼表 req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=UTF-8"); // 接收引數: String methodName = req.getParameter("method"); //如果method傳遞的引數為null或者為空字串,作出提示 if(methodName == null || "".equals(methodName)){ resp.getWriter().println("method引數為null!!!"); return; } // 獲得子類的Class物件: /** * this.class代表載入繼承了這個BaseServlet的class物件 * */ Class clazz = this.getClass(); // 獲得子類中的方法了: try { Method method = clazz.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class); // 使方法執行,並獲取子類return的字串 String path = (String)method.invoke(this, req,resp); //轉發 if(path != null){ req.getRequestDispatcher(path).forward(req, resp); } } catch (Exception e) { e.printStackTrace(); } } }