1. 程式人生 > 其它 >java反射應用之baseservlet的抽取

java反射應用之baseservlet的抽取

首先說下為什麼要抽取BaseServlet.java呢?

看圖可以知道每當前端頁面有一個請求時,後臺就需要建立一個Servlet類實現相關的邏輯,如果需求多了,就會有很多Servlet.java類。

而抽取BaseServlet目的就是為了減少Servlet類數量。

即現在只有兩個Servlet類了,而前端請求可以寫作方法在UserServlet中,只需要在前端請求中寫方法名即可反射。

如下圖,發現Servlet類確實減少了:

其中BaseServlet.java

// 不需要訪問到該servlet
// 如果不抽取BaseServlet,那麼所有請求都需要寫一個XXXServlet.java類
// 如:ActiveUserServlet.java、ExitServlet.java、FindUserServlet.java、LoginServlet.java、RegisterServlet.java
public class BaseServlet extends HttpServlet {
// 只需要實現service()方法,然後在該方法中分發請求
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 分發方法即分發activeUser、exit、findUser、login、register等方法
// 完成方法分發
// 1.獲取請求路徑
String uri = req.getRequestURI();// /demo/user/login
System.out.println("請求uri: "+uri);
// 2.獲取方法名稱
String methodName = uri.substring(uri.lastIndexOf('/') + 1);// login
System.out.println("方法名稱:"+methodName);
// 3.獲取方法物件Method,根據方法名稱反射方法物件
//獲取方法
try {
// getMethod(String methodName, Object... args); 傳入方法名稱和引數
Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);

//4.執行方法
method.invoke(this,req,resp);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
UserServlet.java

@WebServlet("/user/*")
public class UserServlet extends BaseServlet {
public void register(HttpServletRequest request, HttpServletResponse response) {
// 註冊邏輯
System.out.println("註冊邏輯");
}

public void activeUser(HttpServletRequest request, HttpServletResponse response) {
    // 啟用使用者邏輯
    System.out.println("啟用使用者邏輯");
}

public void exit(HttpServletRequest request, HttpServletResponse response) {
    // 退出登入邏輯
    System.out.println("退出登入邏輯");
}

public void findUser(HttpServletRequest request, HttpServletResponse response) {
    // 發現使用者邏輯
    System.out.println("發現使用者邏輯");
}

public void login(HttpServletRequest request, HttpServletResponse response) {
    // 登入邏輯
    System.out.println("登入邏輯");
}

}