• 2、项目第三阶段——代码优化


    书城项目第三阶段

    1、页面 jsp 动态化

    1、在 html 页面顶行添加 page 指令。

    2、修改文件后缀名为:.jsp

    3、使用 IDEA 搜索替换.html 为.jsp(快捷键:Ctrl+Shift+R)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x6RG54qa-1663395471030)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220505194626438.png)]

    2、抽取页面中相同的内容

    head 中 css、jquery、base 标签

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%
        String basePath = request.getScheme()
                + "://"
                + request.getServerName()
                + ":"
                + request.getServerPort()
                + request.getContextPath()
                + "/";
    %>
    
    
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    每个页面的页脚

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    我的书城;2021
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    登录成功后的菜单

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
    欢迎老板光临你的书城 我的订单 注销   返回
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    manager 模块的菜单

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    登录,注册错误提示,及表单回显

    以登录回显为示例:

    ​ Servlet 程序端需要添加回显信息到 Request 域中

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3VNMGPT0-1663395471032)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220505195159905.png)]

    jsp 页面,需要输出回显信息

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F6zTyRa3-1663395471033)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220505195556629.png)]

    3、BaseServlet 的抽取

    在实际的项目开发中,一个模块,一般只使用一个 Servlet

    代码优化一:

    合并 LoginServlet 和 RegistServlet 程序为 UserServle

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8mTNQjgu-1663395471033)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220505201048513.png)]

    UserServlet 程序:

    
    import my.book.Servlet.impl.UserService;
    import my.book.Servlet.impl.UserServiceImpl;
    import my.book.pojo.User;
    import my.book.utils.WebUtils;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class UserServlet extends HttpServlet {
        private UserService userService = new UserServiceImpl();
        /**
         * 处理登录的功能
         * @param req
         * @param resp
         * @throws ServletException
         * @throws IOException
         */
        protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
                IOException {
    // 1、获取请求的参数
            String username = req.getParameter("username");
            String password = req.getParameter("password");
    // 调用 userService.login()登录处理业务
            User loginUser = userService.login(new User(null, username, password, null));
    // 如果等于 null,说明登录 失败!
            if (loginUser == null) {
    // 把错误信息,和回显的表单项信息,保存到 Request 域中
                req.setAttribute("msg","用户或密码错误!");
                req.setAttribute("username", username);
    // 跳回登录页面
                req.getRequestDispatcher("/pages/user/login.jsp").forward(req, resp);
            } else {
    // 登录 成功
    //跳到成功页面 login_success.html
                req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req, resp);
            }
        }
        /**
         * 处理注册的功能
         * @param req
         * @param resp
         * @throws ServletException
         * @throws IOException
         */
        protected void regist(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
                IOException {
    // 1、获取请求的参数
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            String email = req.getParameter("email");
            String code = req.getParameter("code");
    // 2、检查 验证码是否正确 === 写死,要求验证码为:abcde
            if ("abcde".equalsIgnoreCase(code)) {
    // 3、检查 用户名是否可用
                if (userService.existsUsername(username)) {
                    System.out.println("用户名[" + username + "]已存在!");
    // 把回显信息,保存到 Request 域中
                    req.setAttribute("msg", "用户名已存在!!");
                    req.setAttribute("username", username);
                    req.setAttribute("email", email);
    // 跳回注册页面
                    req.getRequestDispatcher("/pages/user/regist.jsp").forward(req, resp);
                } else {
    // 可用
    // 调用 Sservice 保存到数据库
                    userService.registUser(new User(null, username, password, email));
    //
    // 跳到注册成功页面 regist_success.jsp
                    req.getRequestDispatcher("/pages/user/regist_success.jsp").forward(req, resp);
                }
            } else {
    // 把回显信息,保存到 Request 域
                req.setAttribute("msg", "验证码错误!!");
                req.setAttribute("username", username);
                req.setAttribute("email", email);
                System.out.println("验证码[" + code + "]错误");
                req.getRequestDispatcher("/pages/user/regist.jsp").forward(req, resp);
            }
        }
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
                IOException {
            String action = req.getParameter("action");
            if ("login".equals(action)) {
                login(req, resp);
            } else if ("regist".equals(action)) {
                regist(req, resp);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93

    还要给 login.jsp 添加隐藏域和修改请求地

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KTMdzGAG-1663395471034)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220505200622808.png)]

    给 regist.jsp 页面添加隐藏域 action,和修改请求地

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-daqFHbLI-1663395471034)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220505200731215.png)]

    优化代码二:

    使用反射优化大量 else if

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
    IOException {
    String action = req.getParameter("action");
    try {
    // 获取 action 业务鉴别字符串,获取相应的业务 方法反射对象
    Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class,
    HttpServletResponse.class);
    // System.out.println(method);
    // 调用目标业务 方法
    method.invoke(this, req, resp);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    代码优化三:

    抽取 BaseServlet 程序

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vEIM5Z1v-1663395471035)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220505201853016.png)]

    BaseServlet 程序代码:

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.lang.reflect.Method;
    
    public abstract class BaseServlet extends HttpServlet {
    
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String action = req.getParameter("action");
            try {
                // 获取action业务鉴别字符串,获取相应的业务 方法反射对象
                Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
    //            System.out.println(method);
                // 调用目标业务 方法
                method.invoke(this, req, resp);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    修改 UserServlet 程序继承 BaseServlet 程序。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SZO8lSfD-1663395471035)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220505202257004.png)]

    因为没有 改继承的对象,然后一直在报错改了一个小时

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lcBeMOEl-1663395471036)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220505202644726.png)]

    数据的封装和抽取 BeanUtils 的使用

    BeanUtils 工具类,它可以一次性的把所有请求的参数注入到 JavaBean 中。

    BeanUtils 工具类,经常用于把 Map 中的值注入到 JavaBean 中,或者是对象属性值的拷贝操作。

    BeanUtils 它不是 Jdk 的类。而是第三方的工具类。所以需要导包。

    1、导入需要的 jar 包:

    commons-beanutils-1.8.0.jar

    commons-logging-1.1.1.jar

    2、编写 WebUtils 工具类使用:

    WebUtils 工具类:

    import org.apache.commons.beanutils.BeanUtils;
    
    import java.util.Map;
    
    public class WebUtils {
        /**
         * 把Map中的值注入到对应的JavaBean属性中。
         * @param value
         * @param bean
         */
        public static <T> T copyParamToBean( Map value , T bean ){
            try {
                System.out.println("注入之前:" + bean);
                /**
                 * 把所有请求的参数都注入到user对象中
                 */
                BeanUtils.populate(bean, value);
                System.out.println("注入之后:" + bean);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return bean;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    书城-第四阶段

    使用 EL 表达式修改表单回显

    以登录为示例

         /**
             * 把所有请求的参数都注入到user对象中
             */
            BeanUtils.populate(bean, value);
            System.out.println("注入之后:" + bean);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bean;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    }

    
    # 书城-第四阶段
    
    使用 EL 表达式修改表单回显
    
    以登录为示例
    
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fOoRIWU5-1663395471036)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220505203206896.png)]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    硬件工程师年薪26万美元、软件工程师30万,在谷歌打工“香”吗?
    RabbitMQ 常用模式
    深度学习 | Transformer 基本原理
    “最强7B模型”论文发布,揭秘如何超越13B版Llama 2
    协程: Flow 异步流 /
    DOS攻击-ftp_fuzz.py
    Flutter快学快用12 列表样式:实践 Flutter 中内容多样式展示方式
    腐蚀和膨胀
    hbase建表时设置预分区
    web前端网页设计期末课程大作业:旅游网页主题网站设计——紫色的旅游开发景点网站静态模板(4页)HTML+CSS+JavaScript
  • 原文地址:https://blog.csdn.net/weixin_53330986/article/details/126904936