利用 JSP 中的反射機制封裝一個 Servlet ,就不用每張表的每個方法都寫一個 Servlet
阿新 • • 發佈:2019-02-06
基類 Servlet 程式碼如下:
使用者表的Servlet程式碼如下(可以直接實現本表需要的各個操作,繼承自基類(實現了反射機制以及亂碼處理)):package com.yibin.cn.servlet; import java.awt.print.Printable; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class BaseServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // post中文亂碼處理 request.setCharacterEncoding("utf-8"); // 響應到客戶端的亂碼處理 response.setCharacterEncoding("utf-8"); // 響應到客戶端的頭部亂碼處理 response.setContentType("text/html;charset=UTF-8"); //獲取動作引數 String action = request.getParameter("action"); System.out.println(action); if(action==null||"".equals(action.trim())){//引數為空或空字串. response.getWriter().print("你提交的是非法引數"); return; } //反射機制:反射可以做未來不確定的事情。用反射機制得到該物件的方法物件。 Method method; try { //獲取本類方法,傳遞引數:動作、引數型別。 method = this.getClass().getMethod(action, HttpServletRequest.class,HttpServletResponse.class); //通過method方法物件呼叫方法 //User user = new User(); //user.getName(); method.invoke(this, request,response);//this呼叫method,傳遞引數request和response。 } catch (Exception e) { System.out.println("你提交的是非法引數"); e.printStackTrace(); } } }
package com.yibin.cn.servlet; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.websocket.Session; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import utils.Page; import com.yibin.cn.dao.entity.User; import com.yibin.cn.service.IUserService; import com.yibin.cn.service.impl.UserServiceImpl; public class UserServlet extends BaseServlet { // 登入 public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("login方法被呼叫"); // 1、獲取資料 // 2、封裝資料 // 3、呼叫API // 4、控制跳轉 } // 增 public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("add方法被呼叫"); // 獲取資料
// 2、封裝資料
// 3、呼叫API
// 4、控制跳轉
}// 刪public void delete(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("delete方法被呼叫"); // 獲取資料
// 2、封裝資料
// 3、呼叫API
// 4、控制跳轉
}// 改public void update(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("update方法被呼叫");// 獲取資料
// 2、封裝資料
// 3、呼叫API
// 4、控制跳轉
}// 查public void listAll(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("listAll方法被呼叫");
// 獲取資料
// 2、封裝資料
// 3、呼叫API
// 4、控制跳轉
}// 分頁public void getPage(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("getPage方法被呼叫"); // 獲取資料
// 2、封裝資料
// 3、呼叫API
// 4、控制跳轉
}}
如上,原來一個方法需要寫一個 servlet,現在都封裝到一個表名命名的servlet了,既方便,結構又清晰,呼叫如下所示:
request.getRequestDispatcher("UserServlet?action=delete").forward(request, response);
通過跳轉到指定方法來呼叫,主要要傳遞動作引數 "action" ,然後 BaseServlet 利用反射機制就會幫你呼叫對應的方法,是不是很方便呢。
對了,servlet還需要配置,在工程目錄:工程名/WebContent/WEB-INF/web.xml 加上以下程式碼:
<!-- 基類Servlet -->
<servlet>
<servlet-name>BaseServlet</servlet-name>
<servlet-class>com.yibin.cn.servlet.BaseServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BaseServlet</servlet-name>
<url-pattern>/BaseServlet</url-pattern>
</servlet-mapping>
<!-- 通用UserServlet -->
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.yibin.cn.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/UserServlet</url-pattern>
</servlet-mapping>
至此大功告成!