03-04 尚硅谷书城案例

1、页面 jsp 动态化

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

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

  1. head 中 css、jquery、base标签
  2. 每个页面的页脚
  3. 登录成功后的菜单
  4. manager 模块的菜单

抽取相同内容:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
应用到每个页面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、动态获取 base 标签值

每个人电脑的 ip 地址不一样所以 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>

4、表单提交失败的错误回显

分析:
在这里插入图片描述

4.1、登录失败的回显

在LoginServlet.java 类中的操作
在这里插入图片描述
在 login.jsp中的操作
在这里插入图片描述
页面运行效果:
在这里插入图片描述

4.2、注册页面的回显

RegistServlet.java 类中的操作
在这里插入图片描述
在这里插入图片描述
在 regist.jsp中的操作在这里插入图片描述在这里插入图片描述
页面运行结果
在这里插入图片描述

在这里插入图片描述

5、BaseServlet的抽取

5.1、合并LoginServlet 和 RegistServlet 程序为 UserServlet

分析:
在这里插入图片描述

一个项目最好只有一个 servlet
在这里插入图片描述
在这里插入图片描述
UserServlet

package com.aiguigu.web;

import com.aiguigu.pojo.User;
import com.aiguigu.service.UserService;
import com.aiguigu.service.impl.UserServiceImpl;

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();

    protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        //判断用户名和密码 如果 == null 说明登录失败
        if (userService.login(new User(null,username,password,null)) == null){
            //把错误信息,和回显得表单项信息,保存到Request 域中
            req.setAttribute("msg","用户名或密码错误!");
            req.setAttribute("username",username);
            //跳回登录页面
            req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp);
        }else {
            //跳转到 login_success.jsp
            req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req,resp);
        }
    }
    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)){//equalsIgnoreCase:比较时忽略大小写

            //正确
            //3.检查 用户名是否可用
            if (userService.existUsername(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 {

                //可用
                //调用Service 保存到数据库
                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);
        }

    }
    @Override
    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);
        }
    }
}

5.2、使用 反射优化大量 else if 代码

在这里插入图片描述

  @Override
    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);

            //调用目标业务 方法
            method.invoke(this,req,resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

5.3、抽取 BaseServlet 程序

在这里插入图片描述
在这里插入图片描述
代码:

package com.aiguigu.web;

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 {
    @Override
    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);

            //调用目标业务 方法
            method.invoke(this,req,resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述
代码:

package com.aiguigu.web;

import com.aiguigu.pojo.User;
import com.aiguigu.service.UserService;
import com.aiguigu.service.impl.UserServiceImpl;

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 class UserServlet extends BaseServlet {

    private UserService userService = new UserServiceImpl();

    protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        //判断用户名和密码 如果 == null 说明登录失败
        if (userService.login(new User(null,username,password,null)) == null){
            //把错误信息,和回显得表单项信息,保存到Request 域中
            req.setAttribute("msg","用户名或密码错误!");
            req.setAttribute("username",username);
            //跳回登录页面
            req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp);
        }else {
            //跳转到 login_success.jsp
            req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req,resp);
        }
    }
    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)){//equalsIgnoreCase:比较时忽略大小写

            //正确
            //3.检查 用户名是否可用
            if (userService.existUsername(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 {

                //可用
                //调用Service 保存到数据库
                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);
        }

    }

}

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

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

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

  1. 导入需要的 jar 包:
    commons-beanutils-1.8.0.jar
    commons-logging-1.1.1.jar
  2. 使用 BeanUtils 类方法实现注入

WebUtils

package com.aiguigu.utils;

import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.InvocationTargetException;
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 (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return bean;
    }
}

在这里插入图片描述
在这里插入图片描述

6、书城的第四阶段。使用EL修改表单回显

login 页面
修改错误消息提示的回显

<span class="errorMsg">
<%-- <%=request.getAttribute("msg")==null?"请输入用户名和密码":request.getAttribute("msg")%>--%>
	${empty requestScope.msg ? "请输入用户名和密码":requestScope.msg}
</span>

修改用户名的回显

<input class="itxt" type="text" placeholder="请输入用户名" autocomplete="off"
tabindex="1" name="username" value="${requestScope.username}"/>

regist 页面

修改错误消息提示的回显

<span class="errorMsg"><%=request.getAttribute("msg") == null?"":request.getAttribute("msg")%></span>

修改用户名的回显

<input class="itxt" type="text" placeholder="请输入用户名"
										   autocomplete="off" tabindex="1" name="username"
										   id="username" value="${requestScope.username}" />		

修改邮箱的回显

<input class="itxt" type="text" placeholder="请输入邮箱地址"
										   autocomplete="off" tabindex="1" name="email" id="email"
											value="${requestScope.email}"/>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值