每个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.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<head>
<title>使用pageContext的forward方法跳转页面</title>
</head>
<%
//使用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页面,那么一般会使用<jsp:forward>标签
,<jsp:forward>标签用于把请求转发给另外一个资源。
使用pageContext的include方法引入资源
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<head>
<title>使用pageContext的include方法引入资源</title>
</head>
<%
pageContext.include("/jspfragments/head.jsp");
%>
使用pageContext的include方法引入资源
<%
pageContext.include("/jspfragments/foot.jsp");
%>
<hr/>
<%--
<jsp:include page="/jspfragments/head.jsp"/>
使用jsp:include标签引入资源
<jsp:include page="/jspfragments/foot.jsp"/>
--%>
运行结果:
注意:
在实际开发中,使用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应用中数据共享是有效的