Day116.简单书城项目---第三阶段 -JavaWeb

第三阶段

一、页面jsp动态化

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

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

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

Day116.简单书城项目---第三阶段 -JavaWeb_第1张图片

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

将相同的内容写入不同的jsp并通过include导入

1、head 中 css 、jquery 、base 标签

<%
    //动态的获取一个base标签的值
    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>

2、每个页面的页脚

<div id="bottom">
		<span>
			阿昌书城.Copyright ©2020
		span>
div>

3、 登录成功后的菜单

<div>
    <span>欢迎<span class="um_span">郑总span>光临阿昌书城span>
    <a href="pages/order/order.jsp">我的订单a>
    <a href="index.jsp">注销a>  
    <a href="index.jsp">返回a>
div>

4、 manager 模块的菜单

<div>
    <a href="pages/manager/book_manager.jsp">图书管理a>
    <a href="pages/manager/order_manager.jsp">订单管理a>
    <a href="index.jsp">返回商城a>
div>

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

以登录回显为示例:
Servlet 程序端需要添加回显信息到 Request 域中

Day116.简单书城项目---第三阶段 -JavaWeb_第2张图片

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

Day116.简单书城项目---第三阶段 -JavaWeb_第3张图片

四、BaseServlet的抽取

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

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

Day116.简单书城项目---第三阶段 -JavaWeb_第4张图片

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 添加隐藏域和修改请求地址

Day116.简单书城项目---第三阶段 -JavaWeb_第5张图片

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

Day116.简单书城项目---第三阶段 -JavaWeb_第6张图片

优化代码二:使用反射优化大量 else if 代码:

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
     
        String action = req.getParameter("action");
        //处理登录请求
        try {
     
            //获取action业务,鉴别字符串,获取相应的业务方法,反射对象
            Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            //调用目标业务方法
            method.invoke(this,req,resp);

        } catch (Exception e) {
     
            e.printStackTrace();
        }

    }

代码优化三:抽取 BaseServlet 程序。

Day116.简单书城项目---第三阶段 -JavaWeb_第7张图片

BaseServlet 程序代码:

public abstract class BaseServlet extends HttpServlet {
     

    //子类模块继承此类,不重写doPost()方法,因此调用的是父类BaseServlet的doPost()方法,
    //然后通过下面的方法反射出子类this的方法名,并且调用方法。完成业务请求。
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
     
        String action = req.getParameter("action");
        //处理登录请求
        try {
     
            //获取action业务,鉴别字符串,获取相应的业务方法,反射对象
            Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            //调用目标业务方法
            method.invoke(this,req,resp);

        } catch (Exception e) {
     
            e.printStackTrace();
        }

    }

}

修改 UserServlet 程序继承 BaseServlet 程序。

Day116.简单书城项目---第三阶段 -JavaWeb_第8张图片

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

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

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

1、导入需要的jar包;

commons-beanutils-1.8.0.jar
commons-logging-1.1.1.jar

2、使用BeanUtils类方法实现注入

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对象中
             */
            //pupulate(),参数1:接收注入的对象;参数2:即将注入的键值对Map
            BeanUtils.populate(bean,value);
            System.out.println("注入之后: "+bean);
        } catch (Exception e) {
     
            e.printStackTrace();
        }
        
        return bean;
    }

}

感谢尚硅谷

你可能感兴趣的:(JavaWeb,jsp,javabean,servlet,java)