第三阶段

1.1 页面jsp动态化

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

1.2 抽取页面中相同的内容

  1. 在页面文件夹中创建common文件夹用于存放相同的内容
  2. 创建footet.jsp存放底部相同内容
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div id="bottom">
		<span>
			尚硅谷书城.Copyright ©2015
		</span>
</div>
  1. 创建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>
  1. 创建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>
  1. 创建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>
  1. 导入这些相同的内容
<%@ include file="文件地址"%>

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

以登录回显为示例:

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

尚硅谷JAVA的API 尚硅谷java项目三_User

jsp页面需要输出回显信息

尚硅谷JAVA的API 尚硅谷java项目三_尚硅谷JAVA的API_02

1.4 BaseServlet的抽取

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

  1. 代码优化:合并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添加隐藏域和修改请求地址

尚硅谷JAVA的API 尚硅谷java项目三_servlet_03


还要给regist.jsp页面添加隐藏域和修改请求地址

尚硅谷JAVA的API 尚硅谷java项目三_java_04


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();
}
}
  1. 代码优化三:抽取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程序

尚硅谷JAVA的API 尚硅谷java项目三_前端_05

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

  1. BeanUtils 工具类,它可以一次性的把所有请求的参数注入到 JavaBean 中。
  2. BeanUtils 工具类,经常用于把 Map 中的值注入到 JavaBean 中,或者是对象属性值的拷贝操作。\
  3. 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表达式修改表单回显

以显示为例

尚硅谷JAVA的API 尚硅谷java项目三_尚硅谷JAVA的API_06