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()
            + "/";
%>

<!--写base标签,永远固定相对路径跳转的结果-->
<base href="<%=basePath%>">
<link type="text/css" rel="stylesheet" href="static/css/style.css" >
<script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>

每个页面的页脚

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div id="bottom">
      <span>
        我的书城;2021
      </span>
</div>

登录成功后的菜单

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<div>
    <span>欢迎<span class="um_span">老板</span>光临你的书城</span>
    <a href="../order/order.jsp">我的订单</a>
    <a href="../../index.jsp">注销</a>&nbsp;&nbsp;
    <a href="../../index.jsp">返回</a>
</div>

manager 模块的菜单

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div>
    <a href="book_manager.jsp">图书管理</a>
    <a href="order_manager.jsp">订单管理</a>
    <a href="../../index.jsp">返回商城</a>
</div>

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

以登录回显为示例:

​ 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);
        }
    }
}

还要给 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();
}
}

代码优化三:

抽取 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();
        }
    }

}

修改 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;
    }

}

书城-第四阶段

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

以登录为示例

     /**
         * 把所有请求的参数都注入到user对象中
         */
        BeanUtils.populate(bean, value);
        System.out.println("注入之后:" + bean);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return bean;
}

}


# 书城-第四阶段

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

以登录为示例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fOoRIWU5-1663395471036)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220505203206896.png)]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值