熟练掌握JSP常用内置对象

Posted 一宿君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了熟练掌握JSP常用内置对象相关的知识,希望对你有一定的参考价值。

学习目标(常用九大内置对象)

  • out
  • request
  • response
  • page
  • session
  • application
  • pageContext
  • config
  • exception

1、什么是JSP内置对象

  • JSP内置对象是Web容器创建的一组对象,在JSP页面中不需要new就可以直接使用。

1.1、out对象

  • 在网页中输出文本语法:
    <%="文本内容1<br/>"%>  #表达式输出
    <%  out.print("文本内容2<br/>");  %>  #out对象
    <%  out.println("文本内容3<br/>");  %> #out对象
    
    在这里插入图片描述
  • out对象是向用户输出内容最常用的内置对象
  • out对象常用方法:
    在这里插入图片描述
  • 常用方法的使用:
    out.println(out.getRemaining());
    out.println(out.isAutoFlush());
    out.println("<br>调用clearBuffer前");
    out.flush();
    out.clearBuffer();
    out.println("<br>调用clearBuffer后");
    out.println("<br>调用clear前");
    out.flush();
    out.clear();//此时发生错误
    out.println("<br>调用clear后");
    out.flush();
    
  • out对象缓冲区自动刷新设置
    <%@ page language="java" import="java.util.*,java.text.*" 
    pageEncoding="utf-8" autoFlush="true"%> #此处的autoFlush代表自动输出缓冲池内容
    
    <%
        out.clearBuffer();
        for(int i=0;i<8174;i++){
            out.print("a");
        }
        out.print("<br>");
        out.print("缓冲区大小:"+out.getBufferSize());
        out.print("<br>");
        out.print("缓冲区剩余:"+out.getRemaining());
    %>
    
  • out对象的close方法
    <%
        out.println("<br>调用close前");
        out.close();
        out.println("<br>调用close后");
        out.flush();
    %>
    

1.2、request对象

  • request对象主要用于处理客户端请求
    在这里插入图片描述

  • request对象常用方法:
    在这里插入图片描述

  • 将页面中的动态信息提交给服务器,封装客户端的请求信息

  • 有如下登录页面表单login.jsp

    <div class="box">
                <h1>欢迎回到易买网</h1>
                <form id="loginForm" method="post" action="UserServlet" onsubmit="return checkForm(this)">
                    <table>
                        //此处是一个隐式输入框,用于传递参数op
                        <input type="hidden" name="op" value="login"/>
                        <tr>
                            <td class="field">用户名:</td>
                            <td><input class="text" type="text" name="userName" onfocus="FocusItem(this)"
                                       onblur="CheckItem(this);"/><span></span></td>
                        </tr>
                        <tr>
                            <td class="field">登录密码:</td>
                            <td><input class="text" type="password" id="passWord" name="passWord" onfocus="FocusItem(this)"
                                       onblur="CheckItem(this);"/><span></span></td>
                        </tr>
                        <tr>
                            <td class="field">验证码:</td>
                            <td><input class="text verycode" type="text" name="veryCode" onfocus="FocusItem(this)"
                                       onblur="CheckItem(this);"/><img id="veryCode" src="checkCode" onclick="changeCheckCode(this)"/><span></span>
                            </td>
    
                        </tr>
                        <tr>
                            <td></td>
                            <td>
                                <label class="ui-green"><input type="submit" name="submit" value="立即登录"/></label>
                                <label><a href="forgetPassword.jsp">忘记密码?</a></label>
                                <label style="width:180px;text-align:right;color:red;font-size: 18px;"> ${requestScope.ERRORS}</label>
                            </td>
                        </tr>
                    </table>
                </form>
     </div>
    

    在这里插入图片描述

  • servlet服务程序端

    /**
     * @author 一宿君(CSDN : qq_52596258)
     * @date 2021-05-25 07:04:03
     */
    @WebServlet("/UserServlet")
    public class UserServlet extends HttpServlet {
        UserService userService = new UserServiceImpl();
    
        /**
         * 登录
         *
         * @param req
         * @param resp
         */
        public void login(HttpServletRequest req, HttpServletResponse resp) {
            try {
    
                //请求转发
                req.getRequestDispatcher("HelloWorld.jsp?id=1001&name=zhangsan").forward(req,resp);
    
            }catch (Exception ex){
                ex.printStackTrace();
            }
        }
       @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.setContentType("text/html;charset=utf-8");
            String op = req.getParameter("op");
            switch (op){
                case "register":
                    register(req,resp);
                    break;
                case "login":
                    login(req,resp);
                    break;
                case "forgetPassword":
                    forgetPassword(req,resp);
                    break;
                case "showUpdatePwdPage":
                    showUpdatePwdPage(req,resp);
                    break;
                case "updatePwd":
                    updatePwd(req,resp);
                    break;
            }
        }
    }
    
    
  • HelloWorld.jsp接收页面

    <%--
      Created by IntelliJ IDEA.
      User: wang'bo'shi
      Date: 2021/5/28
      Time: 10:49
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    
    <%
        String userName = request.getParameter("userName");
        out.print("用户名:" + userName);
        String password = request.getParameter("passWord");
        out.print("<br>密码:" + password);
    %>
    
    
    <br>提交方式: <%=request.getMethod() %><br>
    请求的URL地址: <%=request.getRequestURI() %><br>
    协议名称: <%=request.getProtocol() %><br>
    客户端请求服务器文件的路径: <%=request.getServletPath() %><br>
    URL的查询部分: <%=request.getQueryString() %><br>
    服务器的名称: <%=request.getServerName() %><br>
    服务器口号: <%=request.getServerPort() %><br>
    远程客户端的IP地址: <%=request.getRemoteAddr()%><br>
    获得发出请求的客户端地址: <%=request.getRequestURI()%><br>
    
    
    </body>
    </html>
    

    在这里插入图片描述

