JavaWeb26.1【综合案例:优化Servlet】
目的&分析
代码

1 package cn.haifei.travel.web.servlet; 2 3 import javax.servlet.ServletException; 4 import javax.servlet.annotation.WebServlet; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 import java.io.IOException; 9 import java.lang.reflect.InvocationTargetException; 10 import java.lang.reflect.Method; 11 12 /** 13 * 方法分发 14 */ 15 //@WebServlet("/BaseServlet") 16 public class BaseServlet extends HttpServlet { 17 18 @Override 19 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 20 // System.out.println("BaseServlet的service被执行了"); 21 22 //1 获取请求路径 23 String uri = req.getRequestURI(); 24 System.out.println("请求uri:" + uri); //请求uri:/travel/user/add 25 26 //2 获取方法名称 27 String methodName = uri.substring(uri.lastIndexOf('/') + 1); //+1:截取含头不含尾 28 System.out.println("方法名称:" + methodName); //方法名称:add 29 30 31 // System.out.println(this); //this:谁调用我,我代表谁 cn.haifei.travel.web.servlet.UserServlet@15b5e29d 32 try { 33 /* 34 getMethod():返回单个公共成员方法对象 35 getDeclaredMethod():返回单个成员方法对象,忽略访问权限修饰符 36 因为UserServlet中的add()、find()等方法是根据doPost、doGet改造来的,原先是protected修饰的,所以要用getDeclaredXxx 37 */ 38 /*//3 利用反射获取方法对象Method 39 Method method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); 40 //4 执行方法 41 method.setAccessible(true); //暴力反射 <-- 执行非公共的方法 42 method.invoke(this, req, resp);*/ 43 44 //最好的解决方法:将UserServlet中的add()、find()等方法改为public修饰 45 Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); 46 method.invoke(this, req, resp); 47 } catch (NoSuchMethodException e) { 48 e.printStackTrace(); 49 } catch (IllegalAccessException e) { 50 e.printStackTrace(); 51 } catch (InvocationTargetException e) { 52 e.printStackTrace(); 53 } 54 } 55 56 }

