【Servlet】利用反射原理實現專案中的Servlet結構優化、減少Servlet數量
阿新 • • 發佈:2019-02-10
在我們日常的JavaWeb專案開發過程中,充當Controller角色的Servlet需要對於客戶端的請求進行處理或者轉發,所以在實際的專案中,我們所遇到的Servlet的邏輯處理內容將會非常之多,於是乎有了本片文章,利用反射簡化Servlet的業務邏輯結構。實現過程如下:
需要實現的業務程式碼:(Servlet需要自己配置web.xml,本文已省略)
Servlet程式碼如下:
package cn.totalo.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletDemo01 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String md = request.getParameter("method"); if("addInfo".equals(md)) { System.out.println("增加學生"); } if("delInfo".equals(md)) { System.out.println("刪除學生"); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
由上可知,如果業務功能越來越多會導致if語句的增加,這是我們不想看到的,下面我們使用反射對於業務邏輯優化。程式碼如下:
package cn.totalo.servlet; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletDemo02 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String md = request.getParameter("method"); String path = null; Class clazz = this.getClass();//獲取帶當前類的位元組碼物件 try { //獲取請求的位元組碼檔案中對應的方法 Method mds = clazz.getMethod(md, HttpServletRequest.class,HttpServletResponse.class); if(null!=mds) { path = (String)mds.invoke(this, request,response); } if(null!=path) { request.getRequestDispatcher(path).forward(request, response); } } catch (Exception e) { e.printStackTrace(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } public String addInfo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.print("新增資訊"); return "/add.html"; } public String delInfo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.print("刪除資訊"); return "del.html"; } }
此方式還可以進一步優化,通過Servlet的生命週期,抽取一個父類的Servlet,讓後面的Servlet繼承此父類。然後後面的Servlet只需要謝業務邏輯即可。