项目学习 —— 注册和登录(2)

回显登录错误或注册错误信息

一. 将用户的操作写成一个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);  //跳转到注册成功页面
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值