day54
servlet升級03
特點
當前設計又有一個問題,我們目前可以做到一個實體類用一個servlet,比如Student類的所有crud方法都可以在StudentServlet中的service方法中進行動態處理。假如又有User類,我們就要在UserServlet中設計service方法,在該service方法中再次進行動態方法的判斷處理
假如項目有幾百個實體類,可能對應幾百個Servlet,可能就要寫幾百個service方法的動態處理
通過分析,我們發現,可以將op的值特意設置為各個實體類的方 法名
使用反射動態獲取每一個servlet,通過發射得到每一個servlet后,動態獲取op的值,再來動態覺得調用各個op值所對應的方法
反射
“照妖鏡”,一個類中有四個訪問級別的成員,private只有自己能訪問,default自己和通過的類可以訪問,protected是自己,同包類和非同包子類可以訪問,public是當前項目所有類都可以訪問
反射可以在類的外部拿到任何訪問修飾基本的數據成員
反射功能強大,但是效率低
service方法的重構
使用反射來實現service方法的簡化
package com.saas.servlet; ? import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; ? public class BaseServlet extends HttpServlet { ?@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8"); ?String op = req.getParameter("op"); ?System.out.println(op); ?Class<? extends BaseServlet> clazz = getClass(); ?try {Method method = clazz.getDeclaredMethod(op, HttpServletRequest.class, HttpServletResponse.class); ?// 設置方法可以被訪問method.setAccessible(true); ?// 使用反射調用對應的方法method.invoke(this, req, resp);} catch (NoSuchMethodException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);}} }任何繼承自當前BaseServlet的servlet都會執行該BaseServlet的生命周期方法service方法
在service方法中,動態獲取用戶傳遞過來的op值
而該op值一定要設置為每個servlet中的方法名
運用反射得到op對應的方法對象,每個方法的參數列表都是HttpServletRequest和HttpServletResponse
得到每一個業務方法對象后,設置方法可以在外界被訪問
并調用invoke實現對于每個業務方法的調用
好處是當前項目只需要做一個op的判斷,無需再在每個servlet里面有關于op判斷的重復代碼
package com.saas.servlet; ? import com.saas.entity.User; import com.saas.service.IUserService; import com.saas.service.impl.UserServiceImpl; ? import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.List; ? @WebServlet("/User") public class UserServlet extends BaseServlet{ ?private IUserService userService = new UserServiceImpl(); ?public void login(HttpServletRequest req, HttpServletResponse resp){System.out.println("UserServlet login");}public void register(HttpServletRequest req, HttpServletResponse resp){System.out.println("UserServlet register");}public void logout(HttpServletRequest req, HttpServletResponse resp){System.out.println("UserServlet logout");} ?protected void saveUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{System.out.println("UserServlet saveUser");} ?protected void updateUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{System.out.println("UserServlet updateUser");} ?protected void deleteUser(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{System.out.println("UserServlet deleteUser");} ?protected void getUserByUid(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{System.out.println("UserServlet getUserByUid"); ?String suid = req.getParameter("uid");int uid = suid == null ? 0 : Integer.parseInt(suid); ?User u = userService.getUserByUid(uid); ?PrintWriter out = resp.getWriter(); ?out.print("<form>");out.print("<input type='hidden' name='uid' value='" + u.getUid() + "' />");out.print("<input type='text' name='username' value='" + u.getUsername() + "' />");out.print("<input type='text' name='password' value='" + u.getPassword() + "' />");out.print("<input type='text' name='email' value='" + u.getEmail() + "' />");out.print("<input type='text' name='phone' value='" + u.getPhone() + "' />");out.print("<input type='text' name='address' value='" + u.getAddress() + "' />");out.print("<input type='submit' value='update' />");out.print("</form>"); ?} ?protected void getAllUsers(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{System.out.println("UserServlet getAllUsers"); ?List<User> users = userService.getAllUsers(); ?PrintWriter out = resp.getWriter(); ?out.print("<table border=1 align='center' width='80%'>");out.print("<tr>");out.print("<th>uid</th>");out.print("<th>username</th>");out.print("<th>password</th>");out.print("<th>email</th>");out.print("<th>phone</th>");out.print("<th>address</th>");out.print("<th>manage</th>");out.print("</tr>");for (User user : users) {out.print("<tr>");out.print("<td>" + user.getUid() + "</td>");out.print("<td>" + user.getUsername() + "</td>");out.print("<td>" + user.getPassword() + "</td>");out.print("<td>" + user.getEmail() + "</td>");out.print("<td>" + user.getPhone() + "</td>");out.print("<td>" + user.getAddress() + "</td>");out.print("<td><a href='User?op=getUserByUid&uid=" + user.getUid() + "'>update</a></td>");out.print("</tr>");}out.print("</table>");} }package com.saas.servlet; ? import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; ? @WebServlet("/Student") public class StudentServlet extends BaseServlet { ?private static final long serialVersionUID = 1L; ?public void getAllStudents(HttpServletRequest req, HttpServletResponse resp) {System.out.println("StudentServlet getAllStudents");} ? ?public void getStudentBySid(HttpServletRequest req, HttpServletResponse resp) {System.out.println("StudentServlet getStudentBySid");} ? ?public void getStudentsByPage(HttpServletRequest req, HttpServletResponse resp) {System.out.println("StudentServlet getStudentsByPage");} ? ?public void saveStudent(HttpServletRequest req, HttpServletResponse resp) {System.out.println("StudentServlet saveStudent");} ? ?public void updateStudent(HttpServletRequest req, HttpServletResponse resp) {System.out.println("StudentServlet updateStudent");} ? ?public void deleteStudent(HttpServletRequest req, HttpServletResponse resp) {System.out.println("StudentServlet deleteStudent");} }在UserServlet和StudentServlet中都將不會出現op的判斷處理,只需要在BaseServlet中實現一次即可,代碼大大簡化
????????