JavaWebServlet的优化方式
新手小白用Servlet做项目的时候会因为Servlet文件太多而导致罗辑混乱,所以我们需要优化代码,这里主要使用了反射的一个寻找类里面的方法的概念去做代码的优化。
首先我们看看我们的Servlet类,这个类把一些servlet的功能合并在一起了。
1 package com.jgs.web.setlvet; 2 3 import com.jgs.excption.UserException; 4 import com.jgs.model.User; 5 import com.jgs.service.UserService; 6 import com.jgs.service.impl.UserServiceImpl; 7 import org.apache.commons.beanutils.BeanUtils; 8 9 import javax.servlet.ServletException; 10 import javax.servlet.annotation.WebServlet; 11 import javax.servlet.http.Cookie; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletResponse; 14 import java.io.IOException; 15 import java.util.Date; 16 import java.util.UUID; 17 18 19 /** 20 * 继承BassServlet这个类,这样做只需要一个Userservlet就可以把操作用户的方法全部放在这个类里面 21 */
23 @WebServlet("/user")
22 public class UserServlet extends BassServlet{
24 //用户登入方法 25 public void login(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 26 String username=request.getParameter("username"); 27 String password=request.getParameter("password"); 28 String remember=request.getParameter("remember"); 29 String autoLogin=request.getParameter("autoLogin"); 30 UserService us=new UserServiceImpl(); 31 try { 32 User user= us.login(username,password); 33 String path="/index.jsp"; 34 if(user.getRole().equals("管理员")){ 35 path="/admin/products/list.jsp"; 36 } 37 if("true".equals(remember)) { 38 Cookie ck1=new Cookie("username",username); 39 Cookie ck2=new Cookie("password",password); 40 ck1.setMaxAge(60*60*365); 41 ck2.setMaxAge(60*60*365); 42 response.addCookie(ck1); 43 response.addCookie(ck2); 44 }else{ 45 Cookie[] cookies=request.getCookies(); 46 if(cookies != null){ 47 for (Cookie c: cookies){ 48 c.setMaxAge(0); 49 response.addCookie(c); 50 } 51 } 52 } 53 request.getSession().setAttribute("user",user); 54 response.sendRedirect(request.getContextPath()+path); 55 } catch (UserException e) { 56 e.printStackTrace(); 57 request.setAttribute("login_err",e.getMessage()); 58 request.getRequestDispatcher("login.jsp").forward(request,response); 59 } 60 } 61 62 /** 63 * 用户注册的方法 64 * @param request 65 * @param response 66 * @throws IOException 67 * @throws ServletException 68 */ 69 public void register(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 70 User user = new User(); 71 72 String validataCode=request.getParameter("validataCode"); 73 System.out.println(validataCode); 74 String sessionCode= (String) request.getSession().getAttribute("checkcode_session"); 75 System.out.println(sessionCode); 76 if(!validataCode.equals(sessionCode)){ 77 request.setAttribute("code_err", "验证码不正确"); 78 request.getRequestDispatcher("register.jsp").forward(request, response); 79 return; 80 } 81 try { 82 BeanUtils.populate(user, request.getParameterMap()); 83 user.setActiveCode(UUID.randomUUID().toString()); 84 user.setRole("普通用户"); 85 user.setRegisterTime(new Date()); 86 System.out.println(user); 87 //注册用户 88 UserService us = new UserServiceImpl(); 89 us.registerUser(user); 90 request.getRequestDispatcher("registersuccess.jsp").forward(request, response); 91 } catch (UserException e) { 92 e.printStackTrace(); 93 request.setAttribute("user_err", e.getMessage()); 94 request.getRequestDispatcher("register.jsp").forward(request, response); 95 } catch (Exception e) { 96 System.out.println("参数转模型失败"); 97 e.printStackTrace(); 98 99 } 100 101 } 102 103 /** 104 * 退出登入 105 * @param request 106 * @param response 107 * @throws IOException 108 */ 109 public void exit(HttpServletRequest request, HttpServletResponse response) throws IOException { 110 request.getSession().removeAttribute("user"); 111 response.sendRedirect(request.getContextPath()+"/index.jsp"); 112 } 113 114 //显示用户信息 115 public void myCount(HttpServletRequest request, HttpServletResponse response) throws IOException { 116 User user= (User) request.getSession().getAttribute("user"); 117 if(user != null){ 118 response.sendRedirect(request.getContextPath()+"/myAccount.jsp"); 119 }else{ 120 response.sendRedirect(request.getContextPath()+"/login.jsp"); 121 } 122 } 123 }
这个UserServlet类继承的父类是我们自己写的,其中用到了反射的方法去调用这个类里面的方法。
1 1 package com.jgs.web.setlvet; 2 2 3 3 import javax.servlet.ServletException; 4 4 import javax.servlet.http.HttpServlet; 5 5 import javax.servlet.http.HttpServletRequest; 6 6 import javax.servlet.http.HttpServletResponse; 7 7 import java.io.IOException; 8 8 import java.lang.reflect.InvocationTargetException; 9 9 import java.lang.reflect.Method; 10 10 11 11 public class BassServlet extends HttpServlet { 12 12 @Override 13 13 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 14 14 //接受从浏览器传过来的数据,用来判断应该调用什么方法 15 15 String action=request.getParameter("action"); 16 16 //获取当前类的Class.因为后面有子类去继承这个父类,所以获取到的是子类的Class对象 17 17 Class clz=this.getClass(); 18 18 try { 19 19 //用反射去找到我们要调用的方法,通过action和后面的两个属性去找到我们要调用的方法 20 20 Method method=clz.getMethod(action,HttpServletRequest.class,HttpServletResponse.class); 21 21 //找到方法以后用反射调用方法 22 22 method.invoke(this,request,response); 23 23 } catch (NoSuchMethodException e) { 24 24 e.printStackTrace(); 25 25 } catch (IllegalAccessException e) { 26 26 e.printStackTrace(); 27 27 } catch (InvocationTargetException e) { 28 28 e.printStackTrace(); 29 29 } 30 30 31 31 } 32 32 }
上面这段啊代码就是我们UserServlet类继承的一个父类的写法,
我们先来讲讲这个优化方法的一个思路
1、首先我们JSP依然要去访问我们的UserSerlvet,所以我们要给UserServlet这个类加上一个@WebServlet注解,如下图

2、然后是JSP文件里面的跳转连接也需要指定格式,因为我们是根据action(可以用其他单词替代)来判断的,所以我们的跳转格式为user?action=xx方法,如下图

3、我们就要把同一个模块的代码全部放进这个模块,


4、这个模块要继承父类,
5、优化完成
浙公网安备 33010602011771号