java中利用反射編寫通用servlet
阿新 • • 發佈:2019-02-19
在使用者模組開發中,我們發現用傳統的開發方式開發,這樣會導致一個請求對應一個servlet:這樣會導致這個開發模組中的servlet過多,那能不能做一個處理?從而讓一個模組使用一個servlet呢?下面我們通過兩個案例來分析一下。
使用者模組功能:
註冊:http://localhost:8080/store/UserServlet?method=regist
登陸:http://localhost:8080/store/UserServlet?method=login
啟用:http://localhost:8080/store/UserServlet?method=active
查詢商品模組功能:(只列舉幾個方法來作為例子)
查詢所有的商品:http://localhost:8080/store/ProductServlet?method=findAll
查詢某個分類的商品:http://localhost:8080/store/ProductServlet?method=findById
傳統方式:
使用者程式碼UserServlet:
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class UserServlet extends HttpServlet{ public void service(HttpServletRequest req,HttpServletResponse resp){ // 接收引數(method後所跟的方法名稱) String methodName = request.getParameter(“method”); //根據方法名稱,執行相應的方法。 if(“regist”.equals(methodName)){ regist(req,resp); }else if(“login”.equals(methodName)){ login(req,resp); } } public void regist(HttpServletRequest req,HttpServletResponse resp){ //跳轉到相應的jsp頁面 return “/regist.jsp”; } public void login(HttpServletRequest req,HttpServletResponse resp){ //跳轉到相應的jsp頁面 return “/login.jsp”; } } </span>
查詢商品程式碼ProductServlet:
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class ProductServlet extends HttpServlet{ public void service(HttpServletRequest req,HttpServletResponse resp){ // 接收引數: String methodName = request.getParameter(“method”); //根據方法名稱,執行相應的方法。 if(“findAll”.equals(methodName)){ findAll(req,resp); }else if(“findById”.equals(methodName)){ findById(req,resp); } } //跳轉到相應的jsp頁面 public void findAll(HttpServletRequest req,HttpServletResponse resp){ } //跳轉到相應的jsp頁面 public void findById(HttpServletRequest req,HttpServletResponse resp){ } } </span>
通過上面的兩個servlet我們可以發現,兩個servlet之間有很多的相同的地方,那我們能不能抽取出一個相同的servlet從而簡化程式碼呢?在這裡我們可以通過反射來實現我們的目的。
下面我們還是通過一個案例來介紹:
通用servlet:BaseServlet
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class BaseServlet extends HttpServlet{
public void service(HttpServletRequest req,HttpServletResponse resp){
//獲得傳遞過來的方法名稱
String methodName = request.getParameter(“method”);
// 獲得Class,其中的this是指繼承BaseServlet類的子類
Class clazz = this.getClass();
//獲得方法物件
Method method = clazz.getMethod(methodName,HttpServletRequest.class,Ht,tpSerlvetResponse.class);
•//執行相應的方法
String path = (String)method.invoke(this,req,resp);
if(path != null){
req.getRequestDispatcher(path).forward(req,resp);
}
}
}
</span>
繼承了BaseServlet的UserServlet程式碼:
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class UserServlet extends BaseServlet {
public String regist(HttpServletRequest req,HttpServletResponse resp){
//跳轉到相應的jsp頁面
return “/login.jsp”;
}
public String login(HttpServletRequest req,HttpServletResponse resp){
//跳轉到相應的jsp頁面
return “/index.jsp”;
}
}
</span>
繼承了BaseServlet的ProductServlet程式碼:
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class ProductServlet extends BaseServlet{
public String findAll(HttpServletRequest req,HttpServletResponse resp){
}
public String findById(HttpServletRequest req,HttpServletResponse resp){
}
}
</span>
我們通過將兩個案例比較可以發現利用反射可以提高我們的程式碼利用率,同時可以更加方便的操作程式碼,但是反射也有它的不足,就是將程式碼複雜化了,從而降低了軟體的效能,所以對於反射我們要靈活的使用它。