登录功能实现-页面中错误提示

涉及的技术知识点

  1. 请求重定向
  2. 请求转发
  3. jsp页面
  4. EL表达式
  5. 登录失败提示效果实现

请求重定向sendRedirect

  1. Servlet接收到浏览器端请求并处理完成后,给浏览器端一个特殊的响应,这个特殊的响应要求浏览器去请求一个新的资源,整个过程中浏览器端会发出两次请求,且浏览器地址栏会改变为新资源的地址。

  2. 重定向的情况下,原Servlet和目标资源之间就不能共享请求域数据了

  3. 实现重定向的API

在这里插入图片描述

​ 服务器会给浏览器发送一个302状态码以及一个新的地址。

请求转发getRequestDispatcher

  1. Servlet接收到浏览器端请求后,进行一定的处理,先不进行响应,而是在服务器端内部“转发”给其他Servlet程序继续处理。在这种情况下浏览器端只发出了一次请求,浏览器地址栏不会发生变化,用户也感知不到请求被转发了。

  2. 转发请求的Servlet和目标Servlet共享同一个request对象。

  3. 实现转发的API

在这里插入图片描述

重定向与转发的区别

转发重定向
浏览器地址栏不改变改变
发送请求次数12
能否共享request对象数据
目标资源:WEB-INF下的资源能访问不能访问
Request中绑定的数据是否可以传递不能

JSP页面

  1. JSP全称Java Server Pages,顾名思义就是运行在java服务器中的页面,也就是在我们JavaWeb中的动态页面,其本质就是一个Servlet。

  2. 其本身是一个动态网页技术标准,它的主要构成有HTML网页代码、Java代码片段、JSP标签几部分组成,后缀是.jsp

  3. 相比于Servlet,JSP更加善于处理显示页面,而Servlet跟擅长处理业务逻辑,两种技术各有专长,所以一般我们会将Servlet和JSP结合使用,Servlet负责业务,JSP负责显示。

  4. 一般情况下, 都是Servlet处理完的数据,转发到JSP,JSP负责显示数据的工作。

  5. Jsp页面的执行原理:

    Jsp本质上就是一个servlet,执行的时候会先转化成一个.java文件,在编译成.class文件。

    如何转化:java代码片段照搬

    html、css、js表达式通过输出流out.write()方法往出写。

  6. Jsp作用:

    可以自动的将html相关的代码通过流写到浏览器端。

    支持写java代码,可以灵活的做出一些处理。

  7. JSP的基本语法:

    <%--
      Created by IntelliJ IDEA.
      User: kuber
      Date: 2020/10/26
      Time: 22:14
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登录</title>
        <meta charset="UTF-8">
        <style>
            body{
                background-color:pink;
            }
            span{
                color:red;
            }
    
        </style>
        <script>
            function clear_msg(){
                var ele = document.getElementById("loginErr_msg");
                ele.innerHTML = "";
            }
        </script>
    </head>
    <!--<body bgcolor="pink"> -->
    <body bgcolor="pink">
    <h1>欢迎登录</h1>
    <form action="login" method="post">
        用户名称 :<input type="text" name="username" οnfοcus="clear_msg();"/>
        <span id="loginErr_msg" >${requestScope.loginError_msg}</span>
        <%--<%
            String loginMsg = (String) request.getAttribute("loginError_msg");
        %>
        <span><%=loginMsg==null?"":loginMsg%></span>--%>
        <br/>
        用户密码 :<input type="password" name="password"/>
        <br/>
        <input type="submit" value="Login"/>
    
    </form>
    </body>
    
    </html>
    
    
  8. JSP的脚本元素

    脚本片段是嵌入到JSP中Java代码段,格式以<%开头,%>结尾,两个%号之间就可以编写Java代码了

    在这里插入图片描述

  9. JSP的表达式

    JSP表达式用来直接将Java变量输出到页面中,格式以<%=开头,以%>结尾,中间是我们要输出的内容

    在这里插入图片描述

  10. JSP的隐含对象

    1. out(JspWriter):相当于response.getWriter()获取的对象,用于在页面中显示信息。
    2. config(ServletConfig):对应Servlet中的ServletConfig对象。
    3. page(Object):对应当前Servlet对象,实际上就是this。
    4. pageContext(PageContext):当前页面的上下文,也是一个域对象。
    5. exception(Throwable):错误页面中异常对象
    6. request(HttpServletRequest):HttpServletRequest对象
    7. response(HttpServletResponse):HttpServletResponse对象
    8. application(ServletContext):ServletContext对象
    9. session(HttpSession):HttpSession对象

    1,6,7,8,9常用,要记住。

  11. EL表达式

    1. EL是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作。EL在得到某个数据时,会自动进行数据类型的转换。

    2. EL表达式用于代替JSP表达式(<%= %>)在页面中做输出操作。

    3. EL表达式仅仅用来读取数据,而不能对数据进行修改。

    4. 使用EL表达式输出数据时,如果有则输出数据,如果为null则什么也不输出。

    5. EL表达式的语法:

    在这里插入图片描述

    1. EL取值的四个域:

      pageScope

      requestScope

      sessionScope

      applicationScope

    2. 使用el表达式主要用于取值。

