javaWeb - 书城项目第三阶段

书城项目第三阶段

ctrl + r : 查找 (爆红没找到) + 替换,成批的更改内容

ctrl + shift + r : 按照项目、模块、目录 (可选择按照文件后缀名) 查找替换

选择文件名 ctrl + shift + r 直接进入该文件夹进行 查找替换

​ 或者点击 … 选择文件夹

​ 之后,在查找框中输入 .html,在替换框中输入 .jsp,选择 File mask: 文件,输入 *.jsp,方可看到更改前的文件

​ Replace All : 一次性替换全部

​ Replace : 一个一个替换

重点,清理浏览器缓存,否则显示不成功

准备工作

<!--
	1.第三阶段:
        a) 页面 jsp 动态化
            1、在 html 页面顶行添加 page 指令。
            2、修改文件后缀名为:.jsp
            3、使用 IDEA 搜索替换.html 为.jsp(快捷键:Ctrl+Shift+R)
        b)抽取页面中相同的内容

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

head

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String basePath = request.getScheme()
            + "://"
            + request.getServerName()
            + ":"
            + request.getServerPort()
            + request.getContextPath()
            + "/";
%>
<%--
    测试看效果用的:
    <%=basePath%>
--%>
<%--<%=basePath%>--%>
<!-- 写 base 标签,永远固定相对路径跳转的结果 在一个工程里 base 基本上都是一样的 -->
<%--<base href="basePath"><!-- "/" 错误示例 -->--%>
<base href="<%=basePath%>"><!-- "/" 不能少 -->
<%--<base href="http://localhost:8080/book"><!-- "/" 不能少 -->--%>

<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. 每个页面的页脚
-->    

footer

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<div id="bottom">
		<span>
			尚硅谷书城.Copyright &copy;2015
		</span>
</div>
<--
    iii. 登录成功后的菜单
-->    

login_success_menu

<%@ 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>&nbsp;&nbsp;
    <a href="../../index.jsp">返回</a>
</div>

<--
    iv. manager 模块的菜单
-->    

manager_menu

<%@ 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>
<--
    c) 登录,注册错误提示,及表单回显
            以登录回显为示例:
            Servlet 程序端需要添加回显信息到 Request 域中
-->   

LoginServlet

// 如果等于 null,说明登录失败!
		if (loginUser == 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);
		}

LoginServlet

package com.sq.web;

import com.sq.pojo.User;
import com.sq.service.UserService;
import com.sq.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 LoginServlet extends HttpServlet {

	private UserService userService = new UserServiceImpl();

	@Override
	protected void doPost(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.jsp
			req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req, resp);
		}

	}
}

login

<%-- jsp 页面,需要输出回显信息 --%>

<div class="msg_cont">
<%--<%=request.getAttribute("msg")==null?"请输入用户名和密码":request.getAttribute("msg")%>--%>
    <b></b>
    <span class="errorMsg">
        <%=request.getAttribute("msg")==null?"请输入用户名和密码":request.getAttribute("msg")%>
    </span>
</div>
<div class="form">
    <form action="loginServlet" method="post">
        <label>用户名称:</label>
        <input class="itxt" type="text" placeholder="请输入用户名"
               autocomplete="off" tabindex="1" name="username"
               <%-- 登录的错误回显 --%>
               value="<%=request.getAttribute("username")==null?"":request.getAttribute("username")%>" />



login

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>尚硅谷会员登录页面</title>

	<%-- 静态包含 base 标签,css样式,jQuery 文件 --%>
	<%@include file="/pages/common/head.jsp"%>
<%--
	<!-- 写 base 标签,永远固定相对路径跳转的结果 在一个工程里 base 基本上都是一样的 -->
	<base href="http://localhost:8080/book/"><!-- "/" 不能少 -->
	<link type="text/css" rel="stylesheet" href="static/css/style.css" >
--%>
</head>
<body>
		<div id="login_header">
			<img class="logo_img" alt="" src="static/img/logo.gif" >
		</div>
		
			<div class="login_banner">
			
				<div id="l_content">
					<span class="login_word">欢迎登录</span>
				</div>
				
				<div id="content">
					<div class="login_form">
						<div class="login_box">
							<div class="tit">
								<h1>尚硅谷会员</h1>
								<a href="pages/user/regist.jsp">立即注册</a>
							</div>
							<div class="msg_cont">
