书城项目_第三阶段_代码优化

一、页面 jsp 动态化 动态化

1、在 html 页面顶行添加 page 指令。
2、修改文件后缀名为:.jsp
3、使用 IDEA 搜索替换.html 为.jsp(快捷键:Ctrl+Shift+R)

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

i. head 中 中 css 、jquery 、base 标签

<%
String basePath = request.getScheme()
+ "://"
+ request.getServerName()
+ ":"
+ request.getServerPort()
+ request.getContextPath()
+ "/";
%>
<%=basePath%>
<!-- 写 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>

ii. 每个页面的页脚
iii. 登录成功后的菜单
iv. manager 模块的菜单

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

以登录回显为示例:

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

在这里插入图片描述

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

在这里插入图片描述

四、BaseServlet 的抽取

代码优化: 合并 LoginServlet 和 RegistServlet 程序为 UserServlet 程序

在这里插入图片描述
UserServlet 程序:

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);
		}
	}
}
优化代码二:使用反射优化大量 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 程序。

在这里插入图片描述

BaseServlet 程序代码:

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 程序。

五、数据的封装和抽取 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 工具类:

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;
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玳宸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值