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 }
View Code
复制代码
复制代码
  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 }
View Code
复制代码

改写相关路径

 

 

 

 

 

 

 

 

 

posted @   yub4by  阅读(54)  评论(0编辑  收藏  举报
编辑推荐:
· 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 让容器管理更轻松!
点击右上角即可分享
微信分享提示