<%--								<%=request.getAttribute("msg")==null?"请输入用户名和密码":request.getAttribute("msg")%>--%>
									<b></b>
									<span class="errorMsg">
										<%=request.getAttribute("msg")==null?"请输入用户名和密码":request.getAttribute("msg")%>
									</span>
							</div>
							<div class="form">
								<form action="userServlet" method="post">
									<%-- 隐藏域 --%>
										<input type="hidden" name="action" value="login" />
									<label>用户名称:</label>
									<input class="itxt" type="text" placeholder="请输入用户名"
										   autocomplete="off" tabindex="1" name="username"
										   <%-- 登录的错误回显 --%>
										   value="<%=request.getAttribute("username")==null?"":request.getAttribute("username")%>" />
									<br />
									<br />
									<label>用户密码:</label>
									<input class="itxt" type="password" placeholder="请输入密码"
										   autocomplete="off" tabindex="1" name="password" />
									<br />
									<br />
									<input type="submit" value="登录" id="sub_btn" />
								</form>
							</div>
							
						</div>
					</div>
				</div>
			</div>

		<%-- 静态包含页脚内容 --%>
		<%@include file="/pages/common/footer.jsp"%>
	<%--
		<div id="bottom">
			<span>
				尚硅谷书城.Copyright &copy;2015
			</span>
	</div>
	--%>
</body>
</html>
<--
    d) BaseServlet 的抽取
        在实际的项目开发中,一个模块,一般只使用一个 Servlet 程序。
    
        代码优化一:代码优化:合并 LoginServlet 和 RegistServlet 程序为 UserServlet 程序
-->    

UserServlet

package com.sq.web;

import com.sq.pojo.User;
import com.sq.service.UserService;
import com.sq.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 /*HttpServlet*/ BaseServlet {

	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.jsp
			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.检查 验证码是否正确
		if("abcde".equalsIgnoreCase(code)){
			// 3.检查	用户名是否可用
			if(userService.existsUsername(username)){
				System.out.println("用户名 [" + username + "] 已存在!");

				// 把回显信息,保存到 Request 域中
				req.setAttribute("msg","用户名已存在!");
				req.setAttribute("username",username);
				req.setAttribute("password",password);
				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("password",password);
			req.setAttribute("email",email);

			System.out.println("验证码 [" + code + "] 错误");
			req.getRequestDispatcher("/pages/user/regist.jsp").forward(req, resp);
		}
	}

//	使用该类的方法,就可以把 LoginServlet 和 RegistServlet 删除了,web.xml 中的配置也可删除了
	@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);

		}
	}
}

UserServletTest

package com.sq.web;

import java.lang.reflect.Method;

public class UserServletTest {

	public void login(){
		System.out.println("这是 login() 方法调用了");
	}
	public void regist(){
		System.out.println("这是 regist() 方法调用了");
	}
	public void updateUser(){
		System.out.println("这是 updateUser() 方法调用了");
	}
	public void updateUserPassword(){
		System.out.println("这是 updateUserPassword() 方法调用了");
	}

