• 某马旅游网站开发(对servlet的优化)


    优化目的

    • 减少web层文件
    • 层次分明
    • 便于维护

    优化后web层目录结构

    目录

     0.基类的编写

     0.0

    0.0.0基类代码

    1.userServlet类编写

    1.0分析方法内容

    1.0.0编写框架

    1.0.1代码实现

    1.0.2整理web层文件

    1.1分析路由

    1.1.0server层UserServiceImpl.java文件 

    1.1.1前端header.html

    1.1.2前端login.html

    1.1.3regist.html


     0.基类的编写

    所有的servlet类都将继承BaseServlet,而不是HttpServlet,BaseServlet重写HttpServlet的Servlet方法

     0.0

    0.0.0基类代码

    1. package com.haohao.travel.web.servlet;
    2. import com.fasterxml.jackson.databind.ObjectMapper;
    3. import com.haohao.travel.domain.User;
    4. import javax.servlet.ServletException;
    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. public class BaseServlet extends HttpServlet {
    12. @Override
    13. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    14. // 请求路径
    15. String requestURI = req.getRequestURI();
    16. // 请求方法获取
    17. String methodName = requestURI.substring(requestURI.lastindexOf("/")+1);
    18. // 分发任务
    19. try{
    20. Method method = this.getClass().getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
    21. // 暴力反射
    22. method.setAccessible(true);
    23. method.invoke(this,req,resp);
    24. } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
    25. e.printStackTrace();
    26. }
    27. }
    28. /**
    29. *
    30. * 公用方法,向resp返会对象obj的json数据
    31. * @param obj
    32. * @param resp
    33. * @throws IOException
    34. */
    35. public void writeValue(Object obj, HttpServletResponse resp) throws IOException {
    36. ObjectMapper mapper = new ObjectMapper();
    37. // 设置响应头为json格式
    38. resp.setContentType("application/json;charset=utf-8");
    39. mapper.writeValue(resp.getOutputStream(),obj);
    40. }
    41. }

    1.userServlet类编写

    1.0分析方法内容

    • 用户注册
    • 用户激活
    • 获取用户名
    • 用户登录
    • 用户退出

    1.0.0编写框架

    1.0.1代码实现

     大部分的代码与之前的web层代码一致,使用公共方法局部进行优化

    1. package com.haohao.travel.web.servlet;
    2. import com.fasterxml.jackson.databind.ObjectMapper;
    3. import com.haohao.travel.domain.ResultInfo;
    4. import com.haohao.travel.domain.User;
    5. import com.haohao.travel.service.UserService;
    6. import com.haohao.travel.service.impl.UserServiceImpl;
    7. import org.apache.commons.beanutils.BeanUtils;
    8. import javax.servlet.annotation.WebServlet;
    9. import javax.servlet.http.HttpServletRequest;
    10. import javax.servlet.http.HttpServletResponse;
    11. import javax.servlet.http.HttpSession;
    12. import java.io.IOException;
    13. import java.lang.reflect.InvocationTargetException;
    14. import java.util.Map;
    15. @WebServlet("/user/*") //
    16. public class UserServlet extends BaseServlet{
    17. // 创建对应的服务层对象
    18. private UserService service = new UserServiceImpl();
    19. //用户注册
    20. public void regist(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    21. // 图片验证码效验
    22. String check = req.getParameter("check");
    23. HttpSession session = req.getSession();
    24. String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
    25. // 图片验证码用过一次即失效
    26. session.removeAttribute("CHECKCODE_SERVER");
    27. if (checkcode_server==null||!checkcode_server.equals(check)){
    28. // 图片验证码校验失败
    29. // 结果信息对象,存储需要返回给前端的数据
    30. ResultInfo info = new ResultInfo(false,"验证码错误");
    31. // 将信息结果对象转换为json格式
    32. ObjectMapper mapper = new ObjectMapper();
    33. String json = mapper.writeValueAsString(info);
    34. // 设置响应头为json格式
    35. resp.setContentType("application/json;charset=utf-8");
    36. resp.getWriter().write(json);
    37. return;
    38. }
    39. // 图形验证码校验成功,获取请求中的user信息,封装为user对象
    40. Map<String,String[]> map = req.getParameterMap();
    41. User user = new User();
    42. try{
    43. BeanUtils.populate(user,map);
    44. } catch (InvocationTargetException | IllegalAccessException e) {
    45. e.printStackTrace();
    46. }
    47. // 调用UserService中的注册进行注册
    48. UserService userService = new UserServiceImpl();
    49. boolean flag = userService.regist(user);
    50. ResultInfo info = null;
    51. if (flag){
    52. // 注册成功
    53. info = new ResultInfo(true);
    54. }else {
    55. info = new ResultInfo(false,"注册失败");
    56. }
    57. writeValue(info,resp);
    58. }
    59. //用户激活
    60. public void active(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    61. String msg ="激活失败,请检查激活码是否有效";
    62. String code = req.getParameter("code");
    63. if (code!=null){
    64. UserService userService = new UserServiceImpl();
    65. boolean flag = userService.active(code);
    66. if (flag){
    67. // 激活成功
    68. msg = "激活成功,请<a href='login.html'>登录</a>!";
    69. }
    70. }
    71. resp.setContentType("text/html;charset=utf-8");
    72. resp.getWriter().write(msg);
    73. }
    74. //获取用户名
    75. public void FindOne(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    76. User user = null;
    77. try{
    78. user= (User) req.getSession().getAttribute("user");
    79. }catch (Exception e){
    80. }
    81. ResultInfo info=new ResultInfo();
    82. if(user!=null){
    83. // 登陆过的
    84. info.setFlag(true);
    85. info.setData(user.getUsername());
    86. }else {
    87. info.setFlag(false);
    88. }
    89. writeValue(info,resp);
    90. }
    91. //用户登录
    92. public void login(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    93. // 图片验证码效验
    94. String check = req.getParameter("check");
    95. HttpSession session = req.getSession();
    96. String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
    97. // 图片验证码用过一次即失效
    98. session.removeAttribute("CHECKCODE_SERVER");
    99. if (checkcode_server==null||!checkcode_server.equals(check)){
    100. // 图片验证码校验失败
    101. // 结果信息对象,存储需要返回给前端的数据
    102. ResultInfo info = new ResultInfo(false,"验证码错误");
    103. // 将信息结果对象转换为json格式
    104. ObjectMapper mapper = new ObjectMapper();
    105. String json = mapper.writeValueAsString(info);
    106. // 设置响应头为json格式
    107. resp.setContentType("application/json;charset=utf-8");
    108. resp.getWriter().write(json);
    109. return;
    110. }
    111. // 图形验证码校验成功,获取请求中的user信息,封装为user对象
    112. Map<String,String[]> map = req.getParameterMap();
    113. User user = new User();
    114. try{
    115. BeanUtils.populate(user,map);
    116. } catch (InvocationTargetException | IllegalAccessException e) {
    117. e.printStackTrace();
    118. }
    119. // 调用UserService中的登录进行登录
    120. UserService userService = new UserServiceImpl();
    121. // 登陆后的user对象,为null则登陆失败
    122. user = userService.login(user);
    123. ResultInfo info = new ResultInfo();
    124. if (user==null){
    125. // 登陆失败
    126. info.setFlag(false);
    127. info.setErrorMsg("用户名或密码不正确");
    128. }else if(user.getStatus().equals("N")){
    129. // 用户未激活
    130. info.setFlag(false);
    131. info.setErrorMsg("请前往注册邮箱进行激活");
    132. }else {
    133. // 成功登录,状态保持
    134. req.getSession().setAttribute("user",user);
    135. info.setFlag(true);
    136. }
    137. writeValue(info,resp);
    138. }
    139. //用户退出
    140. public void exit(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    141. // 销毁登陆数据
    142. req.getSession().invalidate();
    143. // 跳转登陆界面
    144. resp.sendRedirect(req.getContextPath()+"/login.html");
    145. }
    146. }

    1.0.2整理web层文件

    这里我直接把文件删掉了,大家还可以使用git存储库工具进行版本控制

    1.1分析路由

    后端的访问路由已经更改,那么前端访问的url路由也是需要更改一下的的

    1.1.0server层UserServiceImpl.java文件 

    1. // 发送激活邮件
    2. String text = "<a href='http://localhost/travel/user/active?code="+user.getCode()+"'>点击此链接激活账号</a>";

    1.1.1前端header.html

    1. // 获取登陆用户名
    2. $(function () {
    3. $.get("user/FindOne",{},function (data) {
    4. //{uid:1,name:'李四'}
    5. if(data.flag){
    6. // 已登陆
    7. var msg = "欢迎回来,"+data.data;
    8. $("#span_username").html(msg);
    9. $(".login_out").hide()
    10. $(".login").show()
    11. }else {
    12. // 未登录
    13. $(".login").hide()
    14. $(".login_out").show()
    15. }
    16. });
    17. });

    1.1.2前端login.html

    1. $(function () {
    2. $("#btn_sub").bind("click",function () {
    3. $.post("user/login",$("#loginForm").serialize(),function (data) {
    4. if (data.flag){
    5. // 登陆成功,跳转到首页
    6. location.href="index.html"
    7. }else {
    8. // 登陆失败
    9. $("#errorMsg").html(data.errorMsg);
    10. }
    11. });
    12. });
    13. });

    1.1.3regist.html

    1. $(function () {
    2. $("#registerForm").submit(function () {
    3. if(checkAll()){
    4. // 表单项全部验证通过
    5. $.post("user/regist",$(this).serialize(),function (data) {
    6. if(data.flag){
    7. location.href="register_ok.html";
    8. }else {
    9. $("#checkCode").src="checkCode?"+new Date().getTime();
    10. $("#errorMsg").html(data.errorMsg);
    11. }
    12. });
    13. }
    14. // 表单项验证失败,拦截提交请求
    15. return false;
    16. })
    17. })
  • 相关阅读:
    Python数据分析实战-实现Kruskal-Wallis H检验(附源码和实现效果)
    有意识的神经网络之对比网络层和后意识层
    【SIMULINK】全网最牛逼自制感应电机simulink模型,基于原始方程
    [Python人工智能] 四十二.命名实体识别 (3)基于Bert+BiLSTM-CRF的中文实体识别万字详解(异常解决中)
    Linux MinIO 安装与配置(清晰明了)
    口播神器,基于Edge,微软TTS(text-to-speech)文字转语音免费开源库edge-tts实践(Python3.10)
    2022最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)
    经纬高坐标转东北天坐标
    Zemax操作36--一个选择初始结构的例子
    人工智能第2版学习——知情搜索2
  • 原文地址:https://blog.csdn.net/m0_46623754/article/details/125574244