JavaWeb学习(八)—案例:Servlet实现注册和登录页面的请求处理

本案例主要实现了以下功能:

1.首页点击注册跳转至注册页面,点击登录跳转至登陆页面。

2.注册页面提交表单验证,注册成功跳转至登录页面,注册失败提示错误信息,重定向至注册页面。

3.登陆页面提交表单验证,登陆成功跳转至用户信息页面,登录失败提示错误信息,重定向至登陆页面

4.用户信息页面动态读取用户数据,点击注销用户,销毁用户信息,跳转至首页。点击退出用户,跳转至首页。


首页index.jsp的主要处理:在a标签中嵌入EL表达式,使用pageContext获取request,再通过request获取contextPath,contextPath相当于项目发布的路径,如本页面发布在http://localhost:8080/ServletDemo04/下,通过字符串拼接,就可以获得完整的URL

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
    <style>
      div {
        margin: 0 auto;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <div>
      <p>
        <h1>ServletDemo03</h1>
      </p>
    </div>
    	<br>
    	<br>
    	<br>
    	<br>
    	<br>
    <div>
      <a href="${pageContext.request.contextPath}/register.jsp">注册新用户</a>
      <a href="${pageContext.request.contextPath}/login.jsp">用户登录</a>
    </div>

  </body>
</html>

首页效果如下:

java 登录成功返回用户角色权限 java注册成功返回登录界面_用户名

注册页面register.jsp的处理:使用表单注册验证,在action中依然通过获取contextPath拼接完整的URL;使用js实现错误提示窗

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册新用户</title>
    <script>
        //从servletContext中获取注册错误信息
        var error = '${pageContext.servletContext.getAttribute("RegisterError")}';
        if (error === 'pwd') {
            alert("两次输入密码不一致,请重新输入");//显示错误提示窗
        }
    </script>
</head>
<body>
    <h2>注册新用户</h2>
    <form action="${pageContext.request.contextPath}/r2" method="post">
        <p>
            用户名:<input type="text" name="username">
        </p>
        <p>
            设置密码:<input type="password" name="password1">
        </p>
        <p>
            确认密码:<input type="password" name="password2">
        </p>
        <p>
            请选择感兴趣的方向:<br/>
            <input type="checkbox" name="interest" value="Web前端">Web前端
            <input type="checkbox" name="interest" value="大数据">大数据
            <input type="checkbox" name="interest" value="人工智能">人工智能
            <input type="checkbox" name="interest" value="后台开发">后台开发
        </p>
        <p>
            <input type="submit" value="注册">
            <input type="reset" value="重新注册">
        </p>




    </form>
</body>
</html>

注册页面的效果图:

java 登录成功返回用户角色权限 java注册成功返回登录界面_html_02

通过注册页面提交用户注册信息后对应的处理程序如下:

public class RequestTest02 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");
        resp.setCharacterEncoding("utf-8");
        
        //获取一个ServletContext实现servlet的交互,用于传递用户名和密码
        ServletContext servletContext = this.getServletContext();

        //从前端获取请求信息
        String username = req.getParameter("username");
        String password1 = req.getParameter("password1");
        String password2 = req.getParameter("password2");
        String[] interests = req.getParameterValues("interest");
}
        //将注册信息存入servletContext中
        servletContext.setAttribute("username",username);
        servletContext.setAttribute("password",password1);
        servletContext.setAttribute("interest", Arrays.toString(interests));
       
    	//在控制台打印前端的请求信息,用于测试
        System.out.println("用户名:"+username);
        System.out.println("用户密码:"+password1);
        System.out.println("确认密码:"+password2);


        if (password1.equals(password2)){

            //如果注册时,两次密码输入一致,注册成功,跳转至登录页面
            
            // 重定向至登陆页面,客户端行为(服务器通知客户端请求另一个页面)
            //resp.sendRedirect("login.jsp");

            //转发请求:服务器行为(服务器转发请求至另一个页面)
            req.getRequestDispatcher("login.jsp").forward(req,resp);

        }else {
            
            //注册失败
            //为了提示错误信息,在servletContext中设置一个注册错误的属性,这个属性可以子啊jsp页面中获取该属性
            servletContext.setAttribute("RegisterError","pwd");
            //重定向至注册页面
            resp.sendRedirect("register.jsp");
        }
    }
}

注册成功会跳转至登陆页面,注册失败会有错误信息的弹窗提示:

java 登录成功返回用户角色权限 java注册成功返回登录界面_html_03