	public static void main(String[] args) {
		String action = "login";

		try {
			// 获取 action 业务鉴别字符串,获取响应的业务 方法反射对象
			Method method = UserServletTest.class.getDeclaredMethod(action);

//			System.out.println(method);//public void com.sq.web.UserServletTest.login()

			// 调用目标业务 方法
			method.invoke(new UserServletTest());
			// 这是 login() 方法调用了

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

<--
    还要给 login.jsp 添加隐藏域和修改请求地址
-->    

login

<div class="form">
    <form action="userServlet" method="post">
        <%-- 隐藏域 --%>
        <input type="hidden" name="action" value="login" />
        <label>用户名称:</label>
<--
    给 tegist.jsp 页面添加隐藏域 action,和修改请求地址
-->

regist

<div class="form">
    <form action="userServlet" method="post">
        <%-- 隐藏域 --%>
        <input type="hidden" name="action" value="regist" />
        <label>用户名称:</label>

regist

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head><!-- F12 下网络 找到错误,在 IDEA 中用 ctrl+f 快速找到错误 -->
	<meta charset="UTF-8">
	<title>尚硅谷会员注册页面</title>

	<%-- 静态包含 base 标签,css样式,jQuery 文件 --%>
	<%@include file="/pages/common/head.jsp"%>
<%--
	<!-- 写 base 标签,永远固定相对路径跳转的结果 在一个工程里 base 基本上都是一样的 -->
	<base href="http://localhost:8080/book/"><!-- "/" 不能少 -->

	<link type="text/css" rel="stylesheet" href="static/css/style.css" >
	<script type="text/javascript" src="static\script\jquery-1.7.2.js"></script>
--%>
	<script type="text/javascript">
		// 页面加载完成之后
		$(function () {
			// 给注册绑定单击事件
			$("#sub_btn").click(function (){
				// 验证用户名:必须由字母,数字下划线组成,并且长度为 5 到 12 位
				// 1.获取用户输入框里的内容
				var usernameText = $("#username").val();
				// 2.创建正则表达式对象
				var usernamePatt = /^\w{5,12}$/;
				// 3.使用 test 方法验证
				if(!usernamePatt.test(usernameText)){
					// 4.提示用户结果
					$("span.errorMsg").text("用户不合法!");

					return false;
				}
				// 验证密码:必须由字母,数字下划线组成,并且长度为 5 到 12 位
				// 1.获取密码输入框里的内容
				var passwordText = $("#password").val();
				// 2.创建正则表达式对象
				var passwordPatt = /^\w{5,12}$/;
				// 3.使用 test 方法验证
				if(!passwordPatt.test(passwordText)){
					// 4.提示用户结果
					$("span.errorMsg").text("密码不合法!");

					return false;
				}
				// 验证确认密码:和密码相同
				// 1.获取确认密码内容
				var repwdText = $("#repwd").val();
				// 2.和密码相比较
				if(repwdText != passwordText){
					// 3.提示用户
					$("span.errorMsg").text("确认密码和密码不一致!");

					return false;
				}

				// 邮箱验证:xxxxx@xxx.com
				// 1.获取邮箱里的内容
				var emailText = $("#email").val();
				// 2.创建正则表达式对象
				var emailPatt = /^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/;
				// 3.使用 test 方法验证是否合法
				if (!emailPatt.test(emailText)){
					// 4.提示用户
					$("span.errorMsg").text("邮箱格式不合法!");

					return false;
				}

				// 验证码:现在只需要验证用户已输入。因为还没讲到服务器。验证码生成。
				var codeText = $("#code").val();

				// 去掉验证码前后空格
				// alert("去空格前:[" + codeText + "]")
				codeText = $.trim(codeText);
				// alert("去空格后:[" + codeText + "]")

				if(codeText == null || codeText == ""){
					// 4.提示用户
					$("span.errorMsg").text("验证码不能为空!");

					return false;
				}

				// 去掉错误信息
				$("span.errorMsg").text("");

			});

		});
	</script>

	<style type="text/css">
		.login_form{
			height:420px;
			margin-top: 25px;
		}

	</style>
	<script src="static/script/jquery-1.7.2.js"></script>
</head>
<body>
<div id="login_header">
	<img class="logo_img" alt="" src="static/img/logo.gif" >
</div>

<div class="login_banner">

	<div id="l_content">
		<span class="login_word">欢迎注册</span>
	</div>

	<div id="content">
		<div class="login_form">
			<div class="login_box">
				<div class="tit">
					<h1>注册尚硅谷会员</h1>
					<span class="errorMsg">
						<%=request.getAttribute("msg")==null?"":request.getAttribute("msg")%>
					</span>
				</div>
				<div class="form">
					<form action="userServlet" method="post">
						<%-- 隐藏域 --%>
							<input type="hidden" name="action" value="regist" />
						<label>用户名称:</label>
						<input class="itxt" type="text" placeholder="请输入用户名"
							   value="<%=request.getAttribute("username")==null?"":request.getAttribute("username")%>"
							   autocomplete="off" tabindex="1" name="username" id="username" />
						<br />
						<br />
						<label>用户密码:</label>
						<input class="itxt" type="password" placeholder="请输入密码"
							   value="<%=request.getAttribute("password")==null?"":request.getAttribute("password")%>"
							   autocomplete="off" tabindex="1" name="password" id="password" />
						<br />
						<br />
						<label>确认密码:</label>
						<input class="itxt" type="password" placeholder="确认密码"
							   autocomplete="off" tabindex="1" name="repwd" id="repwd" />
						<br />
						<br />
						<label>电子邮件:</label>
						<input class="itxt" type="text" placeholder="请输入邮箱地址"
							   value="<%=request.getAttribute("email")==null?"":request.getAttribute("email")%>"
							   autocomplete="off" tabindex="1" name="email" id="email" />
						<br />
						<br />
						<label>验证码:</label>
						<input class="itxt" type="text" name="code" style="width: 150px;" id="code" />
						<img alt="" src="static/img/code.bmp" style="float: right; margin-right: 40px">
						<br />
						<br />
						<input type="submit" value="注册" id="sub_btn" />
					</form>
				</div>

			</div>
		</div>
	</div>
</div>

<%-- 静态包含页脚内容 --%>
<%@include file="/pages/common/footer.jsp"%>
<%--
	<div id="bottom">
				<span>
					尚硅谷书城.Copyright &copy;2015
				</span>
	</div>
--%>
</body>
</html>
<--
    优化代码二:使用反射优化大量 else if 代码:
-->

UserServlet

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);//public void com.sq.web.UserServletTest.login()

			// 调用目标业务 方法
			method.invoke( this,req,resp );

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

UserServlet

package com.sq.web;

import com.sq.pojo.User;
import com.sq.service.UserService;
import com.sq.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;

/**
 * @author 21115
 * @ date 2021/9/29
 */
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.jsp
			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.检查 验证码是否正确
		if("abcde".equalsIgnoreCase(code)){
			// 3.检查	用户名是否可用
			if(userService.existsUsername(username)){
				System.out.println("用户名 [" + username + "] 已存在!");

				// 把回显信息,保存到 Request 域中
				req.setAttribute("msg","用户名已存在!");
				req.setAttribute("username",username);
				req.setAttribute("password",password);
				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("password",password);
			req.setAttribute("email",email);

			System.out.println("验证码 [" + code + "] 错误");
			req.getRequestDispatcher("/pages/user/regist.jsp").forward(req, resp);
		}
	}

//	使用该类的方法,就可以把 LoginServlet 和 RegistServlet 删除了,web.xml 中的配置也可删除了
	@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);

//			System.out.println(method);//public void com.sq.web.UserServletTest.login()