1.3、请求转发与重定向的区别

1.3.1、请求转发

  • 请求转发(依然从上述login.jsp页面提交請求到UserServlet中的login)
    	/**
         * 登录
         *
         * @param req
         * @param resp
         */
        public void login(HttpServletRequest req, HttpServletResponse resp) {
            /**
    		 * 请求转发:
    		 * 1、是Web服务器的一次内部行为
    		 * 2、请求地址栏到达servlet层不会改变
    		 * 3、request.setAttribute("userId",userId),可以在请求转发到的页面中通过request.getAttribute("userId");
    		 * 4、页面之跳转一次request还是同一个
    		 */
    		 req.setAttribute("userId","1001");
    		 req.getRequestDispatcher("HelloWorld.jsp").forward(req,resp);
        }
    
  • HelloWorld.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    
    <%--此处的request跟UserServlet中的是同一个request--%>
    userId:<%=request.getAttribute("userId")%>
    
    <br>
    <br>提交方式: <%=request.getMethod() %><br>
    请求的URL地址: <%=request.getRequestURI() %><br>
    协议名称: <%=request.getProtocol() %><br>
    客户端请求服务器文件的路径: <%=request.getServletPath() %><br>
    URL的查询部分: <%=request.getQueryString() %><br>
    服务器的名称: <%=request.getServerName() %><br>
    服务器口号: <%=request.getServerPort() %><br>
    远程客户端的IP地址: <%=request.getRemoteAddr()%><br>
    获得发出请求的客户端地址: <%=request.getRequestURI()%><br>
    
    </body>
    </html>
    
    在这里插入图片描述

1.3.2、重定向

  • 请求转发(依然从上述login.jsp页面提交請求到UserServlet中的login)
    	/**
         * 重定向
         * 1、请求地址栏会发生改变
         * 2、在重定向到的页面中无法使用request.getAttribute("");
         * 3、页面跳转了两次(先请求到servlet,再跳转到重定向页面)
         */
         req.setAttribute("userId","1001");
         resp.sendRedirect("HelloWorld.jsp");
        }
    
  • HelloWorld.jsp(有新注释)
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    
    <%--注意:
      --此处的request跟UserServlet中的不是同一个request了
      --刚问不到UserServlet中的userId了
    --%>
    userId:<%=request.getAttribute("userId")%>
    
    <br>
    <br>提交方式: <%=request.getMethod() %><br>
    请求的URL地址: <%=request.getRequestURI() %><br>
    协议名称: <%=request.getProtocol() %><br>
    客户端请求服务器文件的路径: <%=request.getServletPath() %><br>
    URL的查询部分: <%=request.getQueryString() %><br>
    服务器的名称: <%=request.getServerName() %><br>
    服务器口号: <%=request.getServerPort() %><br>
    远程客户端的IP地址: <%=request.getRemoteAddr()%><br>
    获得发出请求的客户端地址: <%=request.getRequestURI()%><br>
    
    </body>
    </html>
    
    在这里插入图片描述

1.4、getParameterMap()获取所有可用参数的枚举

  • 同样是在上述UserServlet的login中
    	/**
         * 登录
         *
         * @param req
         * @param resp
         */
        public void login(HttpServletRequest req, HttpServletResponse resp) {
            try {
    
                /**
                 * 获取表单中的所有name参数map集合
                 */
                Map<String,String[]> map = req.getParameterMap();
                Set<String> stringSet = map.keySet();
                for(String key:stringSet){
                    System.out.println(key + ":" + req.getParameter(key));
                }
    
                //请求转发
                req.getRequestDispatcher("HelloWorld.jsp?id=1001&name=zhangsan").forward(req,resp);
    
            }catch (Exception ex){
                ex.printStackTrace();
            }
        }
    
  • 控制台输出
    在这里插入图片描述

1.5、response对象

  • response对象用于响应客户请求并向客户端返回信息
    在这里插入图片描述
  • response对象常用方法:
    在这里插入图片描述

1.5.1、response对象设置响应数据类型