登录页面login.jsp的处理:这里依然采用了html的表单验证,action传递URL参数,js实现错误信息提示。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户登陆</title>
    <script>
        var error1 = '${pageContext.servletContext.getAttribute("LoginError")}';
        //这里的UserError本来是想标记用户在未注册情况下登录产生的错误提示,但是提示500错误,这个功能本代码暂未实现。
        var error2 = '${pageContext.servletContext.getAttribute("UserError")}';
        if (error1 === 'pwd') {
            alert("用户名或密码输入有误,请重新输入!");
        }
        if (error2 === 'NotExist') {
            alert("用户名不存在");
        }

    </script>
</head>
<body>
    <h2>用户登录</h2>
    <form action="${pageContext.request.contextPath}/r3" method="post">
        <p>
            用户名:<input type="text" name="username">
        </p>
        <p>
            密码:<input type="password" name="password">
        </p>
        <p>
            <input type="submit" value="登录">
        </p>
    </form>

</body>
</html>

登陆页面的效果:

java 登录成功返回用户角色权限 java注册成功返回登录界面_java 登录成功返回用户角色权限_04

通过登录页面用户信息后对应的处理程序如下:

public class RequestTest03 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 {

        //从前端获取请求信息
        String name = req.getParameter("username");
        String pwd = req.getParameter("password");

        //通过servletContext拿到注册成功的用户信息
        ServletContext servletContext = this.getServletContext();
        String username = (String) servletContext.getAttribute("username");
        String password = (String) servletContext.getAttribute("password");
        
        //判断用户是否存在
        if (username.equals(null)){
            //提示不存在该用户,重定向至首页
            //测试中,程序没有进入这段逻辑
            servletContext.setAttribute("UserError","NotExist");
            resp.sendRedirect("index.jsp");
        }
        //判断用户名和密码是否正确
        if (username.equals(name) && password.equals(pwd)){
            //用户名和密码输入正确,则跳转至用户信息页面
            req.getRequestDispatcher("useInfo.jsp").forward(req,resp);
        }else {
            //用户名和密码输入错误,重定向至登陆页面
            servletContext.setAttribute("LoginError","pwd");
            resp.sendRedirect("login.jsp");
        }
    }
}

登录失败的效果:先提示错误信息,点击确定会重定向至登录页面

java 登录成功返回用户角色权限 java注册成功返回登录界面_java 登录成功返回用户角色权限_05

登录成功会跳转至用户信息界面userInfo.jsp,该页面的处理主要包括从servletContext中获取用户的数据,并显示在页面中,这需要用到jsp的知识,这里使用了EL表达式,将动态的数据嵌入在页面中。除此之外,页面的最后需要完成注销用户和退出当前用户两个功能。退出用户只需将页面跳转至首页即可,通过a标签就可以实现。注销用户使要具体的程序实现。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>个人信息</title>
</head>
<body>
<h3>个人信息</h3>
    <ul>
        <li>
            <span>用户名:${pageContext.servletContext.getAttribute("username")}</span>
        </li>
        <li>
            <span>用户密码:${pageContext.servletContext.getAttribute("password")}</span>
        </li>
        <li>
            <span>感兴趣的方向:${pageContext.servletContext.getAttribute("interest")}</span>
        </li>
    </ul>

    <p>
        <a href="${pageContext.request.contextPath}/r4">注销当前用户</a>
        <a href="${pageContext.request.contextPath}/index.jsp">退出当前用户</a>
    </p>
</body>
</html>

用户信息页面的效果:

java 登录成功返回用户角色权限 java注册成功返回登录界面_xml_06

注销用户的处理程序:通过移除servletContext中的用户属性,达到注销的目的。

public class RequestTest04 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        servletContext.removeAttribute("username");
        servletContext.removeAttribute("password");
        servletContext.removeAttribute("interest");

        if (servletContext.getAttribute("username")==null){
            //用户信息被注销,回到首页
            resp.sendRedirect("index.jsp");

        }

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>RequestTest02</servlet-name>
        <servlet-class>com.hooi.demo01.RequestTest02</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>RequestTest03</servlet-name>
        <servlet-class>com.hooi.demo01.RequestTest03</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>RequestTest04</servlet-name>
        <servlet-class>com.hooi.demo01.RequestTest04</servlet-class>
    </servlet>


    <!--=======================================================================-->

    
    <servlet-mapping>
        <servlet-name>RequestTest02</servlet-name>
        <url-pattern>/r2</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>RequestTest03</servlet-name>
        <url-pattern>/r3</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>RequestTest04</servlet-name>
        <url-pattern>/r4</url-pattern>
    </servlet-mapping>
</web-app>