JSP使用脚本元素作为一种简易方法在模板数据中嵌入java代码,这些脚本元素在JSP翻译成Servlet的阶段,都被转化为Servlet中的java代码。
JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。
JSP翻译成Servlet代码都存在有:
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException { PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
......
}
在上面的代码中就存在九个隐式对象
对象名 |
描述 |
作用域 |
request |
代表与请求相关的HttpServletRequest对象 |
request |
response |
代表与响应相关的HttpServletResponse对象 |
page |
pageContext |
代表封装请求某个JSP页面时请求环境的pageContext对象 |
page |
session |
代表特定用户请求会话的HttpSession对象。该对象只有在JSP页面参与一个HTTP会话时才有意义 |
session |
application |
代表Web应用程序的ServletContext对象 |
application |
out |
代表与响应输出流相关的JspWriter对象 |
page |
config |
代表JSP 页面的Servlet相关的ServletConfig对象 |
page |
page |
等于Java编程语言中的this变量 |
page |
exception |
代表JSP页面抛出的Trowable对象。这个对象只能在JSP错误页面中使用 |
page |
request,response,session,application,config这些对象之前都讲过了的。还有out , page,pageContext没讲过!下面就主要介绍着三个对象。
一 out 对象
out对象是javax.servlet.jsp.JspWriter的实例,用于发送内容到响应中。JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小。
只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
- 设置page指令的buffer属性关闭了out对象的缓存功能
- out对象的缓冲区已满
- 整个JSP页面结束
out对象的使用方法,只要简单的调用out.print()或者out.println()方法即可。
out对象的其他方法:
abstract void |
clear()
Clear the contents of the buffer.
|
abstract void |
clearBuffer()
Clears the current contents of the buffer.
|
abstract void |
close()
Close the stream, flushing it first.
|
abstract void |
flush()
Flush the stream.
|
int |
getBufferSize()
This method returns the size of the buffer used by the JspWriter.
|
abstract int |
getRemaining()
This method returns the number of unused bytes in the buffer.
|
boolean |
isAutoFlush()
This method indicates whether the JspWriter is autoFlushing.
|
示例:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>out隐式对象演示</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head> <body>
<%out.print("演示out隐式对象方法的使用"); %><br/>
<%int getBufferSize=out.getBufferSize();
int getRemaining=out.getRemaining();
out.print("当前缓冲区的大小:"+getBufferSize+"<br/>");
out.print("当前可使用的缓冲区大小:"+getRemaining+"<br/>");
/* out.clear();
out.close(); */
%>
</body>
</html>
显示结果:
二 page 对象
page对象表示当前一个JSP页面,可以理解为一个对象本身,即:把一个JSP当作一个对象来看待。page对象在开发中几乎不用。
三 PageContext 对象
PageContext 是javax.servlet.jsp.PageContext 的实例。pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象(容器),可以用来保存数据。他有三个主要的功能
3.1 用它可以存取其他的隐式对象;
3.2 用它可以对四个作用域空间进行数据的存取;
3.3 可以用它进行页面的转发和包含。
PageContext 对象中用于存取其他隐式对象的方法:
abstract Exception |
getException()
The current value of the exception object (an Exception).
|
abstract Object |
getPage()
The current value of the page object (In a Servlet environment, this is an instance of javax.servlet.Servlet).
|
abstract ServletRequest |
getRequest()
The current value of the request object (a ServletRequest).
|
abstract ServletResponse |
getResponse()
The current value of the response object (a ServletResponse).
|
abstract ServletConfig |
getServletConfig()
The ServletConfig instance.
|
abstract ServletContext |
getServletContext()
The ServletContext instance.
|
abstract HttpSession |
getSession()
The current value of the session object (an HttpSession).
|
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)
PageContext 类提供了四个常量,用来表示四个作用域的范围:
1 PAGE_SCOPE 表示存储在PageContext 对象中,只在当前页面有效。
2 REQUEST_SCOPE 表示存储在request对象中,在request作用域有效。
3 SESSION_SCOPE 表示存储在session对象中,在session作用域有效。
4 APPLICATION_SCOPE 表示存储在application对象中,在application作用域有效。
PageContext引入和跳转到其他资源
PageContext类中定义了一个forward方法(用来跳转页面)和两个include方法(用来引入页面)来分别简化和替代RequestDispatcher.forward方法和include方法。
方法接收的资源如果以“/”开头, “/”代表当前web应用。