页面中错误提示的功能效果

实现的功能是,用户在提交登陆后,服务器端会判断用户密码是否正确,若不正确,随后浏览器端刷新页面,给出提示。

在这里插入图片描述

/*
* 处理登录请求的servlet
* */
public class LoginServlet 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 IOException, ServletException {
        System.out.println("登录请求过来了...");

        req.setCharacterEncoding("utf-8");/*一定要在获取之前加*/
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("账号为"+username);
        System.out.println("密码为"+password);

        resp.setContentType("text/html;charset=utf-8");/*一定要在获取流之前加*/
        PrintWriter out = resp.getWriter();
        UserDao userDao = new UserDaoImpl();
        User user = userDao.getUserByUsernameAndPassword(username, password);

        if(user == null){
            /*out.println("<h1><font color='red'>Login Fail登陆失败</font></h1>");*/
            /*通过重定向的方式前往登录页面
            * 服务器会给浏览器发送一个302状态码以及一个新的地址
            * 也就是说客户端会有2次请求
            * */
            //resp.sendRedirect("login.jsp");
            /*转发实现错误界面的跳转*/
            req.setAttribute("loginError_msg","用户名或者密码错误");
            RequestDispatcher rd = req.getRequestDispatcher("login.jsp");
            try {
                rd.forward(req,resp);
            } catch (ServletException e) {
                e.printStackTrace();
            }
        }else {
//            out.println("<h1><font color='blue'>Login Success登陆成功</font></h1>");
            /*通过session存储user*/
            HttpSession session = req.getSession();
            /*session.setAttribute("loginUser",user.getUsername());*/
            session.setAttribute("loginUser",user);
//            resp.sendRedirect("main.jsp");

            /*查询所有员工数据*/
//            ArrayList<Employee> objects = new ArrayList<>();
            EmployeeDaoImpl employeeDao = new EmployeeDaoImpl();
            List<Employee> emps = employeeDao.getEmployee();
            req.setAttribute("emps",emps);
            req.getRequestDispatcher("main.jsp").forward(req,resp);
        }
        /*if("Admin".equalsIgnoreCase(username) && "111111".equals(password)){
            out.println("<h1><font color='blue'>Login Success登陆成功</font></h1>");
        }else {
            out.println("<h1><font color='red'>Login Fail登陆失败</font></h1>");
        }*/
    }
}
<%--
  Created by IntelliJ IDEA.
  User: kuber
  Date: 2020/10/26
  Time: 22:14
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
    <meta charset="UTF-8">
    <style>
        body{
            background-color:pink;
        }
        span{
            color:red;
        }

    </style>
    <script>
        function clear_msg(){
            var ele = document.getElementById("loginErr_msg");
            ele.innerHTML = "";
        }
    </script>
</head>
<!--<body bgcolor="pink"> -->
<body bgcolor="pink">
<h1>欢迎登录</h1>
<form action="login" method="post">
    用户名称 :<input type="text" name="username" οnfοcus="clear_msg();"/>
    <span id="loginErr_msg" >${requestScope.loginError_msg}</span>
    <%--<%
        String loginMsg = (String) request.getAttribute("loginError_msg");
    %>
    <span><%=loginMsg==null?"":loginMsg%></span>--%>
    <br/>
    用户密码 :<input type="password" name="password"/>
    <br/>
    <input type="submit" value="Login"/>

</form>
</body>

</html>
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