JSP的内置对象

作者: 奋斗的老王 | 来源:发表于2016-09-12 11:45 被阅读99次

    Jsp的内置对象

    • 什么是内置对象: 在jsp开发中,会频繁使用到一些对象, 例如HttpSession, ServletContext, ServletContext, HttpServletRequet。如果我们每次要使用这些对象都去创建这些对象就显示非常麻烦。所以Sun公司设计Jsp时,在jsp页面加载完毕之后就会自动帮开发者创建好这些对象,而开发者只需要直接使用这些对象调用方法即可!这些创建好的对象就叫内置对象!
    • 举例:
      • servlet: HttpSession session = request.getSession(true); (需要开发者做)
      • jsp:
        • tomcat服务器: HttpSession session = request.getSession(true);(不需要开发者做)
        • 开发者做的: session.getId();

    JSP-9大内置对象(内置对象名 : 类型)

    • request : HttpServletRequest
    • response : HttpServletResponse
    • config : ServletConfig
    • application : ServletContext
    • session : HttpSession
    • exception : Throwable
    • page : Object(this)
    • out : JspWriter
    • pageContext : PageContext

    Out对象

    • out对象类型,JspWriter类,相当于带缓存的PrintWriter
      • PrintWriter.wrier(内容) : 直接向浏览器写出内容
      • JspWriter.writer(内容) : 向jsp缓冲区写出内容(默认8kb)
    • JSP页面缓冲机制 :
      • JspWriter首先写到JspWriter缓冲区, 然后当缓冲区满足下面4个条件时, 缓冲区的内容会向外写入PrintWriter到的对象当中,最后PrintWriter的write方法直接输送到浏览器中
      • 当满足以下条件之一,缓冲区内容写出:
        1)缓冲区满了 :
        2)刷新缓存区 : out.flush
        3)关闭缓存区 : buffer = "0kb"
        4)执行完毕jsp页面 :
    • 方法:
      • out.flush() : 刷新缓存
      • out.getRemaining : 查看缓冲区剩余大小
      • out.getBufferSize : 查看缓冲区大小
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8" buffer="1kb"%><%
            for(int i=1;i<=1024;i++){
                out.write("a");
            }
            //查看缓存区大小
            System.out.println("当前缓存区大小:"+out.getBufferSize());
            //查看缓存区剩余大小
            System.out.println("缓存区剩余大小:"+out.getRemaining());
            //刷新缓存
            //out.flush();
            response.getWriter().write("123");
         %>
      </body>
    </html>
    

    pageContext对象

    pageContext对象的类型是PageContext,叫jsp的上下文对象
    
    1. 可以从PageContext对象中获取其他8个内置对象
    • 使用场景: 在自定义标签的时候,PageContext对象频繁使用到!
      JspWriter out =pageContext.getOut();
      HttpServletRequest rquest = pageContext.getRequest();
    1. 本身是一个域对象
    • ServletContext : context域
    • HttpServletRequet : request域
    • HttpSession : session域
      Servlet中的域对象: ServletContext, HttpServletRequet, HttpSession
    • PageContext : page域 (jsp特有的)
      • 作用 : 保存数据和获取数据,用于共享数据

      • 保存数据
        1)默认情况下,保存到page域 : pageContext.setAttribute("name");
        2)可以向四个域对象保存数据 : pageContext.setAttribute("name",域范围常量)

      • 获取数据
        1)默认情况下,从page域获取 : pageContext.getAttribute("name")
        2)可以从四个域中获取数据 : pageContext.getAttribute("name",域范围常量)

        • 域范围常量:
          1. PageContext.PAGE_SCOPE
          2. PageContext.REQUEST_SCOPE
          3. PageContext..SESSION_SCOPE
          4. PageContext.APPLICATION_SCOPE

        3)自动在四个域中搜索数据: pageContext.findAttribute("name");

        顺序 : page域 -> request域 -> session域- > context域(application域)

    Jsp中的四个域对象 :

    1. 简介:
    • pageContext : page域
    • request : request域
    • session : session域
    • application : context域
    1. 域对象作用:保存数据和获取数据, 用于数据共享
    2. 域对象方法:
    • setAttribute("name",Object) : 保存数据
    • getAttribute("name") : 获取数据
    • removeAttribute("name") : 清除数据
    1. 域对象作用范围:
    • page域 : 只能在当前jsp页面中使用 (当前页面)
    • request域 : 只能在同一个请求中使用 (转发)
    • session域 : 只能在同一个会话 (session对象) 中使用 (私有的)
    • context域 : 只能在同一个web应用中使用(全局的)
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8" 
    isErrorPage="true" 
    session="true"
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head> 
        <title>pageContext对象</title>  
      </head>
      
      <body>
        从四个域中获取数据
        page域 :<% = pageContext.getAttribute("message",PageContext.PAGE_SCOPE) %><br/>
        request域 : <% = pageContext.getAttribute("message",PageContext.REQUEST_SCOPE) %><br/>
        session域 : <% = pageContext.getAttribute("message",PageContext.SESSION_SCOPE) %><br/>
        context域 : <% = pageContext.getAttribute("message",PageContext.APPLICATION_SCOPE) %><br/>
    
        <%
            //1)可以获取其他8个内置对象
            //response.getWriter().write("是否相等?"+(out==pageContext.getOut()) +"<br/>");
            //response.getWriter().write("是否相等?"+(session==pageContext.getSession()));
         %>
         
         <%--
            2)pageContext作为域对象使用
                    2.1 可以往不同域对象中存取数据
          --%>
          <%
            //保存数据。默认情况下,保存在page域中
            pageContext.setAttribute("message","page's message");
            pageContext.setAttribute("message","request's messsage",PageContext.REQUEST_SCOPE);//保存到request域中
            pageContext.setAttribute("message","session's messsage",PageContext.SESSION_SCOPE);//保存到sessio域中
            pageContext.setAttribute("message","application's messsage",PageContext.APPLICATION_SCOPE);//保存到context域中
            //request.setAttribute("message","request's message"); 等价于上面的代码
     
           %>
           
           <%
            //获取数据
            //String message = (String)pageContext.getAttribute("message");
            //out.write(message);
           
            %>
            <%--从request域中取出数据 --%>
            <%--
                  原则: 
                1)在哪个域中保存数据,就必须从哪个域取出数据!!!
             --%>
            <%=pageContext.getAttribute("message",PageContext.PAGE_SCOPE) %><br/>
            <%=pageContext.getAttribute("message",PageContext.REQUEST_SCOPE) %><br/>
            <%=pageContext.getAttribute("message",PageContext.SESSION_SCOPE) %><br/>
            <%=pageContext.getAttribute("message",PageContext.APPLICATION_SCOPE) %><br/>
            <hr/>
            <%--
                findAttribute(): 在四个域自动搜索数据
                    顺序: page域 -> request域  -> session域 -> context域
                    
             --%>
             <%=pageContext.findAttribute("message") %>
             <% //request.getAttribute("message") %><br/>
          
          <%
            //转发
            // request.getRequestDispatcher("/03.pageContext2.jsp").forward(request,response);
            //重定向
            response.sendRedirect(request.getContextPath()+"/03.pageContext2.jsp");
           %>
      </body>
    </html>
    

    相关文章

      网友评论

        本文标题:JSP的内置对象

        本文链接:https://www.haomeiwen.com/subject/slesettx.html