1. 程式人生 > >【servlet】通用的servlet,通過引數指定對應的方法

【servlet】通用的servlet,通過引數指定對應的方法

在寫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();
        }
    }
}