• 【优化servlet】


    优化的目的:

    减少Servlet的数量,现在是一个功能一个Servlet,将其优化为一个模块一个Servlet,相当于在数据库中一张表对应一个Servlet,在Servlet中提供不同的方法,完成用户的请求。

    注:Idea控制台中文乱码解决:-Dfile.encoding=gb2312

    开始优化:

    ①BaseServlet的编写:

    1. public class BaseServlet extends HttpServlet {
    2. @Override
    3. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. //System.out.println("baseServlet的service方法被执行了...");
    5. //完成方法分发
    6. //1.获取请求路径
    7. String uri = req.getRequestURI(); // /travel/user/add
    8. System.out.println("请求uri:"+uri);// /travel/user/add
    9. //2.获取方法名称
    10. String methodName = uri.substring(uri.lastIndexOf('/') + 1);
    11. System.out.println("方法名称:"+methodName);
    12. //3.获取方法对象Method
    13. //谁调用我?我代表谁
    14. System.out.println(this);//UserServlet的对象cn.itcast.travel.web.servlet.UserServlet@4903d97e
    15. try {
    16. //获取方法
    17. Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
    18. //4.执行方法
    19. //暴力反射
    20. //method.setAccessible(true);
    21. method.invoke(this,req,resp);
    22. } catch (NoSuchMethodException e) {
    23. e.printStackTrace();
    24. } catch (IllegalAccessException e) {
    25. e.printStackTrace();
    26. } catch (InvocationTargetException e) {
    27. e.printStackTrace();
    28. }
    29. }
    30. }

    ②:UserServlet改写:

    将之前的Servlet实现的功能,抽取到UserServlet中的不同方法中实现,并且将UserService创建抽取到成员变量位置

    1. @WebServlet("/user/*") // /user/add /user/find
    2. public class UserServlet extends BaseServlet {
    3. //声明UserService业务对象
    4. private UserService service = new UserServiceImpl();
    5. /**
    6. * 注册功能
    7. * @param request
    8. * @param response
    9. * @throws ServletException
    10. * @throws IOException
    11. */
    12. public void regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    13. //验证校验
    14. String check = request.getParameter("check");
    15. //从sesion中获取验证码
    16. HttpSession session = request.getSession();
    17. String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
    18. session.removeAttribute("CHECKCODE_SERVER");//为了保证验证码只能使用一次
    19. //比较
    20. if(checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)){
    21. //验证码错误
    22. ResultInfo info = new ResultInfo();
    23. //注册失败
    24. info.setFlag(false);
    25. info.setErrorMsg("验证码错误");
    26. //将info对象序列化为json
    27. ObjectMapper mapper = new ObjectMapper();
    28. String json = mapper.writeValueAsString(info);
    29. response.setContentType("application/json;charset=utf-8");
    30. response.getWriter().write(json);
    31. return;
    32. }
    33. //1.获取数据
    34. Map map = request.getParameterMap();
    35. //2.封装对象
    36. User user = new User();
    37. try {
    38. BeanUtils.populate(user,map);
    39. } catch (IllegalAccessException e) {
    40. e.printStackTrace();
    41. } catch (InvocationTargetException e) {
    42. e.printStackTrace();
    43. }
    44. //3.调用service完成注册
    45. //UserService service = new UserServiceImpl();
    46. boolean flag = service.regist(user);
    47. ResultInfo info = new ResultInfo();
    48. //4.响应结果
    49. if(flag){
    50. //注册成功
    51. info.setFlag(true);
    52. }else{
    53. //注册失败
    54. info.setFlag(false);
    55. info.setErrorMsg("注册失败!");
    56. }
    57. //将info对象序列化为json
    58. ObjectMapper mapper = new ObjectMapper();
    59. String json = mapper.writeValueAsString(info);
    60. //将json数据写回客户端
    61. //设置content-type
    62. response.setContentType("application/json;charset=utf-8");
    63. response.getWriter().write(json);
    64. }
    65. /**
    66. * 登录功能
    67. * @param request
    68. * @param response
    69. * @throws ServletException
    70. * @throws IOException
    71. */
    72. public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    73. //1.获取用户名和密码数据
    74. Map map = request.getParameterMap();
    75. //2.封装User对象
    76. User user = new User();
    77. try {
    78. BeanUtils.populate(user,map);
    79. } catch (IllegalAccessException e) {
    80. e.printStackTrace();
    81. } catch (InvocationTargetException e) {
    82. e.printStackTrace();
    83. }
    84. //3.调用Service查询
    85. // UserService service = new UserServiceImpl();
    86. User u = service.login(user);
    87. ResultInfo info = new ResultInfo();
    88. //4.判断用户对象是否为null
    89. if(u == null){
    90. //用户名密码或错误
    91. info.setFlag(false);
    92. info.setErrorMsg("用户名密码或错误");
    93. }
    94. //5.判断用户是否激活
    95. if(u != null && !"Y".equals(u.getStatus())){
    96. //用户尚未激活
    97. info.setFlag(false);
    98. info.setErrorMsg("您尚未激活,请激活");
    99. }
    100. //6.判断登录成功
    101. if(u != null && "Y".equals(u.getStatus())){
    102. request.getSession().setAttribute("user",u);//登录成功标记
    103. //登录成功
    104. info.setFlag(true);
    105. }
    106. //响应数据
    107. ObjectMapper mapper = new ObjectMapper();
    108. response.setContentType("application/json;charset=utf-8");
    109. mapper.writeValue(response.getOutputStream(),info);
    110. }
    111. /**
    112. * 查询单个对象
    113. * @param request
    114. * @param response
    115. * @throws ServletException
    116. * @throws IOException
    117. */
    118. public void findOne(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    119. //从session中获取登录用户
    120. Object user = request.getSession().getAttribute("user");
    121. //将user写回客户端
    122. ObjectMapper mapper = new ObjectMapper();
    123. response.setContentType("application/json;charset=utf-8");
    124. mapper.writeValue(response.getOutputStream(),user);
    125. }
    126. /**
    127. * 退出功能
    128. * @param request
    129. * @param response
    130. * @throws ServletException
    131. * @throws IOException
    132. */
    133. public void exit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    134. //1.销毁session
    135. request.getSession().invalidate();
    136. //2.跳转登录页面
    137. response.sendRedirect(request.getContextPath()+"/login.html");
    138. }
    139. /**
    140. * 激活功能
    141. * @param request
    142. * @param response
    143. * @throws ServletException
    144. * @throws IOException
    145. */
    146. public void active(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    147. //1.获取激活码
    148. String code = request.getParameter("code");
    149. if(code != null){
    150. //2.调用service完成激活
    151. //UserService service = new UserServiceImpl();
    152. boolean flag = service.active(code);
    153. //3.判断标记
    154. String msg = null;
    155. if(flag){
    156. //激活成功
    157. msg = "激活成功,请登录";
    158. }else{
    159. //激活失败
    160. msg = "激活失败,请联系管理员!";
    161. }
    162. response.setContentType("text/html;charset=utf-8");
    163. response.getWriter().write(msg);
    164. }
    165. }
    166. }

    ③页面路径的改写:

    register.html:

     login.html:

     

     header.html:

     

     UserServiceImpl发送邮件:

     

     

  • 相关阅读:
    flinksql kafka到mysql累计指标练习
    垃圾回收系统小程序定制开发搭建攻略
    阵列信号处理——线性约束最小方差准则(LCMV)波束形成算法
    HTC官方RUU固件提取刷机包rom.zip以及RUU解密教程
    WMS系统功能分析-入库
    TMI4054锂电池充电管理IC
    如何正确地配置Gradle版本
    自动驾驶入门小记(第一篇)
    设计模式浅析(六) ·命令模式
    c#--dataGridView的分页显示
  • 原文地址:https://blog.csdn.net/akisi/article/details/126577695