第三阶段
1.1 页面jsp动态化
- 在html页面顶行添加page指令
- 修改文件后缀名为: .jsp
- 使用IDEA搜索替换.html为.jsp(快捷键:Ctrl+Shift+R)
1.2 抽取页面中相同的内容
- 在页面文件夹中创建common文件夹用于存放相同的内容
- 创建footet.jsp存放底部相同内容
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div id="bottom">
<span>
尚硅谷书城.Copyright ©2015
</span>
</div>
- 创建head.jsp存放头部相同内容
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!--写base标签,永远固定相对路径跳转的结果-->
<%
String basePath = request.getScheme()
+ "://"
+ request.getServerName()
+ ":"
+ request.getServerPort()
+ request.getContextPath()
+ "/";
%>
<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>
- 创建login_sucess-menu.jsp存放登录成功后的菜单
<%@ 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>
<a href="../../index.jsp">返回</a>
</div>
- 创建manager_menu.jsp存放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>
- 导入这些相同的内容
<%@ include file="文件地址"%>
1.3 登录,注册错误提示级表单回显
以登录回显为示例:
Servlet程序段需要添加回显信息到Request域中
jsp页面需要输出回显信息
1.4 BaseServlet的抽取
在实际项目开发中,一个模块一般只使用一个Servlet程序
- 代码优化:合并LoginServlet和RegisterServlet程序为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);
}
}
}
还要给login.jsp添加隐藏域和修改请求地址
还要给regist.jsp页面添加隐藏域和修改请求地址
2. 代码优化二:使用大量反射优化大量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();
}
}
- 代码优化三:抽取BaseServelt程序
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();
}
}
}
修改UserServelet程序继承BaseServlet程序
1.5 数据的封装和抽取BeanUtils的使用
- BeanUtils 工具类,它可以一次性的把所有请求的参数注入到 JavaBean 中。
- BeanUtils 工具类,经常用于把 Map 中的值注入到 JavaBean 中,或者是对象属性值的拷贝操作。\
- BeanUtils 它不是 Jdk 的类。而是第三方的工具类。所以需要导包。
- commons-beanutils-1.8.0.jar
- 写 WebUtils 工具类使用:
WebUtils工具类的:
package com.atguigu.utils;
import com.atguigu.pojo.User;
import org.apache.commons.beanutils.BeanUtils;
import java.util.Map;
public class WebUtils {
// 因为三层架构MVC,使用HttpServletRequest,那么只能在Web上面使用耦合度高
// public static void copyParamToBean(HttpServletRequest req,Object bean){
// try {
//
// System.out.println(bean);
// BeanUtils.populate(bean,req.getParameterMap());
// System.out.println(bean );
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
//使用Map的话 在三层架构中都可以使用耦合度低
public static <T> T copyParamToBean(Map value, T bean){
try {
System.out.println(bean);
BeanUtils.populate(bean,value);
System.out.println(bean );
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
}
调用代码为
//使用req,耦合度高
// User user=new User();
// WebUtils.copyParamToBean(req,user);
// 调用 userService.login()登录处理业务
//使用map注入耦合度低
User user= WebUtils.copyParamToBean(req.getParameterMap(), new User());
User loginUser = userService.login(user);
1.6 使用EL表达式修改表单回显
以显示为例