回显登录错误或注册错误信息
一. 将用户的操作写成一个UserServlet程序
1. 将LoginServlet和registServlet合成一个UserServlet程序,通过判断来执行相应的方法。之后想添加关于操作用户的其他业务,可以直接编写相应的方法,该UserServlet程序会自行判断并执行。
package server.web;
import server.pojo.User;
import server.service.UserService;
import server.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
private UserService userService = new UserServiceImpl();
protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取客户端的请求
String username = req.getParameter("username");
String password = req.getParameter("password");
//2.用户登录
User loginUser = userService.login(new User(null,username,password,null));
if(loginUser == null){
//登录失败,跳回登录页面
System.out.println("登录失败");
req.getRequestDispatcher("pages/user/login.jsp").forward(req,resp);
}else{
//登录成功,跳到首页index.jsp
System.out.println("登录成功");
req.getRequestDispatcher("index.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");
//2.用户注册
if(userService.existUsername(username)){
System.out.println("用户名" + username + "已存在");
req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp); //跳转到注册页面
}else{
userService.registUser(new User(null,username,password,email));
req.getRequestDispatcher("index.jsp").forward(req,resp); //跳转到注册成功页面
System.out.println("注册成功");
}
}
@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();
}
}
}
2.在表单中添加隐藏域,用于指向要执行该请求的方法
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
<base href="http://localhost:8080/StudyProject_war_exploded/">
</head>
<body>
<form action="userServlet" method="post">
<input type="hidden" name="action" value="login">
用户名:<input type="text" name="username"> <br/>
密码:<input type="password" name="password"> <br/>
<input type="submit" value="登录">
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
<base href="http://localhost:8080/StudyProject_war_exploded/">
</head>
<body>
<form action="userServlet" method="post">
<input type="hidden" name="action" value="regist">
用户名:<input type="text" name="username"> <br/>
用户密码:<input type="password" name="password"> <br/>
确认密码:<input type="password" name="password"> <br/>
电子邮箱:<input type="text" name="email"> <br/>
<input type="submit" value="注册">
</form>
</body>
</html>
二. 编写BaseServlet类
除了关于操作关于用户的类,其他的业务类中也需要通过获取隐藏域中的值来执行相应的方法,因此编写一个BaseServlet类,让其他的类都继承BaseServlet类,这样之后只用编写相关的方法就可以。
package server.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 doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8"); // 解决post请求中文乱码问题
resp.setContentType("text/html; charset=UTF-8"); // 解决响应中文乱码问题
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 server.web;
import server.pojo.User;
import server.service.UserService;
import server.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/userServlet")
public class UserServlet extends BaseServlet {
private UserService userService = new UserServiceImpl();
protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取客户端的请求
String username = req.getParameter("username");
String password = req.getParameter("password");
//2.用户登录
User loginUser = userService.login(new User(null,username,password,null));
if(loginUser == null){
//登录失败,跳回登录页面
System.out.println("登录失败");
req.getRequestDispatcher("pages/user/login.jsp").forward(req,resp);
}else{
//登录成功,跳到首页index.jsp
System.out.println("登录成功");
req.getRequestDispatcher("index.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");
//2.用户注册
if(userService.existUsername(username)){
System.out.println("用户名" + username + "已存在");
req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp); //跳转到注册页面
}else{
userService.registUser(new User(null,username,password,email));
req.getRequestDispatcher("index.jsp").forward(req,resp); //跳转到注册成功页面
System.out.println("注册成功");
}
}
}
三. 回显登录错误和注册错误相关的信息
package server.web;
import server.pojo.User;
import server.service.UserService;
import server.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/userServlet")
public class UserServlet extends BaseServlet {
private UserService userService = new UserServiceImpl();
protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取客户端的请求
String username = req.getParameter("username");
String password = req.getParameter("password");
//2.用户登录
User loginUser = userService.login(new User(null,username,password,null));
if(loginUser == null){
//登录失败,跳回登录页面
req.setAttribute("msg","用户名或密码错误!");
req.setAttribute("username",username);
req.getRequestDispatcher("pages/user/login.jsp").forward(req,resp);
}else{
//登录成功,跳到首页index.jsp
req.getRequestDispatcher("index.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");
//2.用户注册
if(userService.existUsername(username)){
req.setAttribute("msg","用户名已存在");
req.setAttribute("username",username);
req.setAttribute("email",email);
req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp); //跳转到注册页面
}else{
userService.registUser(new User(null,username,password,email));
req.getRequestDispatcher("index.jsp").forward(req,resp); //跳转到注册成功页面
}
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
<base href="http://localhost:8080/StudyProject_war_exploded/">
</head>
<body>
<form action="userServlet" method="post">
<input type="hidden" name="action" value="login">
用户名:<input type="text" name="username" value="<%=request.getAttribute("username")==null ? "" : request.getAttribute("username")%>"> <br/>
密码:<input type="password" name="password"> <br/>
<input type="submit" value="登录"> <br/>
<div>
<%= request.getAttribute("msg")==null ? "请输入用户名和密码" : request.getAttribute("msg") %>
</div>
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
<base href="http://localhost:8080/StudyProject_war_exploded/">
</head>
<body>
<form action="userServlet" method="post">
<input type="hidden" name="action" value="regist">
用户名:<input type="text" name="username" value="<%=request.getAttribute("username")==null ? "" : request.getAttribute("username")%>"> <br/>
用户密码:<input type="password" name="password"> <br/>
确认密码:<input type="password" name="password"> <br/>
电子邮箱:<input type="text" name="email" value="<%=request.getAttribute("email")==null ? "" : request.getAttribute("email")%>"> <br/>
<input type="submit" value="注册"> <br/>
<div>
<%= request.getAttribute("msg")==null ? "" : request.getAttribute("msg") %>
</div>
</form>
</body>
</html>
四. 使用EL表达式进行回显
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
<base href="http://localhost:8080/StudyProject_war_exploded/">
</head>
<body>
<form action="userServlet" method="post">
<input type="hidden" name="action" value="login">
用户名:<input type="text" name="username" value="${empty requestScope.username ? "" : requestScope.username}"> <br/>
密码:<input type="password" name="password"> <br/>
<input type="submit" value="登录"> <br/>
<div>
${empty requestScope.msg ? "请输入用户名和密码" : requestScope.msg}
</div>
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册</title>
<base href="http://localhost:8080/StudyProject_war_exploded/">
</head>
<body>
<form action="userServlet" method="post">
<input type="hidden" name="action" value="regist">
用户名:<input type="text" name="username" value="${empty requestScope.username ? "" : requestScope.username}"> <br/>
用户密码:<input type="password" name="password"> <br/>
确认密码:<input type="password" name="password"> <br/>
电子邮箱:<input type="text" name="email" value="${empty requestScope.email ? "" : requestScope.email}"> <br/>
<input type="submit" value="注册"> <br/>
<div>
${empty requestScope.msg ? "" : requestScope.msg}
</div>
</form>
</body>
</html>
五. 使用BeanUtils工具类一次性把所有请求的参数注入到JavaBean中
BeanUtils所需jar包:
commons-beanutils-1.9.4-bin.zip(下载地址:https://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi)和commons-logging-1.2-bin.zip(下载地址:https://commons.apache.org/proper/commons-logging/download_logging.cgi)和commons-collections-3.2.2-bin.zip(下载地址:https://commons.apache.org/proper/commons-collections/download_collections.cgi)
1. 为了便于扩展,可以将BeanUtils注入到JavaBean的过程封装成一个WebUtils工具类。之后只需要调用该方法即可。
package server.utils;
import org.apache.commons.beanutils.BeanUtils;
import java.util.Map;
public class WebUtils {
public static <T> T copyParamToBean(Map value, T bean){
try {
BeanUtils.populate(bean, value); //把所有请求注入到JavaBean中
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
}
2. 将多次获取参数的过程 转换为 一次性把所有请求的参数注入到JavaBean中。
package server.web;
import server.pojo.User;
import server.service.UserService;
import server.service.impl.UserServiceImpl;
import server.utils.WebUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/userServlet")
public class UserServlet extends BaseServlet {
private UserService userService = new UserServiceImpl();
protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取客户端的请求
User user = WebUtils.copyParamToBean(req.getParameterMap(),new User());
//2.用户登录
User loginUser = userService.login(user);
if(loginUser == null){
//登录失败,跳回登录页面
req.setAttribute("msg","用户名或密码错误!");
req.setAttribute("username",user.getUsername());
req.getRequestDispatcher("pages/user/login.jsp").forward(req,resp);
}else{
//登录成功,跳到首页index.jsp
req.getRequestDispatcher("index.jsp").forward(req,resp);
}
}
protected void regist(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取客户端的请求
User user = WebUtils.copyParamToBean(req.getParameterMap(),new User());
//2.用户注册
if(userService.existUsername(user.getUsername())){
req.setAttribute("msg","用户名已存在");
req.setAttribute("username",user.getUsername());
req.setAttribute("email",user.getEmail());
req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp); //跳转到注册页面
}else{
userService.registUser(user);
req.getRequestDispatcher("index.jsp").forward(req,resp); //跳转到注册成功页面
}
}
}