1 package cn.haifei.travel.web.servlet; 2 3 import cn.haifei.travel.domain.ResultInfo; 4 import cn.haifei.travel.domain.User; 5 import cn.haifei.travel.service.UserService; 6 import cn.haifei.travel.service.impl.UserServiceImpl; 7 import com.fasterxml.jackson.databind.ObjectMapper; 8 import org.apache.commons.beanutils.BeanUtils; 9 10 import javax.servlet.ServletException; 11 import javax.servlet.annotation.WebServlet; 12 import javax.servlet.http.HttpServlet; 13 import javax.servlet.http.HttpServletRequest; 14 import javax.servlet.http.HttpServletResponse; 15 import javax.servlet.http.HttpSession; 16 import java.io.IOException; 17 import java.lang.reflect.InvocationTargetException; 18 import java.util.Map; 19 20 @WebServlet("/user/*") // /user/add /user/find 21 public class UserServlet extends BaseServlet { 22 /*public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 23 System.out.println("UserServlet-add"); 24 } 25 public void find(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 26 System.out.println("UserServlet-find"); 27 }*/ 28 29 //声明UserService业务对象(抽取公共) 30 private UserService service = new UserServiceImpl(); 31 32 /** 33 * RegistUserServlet 34 * @param request 35 * @param response 36 * @throws ServletException 37 * @throws IOException 38 */ 39 public void regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 40 //验证校验码 41 String checkcode_userinput = request.getParameter("check"); //用户提交的验证码 42 HttpSession session = request.getSession(); 43 String checkcode_server = (String)session.getAttribute("CHECKCODE_SERVER");//服务器产生的验证码 44 session.removeAttribute("CHECKCODE_SERVER"); //保证后台产生得验证码一次性使用 45 if (checkcode_server==null || !checkcode_server.equalsIgnoreCase(checkcode_userinput)){ 46 //用户输入验证码错误 47 ResultInfo info = new ResultInfo(); 48 info.setFlag(false); 49 info.setErrorMsg("验证码错误!"); 50 ObjectMapper mapper = new ObjectMapper(); 51 String json = mapper.writeValueAsString(info); 52 response.setContentType("application/json;charset=utf-8"); 53 //因为json结果是字符串,所以此处用字节流或者字符流都行 54 //response.getOutputStream().write(json.getBytes()); //字节流 55 response.getWriter().write(json); //字符流 56 return; 57 }//用户输入验证码正确执行以下 58 59 60 //1 获取数据 61 Map<String, String[]> map = request.getParameterMap(); 62 63 //2 封装对象 64 User user = new User(); 65 try { 66 BeanUtils.populate(user, map); 67 } catch (IllegalAccessException e) { 68 e.printStackTrace(); 69 } catch (InvocationTargetException e) { 70 e.printStackTrace(); 71 } 72 73 //3 调用service完成注册 74 // UserService service = new UserServiceImpl(); 75 boolean flag = service.regist(user); 76 77 //4 响应结果 78 ResultInfo info = new ResultInfo(); 79 if (flag){ 80 //注册成功 81 info.setFlag(true); 82 }else { 83 //注册失败 84 info.setFlag(false); 85 info.setErrorMsg("注册失败!"); 86 } 87 88 //5 将对象info序列化为json 89 ObjectMapper mapper = new ObjectMapper(); //利用jackson 90 String json = mapper.writeValueAsString(info); 91 92 //6 将json结果写回到客户端 93 response.setContentType("application/json;charset=utf-8"); 94 response.getWriter().write(json); 95 } 96 97 98 /** 99 * LoginServlet 100 * @param request 101 * @param response 102 * @throws ServletException 103 * @throws IOException 104 */ 105 public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 106 //验证校验码 107 String checkcode_userinput = request.getParameter("check"); //用户提交的验证码 108 HttpSession session = request.getSession(); 109 String checkcode_server = (String)session.getAttribute("CHECKCODE_SERVER");//服务器产生的验证码 110 session.removeAttribute("CHECKCODE_SERVER"); //保证后台产生得验证码一次性使用 111 if (checkcode_server==null || !checkcode_server.equalsIgnoreCase(checkcode_userinput)){ 112 //用户输入验证码错误 113 ResultInfo info = new ResultInfo(); 114 info.setFlag(false); 115 info.setErrorMsg("验证码错误!"); 116 ObjectMapper mapper = new ObjectMapper(); 117 String json = mapper.writeValueAsString(info); 118 response.setContentType("application/json;charset=utf-8"); 119 response.getWriter().write(json); 120 return; 121 }//用户输入验证码正确执行以下 122 123 124 //1 获取用户名和密码 125 Map<String, String[]> map = request.getParameterMap(); 126 127 //2 利用BeanUtils工具类封装User对象(此处仅含用户名和密码两个值) 128 User user = new User(); 129 try { 130 BeanUtils.populate(user, map); 131 } catch (IllegalAccessException e) { 132 e.printStackTrace(); 133 } catch (InvocationTargetException e) { 134 e.printStackTrace(); 135 } 136 137 //3 调用service查询 138 // UserService service = new UserServiceImpl(); 139 User u = service.login(user); 140 141 ResultInfo info = new ResultInfo(); 142 //4 判断用户是否为null 143 if (u == null){ 144 info.setFlag(false); 145 info.setErrorMsg("用户名或密码错误"); 146 } 147 //5 判断用户是否已激活账号 148 if (u!=null && !"Y".equals(u.getStatus())){ 149 info.setFlag(false); 150 info.setErrorMsg("您的账号尚未激活,请查收邮件进行激活"); 151 } 152 //6 判断是否登录成功 153 if (u!=null && "Y".equals(u.getStatus())){ 154 info.setFlag(true); 155 request.getSession().setAttribute("user", u); //登录成功标记 156 } 157 158 //7 响应数据 159 ObjectMapper mapper = new ObjectMapper(); //jackson 160 response.setContentType("application/json;charset=utf-8"); 161 mapper.writeValue(response.getOutputStream(), info); //字节流 162 } 163 164 165 /** 166 * FindUserServlet 167 * @param request 168 * @param response 169 * @throws ServletException 170 * @throws IOException 171 */ 172 public void findOne(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 173 //从session中获取登录用户 174 Object user = request.getSession().getAttribute("user"); 175 //将user写回客户端 176 ObjectMapper mapper = new ObjectMapper(); 177 response.setContentType("application/json;charset=utf-8"); 178 mapper.writeValue(response.getOutputStream(), user); 179 } 180 181 182 /** 183 * ExitServlet 184 * @param request 185 * @param response 186 * @throws ServletException 187 * @throws IOException 188 */ 189 public void exit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 190 //1.销毁session 191 request.getSession().invalidate(); 192 //2.跳转登录页面 193 response.sendRedirect(request.getContextPath()+"/login.html"); //response-redirect重定向时要加虚拟目录 194 } 195 196 197 /** 198 * ActiveUserServlet 199 * @param request 200 * @param response 201 * @throws ServletException 202 * @throws IOException 203 */ 204 public void avtive(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 205 //获取激活码 206 String code = request.getParameter("code"); 207 if (code != null){ 208 //调用service完成激活 209 // UserService service = new UserServiceImpl(); 210 boolean flag = service.active(code); 211 212 //判断标记 213 String msg = null; 214 if (flag){ 215 msg = "激活成功,请<a href='login.html'>登录</a>"; 216 }else { 217 msg = "激活失败,请联系管理员"; 218 } 219 220 response.setContentType("text/html;charset=utf-8"); 221 response.getWriter().write(msg); 222 } 223 } 224 225 226 }
改写相关路径
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!