			// 调用目标业务 方法
			method.invoke( this,req,resp );

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

	/*
		if ("login".equals(action)){

			login(req,resp);

		} else if ("regist".equals(action)){

			regist(req,resp);

		}
	*/
	}
}

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

BaseServlet

package com.sq.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;

/**
 * @author 21115
 * @ date 2021/9/29
 */
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);

//			System.out.println(method);//public void com.sq.web.UserServletTest.login()

			// 调用目标业务 方法
			method.invoke( this,req,resp );

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

}

<--
    修改 UserServlet 程序继承 BaseServlet 程序。
    
    也就是 UserServlet 类继承 BaseServlet
        public class UserServlet extends BaseServlet {
-->    
<--
    e) 数据的封装和抽取 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 工具类:
-->    

WebUtils

package com.sq.utils;

import com.sq.pojo.User;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * @author 21115
 * @ date 2021/9/29
 *
 * 	HttpServletRequest
 * 		Dao 层		不能用
 * 		Service 层	不能用
 * 		Web 层		耦合度高
 *
 * 	Map
 * 		Dao 层		能用
 * 		Service 层	能用
 * 		Web 层		能用
 */
public class WebUtils {

	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;
	}

/*
	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();
		}
	}
*/

}

UserServlet

/*
	WebUtils.copyParamToBean(req,user);
	改为
	User user = WebUtils.copyParamToBean(req.getParameterMap(),new User());
*/

书城-第四阶段。使用 EL 表达式修改表单回显

regist.jsp

<span class="errorMsg">
<%--<%=request.getAttribute("msg")==null?"":request.getAttribute("msg")%>--%>
    ${ requestScope.msg }
</span>

<label>用户名称:</label>
<input class="itxt" type="text" placeholder="请输入用户名"
<%--value="%=request.getAttribute("username")==null?"":request.getAttribute("username")%>"--%>
                                                                                                                 value="${requestScope.username}"
                                                               
<label>电子邮件:</label>                                                                                     <input class="itxt" type="text" placeholder="请输入邮箱地址"
<%--value="<%=request.getAttribute("email")==null?"":request.getAttribute("email")%>"--%>
	value="${requestScope.email}"                                                             
                                                               
                                                               

login.jsp

<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="<%=request.getAttribute("username")==null?"":request.getAttribute("username")%>" />--%>
	value="${requestScope.username}"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值