JavaWeb-JSP内置对象和域对象

每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。

由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。

JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。

JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用(不需要预先声明就可以在脚本代码和表达式中随意使用)。

9大内置对象

内置对象是在JSP页面中无需创建就可以直接使用的变量,在JSP中一共有9个

序号 内置对象 含义 类型 作用域
1 pageContext 页面上下文对象 javax.servlet.jsp.PageContext Page
2 request 请求对象 javax.servlet.http.HttpServletRequest Request
3 response 响应对象 javax.servlet.http.HttpServletResponse Page
4 session 会话对象 javax.servlet.http.HttpSession Session
5 application 应用程序对象 javax.servlet.ServletContext Application
6 config 配置对象 javax.servlet.ServletConfig Page
7 out 输出对象 javax.servlet.jsp.JspWriter Page
8 page 页面对象 java.lang.Object Page
9 exception 异常对象 java.lang.Throwable Page

内置对象说明

1.pageContext

“页面上下文”对象,代表的是当前页面运行的一些属性。
pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象(容器),可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。

通过pageContext获取其他对象:
  • getException方法返回exception隐式对象
  • getPage方法返回page隐式对象
  • getRequest方法返回request隐式对象
  • getResponse方法返回response隐式对象
  • getServletConfig方法返回config隐式对象
  • getServletContext方法返回application隐式对象
  • getSession方法返回session隐式对象
  • getOut方法返回out隐式对象

pageContext对象可以作为容器来使用,因此可以将一些数据存储在pageContext对象中。
pageContext对象的常用方法:

1 public void setAttribute(java.lang.String name,java.lang.Object value)
2 public java.lang.Object getAttribute(java.lang.String name)
3 public void removeAttribute(java.lang.String name)
4 public java.lang.Object findAttribute(java.lang.String name

重点介绍一下findAttribute方法,这个方法是用来查找各个域中的属性的,查看这个方法的API可以看到关于这个方法的描述:
  Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null.

当要查找某个属性时,findAttribute方法按照查找顺序"page→request→session→application"在这四个对象中去查找,只要找到了就返回属性值,如果四个对象都没有找到要查找的属性,则返回一个null。
范例:使用pageContext的findAttribute方法查找属性值
运行结果:


EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、 session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。

pageContext对象中封装了访问其它域的方法

1 public java.lang.Object getAttribute(java.lang.String name,int scope)
2 public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
3 public void removeAttribute(java.lang.String name,int scope)

代表各个域的常量有:

1 PageContext.APPLICATION_SCOPE
2 PageContext.SESSION_SCOPE
3 PageContext.REQUEST_SCOPE
4 PageContext.PAGE_SCOPE 
通过pageContext引入和跳转到其他的资源:

PageContext类中定义了一个forward方法(用来跳转页面)和两个include方法(用来引入页面)来分别简化和替代RequestDispatcher.forward方法和include方法。
方法接收的资源如果以“/”开头, “/”代表当前web应用。
1.范例:使用pageContext的forward方法跳转到其他页面

<%@page contentType="text/html;charset=UTF-8"%> 
<%@page import="java.util.*"%>


  使用pageContext的forward方法跳转页面

<%
    //使用pageContext的forward方法跳转到pageContextDemo05.jsp页面,/代表了当前的web应用
    pageContext.forward("/pageContextDemo05.jsp");
    //使用pageContext.forward(relativeUrlPath)替代RequestDispatcher.forward(relativeUrlPath)
    //使用RequestDispatcher的forward方法实现的跳转方式
    //pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);
%>

注意:
pageContext.forward("/pageContextDemo05.jsp");这种写法是用来简化和替代pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);这种写法的。在实际开发中,使用pageContext.forward(relativeUrlPath)方法跳转页面用得不多,主要是因为要在Jsp页面中嵌套java代码,所以这种做法简单了解一下即可,在开发中,要想从一个Jsp页面采用服务器端跳转的方式跳转到另一个Jsp页面,那么一般会使用标签标签用于把请求转发给另外一个资源。

使用pageContext的include方法引入资源
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>


    使用pageContext的include方法引入资源

<%
    pageContext.include("/jspfragments/head.jsp");
%>
使用pageContext的include方法引入资源
<%
    pageContext.include("/jspfragments/foot.jsp");
%>

<%-- 使用jsp:include标签引入资源 --%>

运行结果:


注意:
在实际开发中,使用pageContext的include方法引入页面这种做法也很少用,一般都使用jsp:include标签引入资源,因此这种做法了解一下即可。

2.request

request对象代表的是来自客户端的请求,例如我们在FORM表单中填写的信息等,封装了由WEB浏览器或其它客户端生成地HTTP请求的细节(参数,属性,头标和数据等),是最常用的对象。作用域为request(用户请求期)。
常用的方法有:getParameter、getParameterNames 和getParameterValues等,通过调用这几个方法来获取请求对象中所包含的参数的值,方法可查看API。
同时request也是一个域对象

3.response

response对象代表的是对客户端的响应,此对象封装了返回到HTTP客户端的输出,向页面作者提供设置响应头标和状 态码的方式。经常用来设置HTTP标题,添加cookie,设置响应内容的类型和状态,发送HTTP重定向和编码URL等。作用域为page(页面执行期)。
常用方法有:sendRedirect、setContentType、encodeRedirectURL、addHeader、addCookie、getWriter等

4.Session:

session对象代表服务器与客户端所建立的会话,当需要在不同的JSP页面中保留客户信息的情况下使用,比如在线购物、客户轨迹跟踪等。
“session” 对象建立在 cookie的基础上,所以使用时应注意判断一下客户端是否打开了cookie。注意:不要把cookie也理解为九大内置对象之一,cookie主要是实现了session的作用。
常用方法有:getAttribute、setAttribute、removeAttribute、setMaxInactiveInterval、getId、 getValue、 getValueNames和putValue等。

5. application

可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。

6.out

out 对象代表了向客户端发送数据的对象,与“response” 对象不同,通过“out” 对象发送的内容将是浏览器需要显示的内容,是文本一级的,可以通过“out” 对象直 接向客户端写一个由程序动态生成HTML文件。常用的方法除了pirnt和println之外,还包括clear、clearBuffer、flush、getBufferSize和getRemaining,这是因 为“out”对象内部包含了一个缓冲区,所以需要一些对缓冲区进行操作的方法。

7.config

取得服务器的配置信息。通过 pageConext对象的getServletConfig() 方法可以获取一个config对象。
常用的方法有:getInitParameter和getInitParameterNames,以获得Servlet初始化时的参数。

8.exception

代表了JSP文件运行时所产生的例外对象,此对象不能在一般JSP文件中直接使用,而只能在使用了page指令“<%@ page isErrorPage="true "%>”的JSP文件中使用
在一般的JSP页面中使用该对象将无法编译JSP文件。

9. page

“page” 对象代表了正在运行的由JSP文件产生的类对象,不建议一般读者使用。

四大域对象

9大内置对象中有4个是域对象:

  • pageContext
  • request
  • session
  • application
域对象的作用:

用于保存数据,获取数据,在不同资源之间共享数据。

域对象的方法:
setAttribute("name",Object) 保存数据
getAttribute("name")        获取数据
removeAttribute("name")     清除数据
四个域对象的作用范围:
  • page域: 处于同一个jsp页面中数据共享是有效的
  • request域:处于同一个请求中数据共享是有效的
  • session域:处于同一个会话中数据共享是有效的
  • application域:处于同一个web应用中数据共享是有效的

你可能感兴趣的:(JavaWeb-JSP内置对象和域对象)