JSP 内置对象、指令与动作
最后更新于 2017-08-11 11:07:00
JSP 全称为 Java Server Page,即 Java 服务器页面,基于简化的 Servlet 设计,是一种建立动态网页的技术标准。JSP 有九个内置对象,可以不加声明和创建就可以在 JSP 页面脚本中直接使用,同时还提供了动作与指令元素,为开发提供了极大地便利。
内置对象
内置对象(built-in object)是 JSP 技术自有的,供开发者在 JSP 页面中直接使用,简化开发过程,提高效率。JSP 提供了九个内置对象:
-
out
javax.servlet.jsp.JspWriter,客户端输出。
-
request
javax.servlet.http.HttpServletRequest,请求信息。
-
response
javax.servlet.http.HttpServletResponse,响应信息。
-
session
javax.servlet.http.HttpSession,会话管理。
-
application
javax.servlet.ServletContext,全局应用管理。
-
pageContext
javax.servlet.jsp.PageContext,代表 JSP 上下文。
-
config
javax.servlet.ServletConfig,服务器配置信息。
-
page
java.lang.Object,代表 JSP 自身,类似 this。
-
exception
java.lang.Throwable,页面异常信息。
接下来,将对 JSP 的内置对象进行详细的了解,其中有五个较为常用,需着重理解。
out
out 对象是 JspWriter 类的实例,常用来向客户端页面输出信息,并且管理应用服务器上的输出缓冲 区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
- void println() 向客户端打印字符串
- void clear() 清除缓冲区内容,需在 flush() 之前调用
- void clearBuffer() 清除缓冲区内容
- void flush() 将缓冲区内容输出到客户端
- int getBufferSize() 返回缓冲区字节大小
- int getRemaining() 返回缓冲区剩余可用字节数
- boolean isAutoFlush() 返回缓冲区满时,自动清空还是抛出异常
- void close() 关闭输出流
缓冲区:Buffer,一块用来保存临时数据的内存区域。
request
request 对象是 HttpServletRequest 类的实例,封装了客户端的请求信息,主要用于接受通过 HTTP 协议传送到服务器的数据(包括头信息、系统信息、请求方式以及请求参数等)。其作用域为请求的全过程,在服务器完成响应该请求之前均有效。
- String getParameter(String name) 返回 name 指定参数的值
- String[] getParameterValues(String name) 返回包含参数 name 的所有值的数组
- void setAttribute(String key, Object value) 存储此请求中的属性
- object getAttribute(String key) 返回指定属性的属性值
- String getContentType() 得到请求的 MIME 类型
- String getProtocol() 返回请求用的协议类型及版本号
- String getServerName() 返回接受请求的服务器主机名
- void setCharacterEncoding(String name) 设置客户端的字符集编码
使用表单提交数据时,会发生中文乱码问题,如果使用的 是 Post 提交方式,可以在请求页面使用 setCharacterEncoding()
将字符集编码设置为与提交页面一致即可,推荐 utf-8。如果使用的是 URL 传参,也就是 Get 提交方式时,需在服务器配置页面进行设置。
Get 与 Post
Get 方法是以明文的方式通过 URL 提交数据,最多不超过 2KB,安全性较低,但效率高。而 Post 方法则是将提交的信息封装到 HTML Header 内,适合提交数据量大,且安全性较高的信息。
response
response 对象是 HttpServletResponse 类的实例,包含了响应客户端请求的信息。其作用域为整个 Jsp 页面,其它页面无效。
- String getCharacterEncoding() 返回响应用的字符集编码
- void setContentType(String type) 设置响应的 MIME 类型
- PrintWriter getWriter() 返回可以向客户端输出字符的对象
- sendRedirect(String location) 重定向客户端的请求
需要注意的是,通过 getWriter()
得到的 PrintWriter
对象与内置 out
对象均可以向客户端输出字符,但前者总是早于后者输出;这其实是因为 out 对象会将内容先暂存在缓冲区,使用 flush()
方法则可以将其提前输出到客户端。
请求重定向与请求转发
请求重定向,由response.sendRedirect()
实现,从本质上讲等同于客户端发送了两次请求,第一次的请求信息会丢失,地址栏 URL 会改变,属于客户端行为。请求转发,由request.getRequestDispatcher().forward(req, resp)
实现,从本质上讲客户端只发送了一次请求,请求信息 会保存,地址栏的 URL 不会改变,属于服务器端行为。
session
session 对象是 HttpSession 类的实例,代表客户端与服务器的一次会话,是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个 session 对象,用于保存该用户的信息,跟踪用户的操作状态。
- long getCreationTime() 返回 session 创建的时间
- public String getId() 返回 session 的 ID
- public Object setAttribute(String name, Object value) 使用指定名称将对象绑定到此会话
- public Object getAttribute(String name) 返回绑定到此会话的特定对象,没有则为 null
- String[] getValueNames() 返回一个包含次 session 所有可用属性的数组
- int getMaxInactiveInterval() 返回此 session 两次请求之间的超时时限
- void setMaxInactiveInterval() 设置此 session 两次请求之间的超时时限
从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。只要当前所有的页面没有全部关闭,此会话在未超时前仍然是有效的;如果当前所有页面全都关闭之后,此会话将会失效。
application
application 对象是 ServletContext 类的实例,实现了用户间的数据共享,可存放全局变量。在服务启动时,该对象实例化,直到服务器关闭之前该对象均是有效可用的。
- public void setAttribute(String name, Object value) 设置保存一个属性
- public Object getAttribute(String name) 获取指定属性的值
- Enumeration getAttributeNames() 返回所有属性名的枚举
- String getServerInfo() 返回 JSP(Servlet)引擎名及版本号
page
page 对象是 java.lang.Object 类的实例,指向当前 JSP 页面,类似于 this 指针。
- class getClass() 返回此 Object 的类
- int hashCode() 返回此 Object 的 hash 码
- boolean equals(Object obj) 判断此 Object 与指定的对象是否相等
- void copy(Object obj) 把此 Object 拷贝到指定对象中
- Object clone() 克隆此 Object 对象
- String toString() 把此 Object 转换成 String 类的对象
- void notify() 唤醒一个等待的线程
- void notifyAll() 唤醒所有等待的线程
- void wait(int timeout) 使一个线程处于等待直到 timeout 结束或被唤醒
- void wait() 使一个线程处于等待直到被唤醒
pageContext
pageContext 对象是 pageContext 类的实例,提供了对 JSP 页面内所有的对象及名字空间的访问。
- JspWriter getOut() 返回当前客户端响应被使用的 JspWriter 流(out)
- ServletRequest getRequest() 返回当前页的 ServletRequest 对象(request)
- ServletResponse getResponse() 返回当前页的 ServletResponse 对象(response)
- HttpSession getSession() 返回当前页中的 HttpSession 对象(session)
- ServletContext getServletContext() 返回当前页的 ServletContext 对象(application)
- Object getPage() 返回当前页的 Object 对象(page)
- ServletConfig getServletConfig() 返回当前页的 ServletConfig 对象(config)
- Exception getException() 返回当前页的 Exception 对象(exception)
- void setAttribute(String name, Object obj, int scope) 在指定范围内设置属性及属性值
- public Object getAttribute(String name) 取得指定属性的值
- Object getAttribute(String name, int scope) 在指定范围内取属性的值
- int getAttributeScope(String name) 返回某属性的作用范围
- void forward(String relativeUrlPath) 使当前页面重导到另一页面
- void include(String relativeUrlPath) 在当前位置包含另一文件
config
config 对象是 ServletConfig 类的实例,是在一个 Servlet 初始化时,JSP 引擎向它传递信息用的。
- ServletContext getServletContext() 返回含有服务器相关信息的 ServletContext 对象
- String getInitParameter(String name) 返回初始化参数的值
- Enumeration getInitParameterNames() 返回 Servlet 初始化所需所有参数的枚举
exception
exception 对象是 java.lang.Throwable 类的实例,是页面中异常对象。如果 JSP 页面要使用此对象,就必须设置 isErrorPage="true"
,否则无法编译。如果在 JSP 页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在 page 指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
- String getMessage() 返回描述异常的信息
- String toString() 返回关于异常的简短描述消息
- void printStackTrace() 显示异常及其栈轨迹
- Throwable fillInStackTrace() 重写异常的执行栈轨迹
指令
JSP 指令用来设置整个页面相关的属性,如网页的编码方式和所使用的脚本语言。JSP 内置了三大指令,下面就来一一介绍:
Page
Page 指令为容器提供当前页面的使用说明,如使用的脚本语言和所需要引入的类等,一个 JSP 页面可以包含多个 page 指令。其语法格式如下:
<%@ page attribute="" %>
page 指令的常用属性有以下:
-
language
指定页面所使用的脚本语言,默认为 Java
-
contentType
指定页面的 MIME 类型和字符编码
-
import
导入要使用的 Java 类
-
isErrorPage
指定当前页面是否可以作为另一个页面的错误处理页
Include
Include 指令用来在当前 JSP 页面包含其它文件,JSP、HTML、文本文件均可以。被包含的文件会在当前 JSP 页面编译期间执行,最终只转换成一个 Servlet,编译效率较低,但执行很快,可以称之为静态包含。语法格式如下:
<%@ include file="文件的相对 url 地址" %>
Taglib
Taglib 指令是为了让用户可以引入自定义的标签库,其语法格式如下:
<%@ taglib uri="库文件的 uri 地址" prefix="标签库前缀" %>
动作
JSP 动作元素是在请求阶段执行的,利用其可以动态的插入文件、重用 JavaBean 组件、页面重定向等。JSP 提供了多个动作元素,且每个动作元素都两个常用的属性,下面来看看:
-
动作元素常见的共有属性
-
id
动作元素的唯一标识,可以在 JSP 页面中通过 PageContext 来引用。
-
scope
用于定义动作元素的作用域范围,其取值可能为:page、request、session、application。
-
include
include 动作元素的作用与 Include 指令一样,可以将 JSP、HTML、文本文件包含到当前页面中,不同的是后者在页面编译期间就将文件包含进去,生成一个 Servlet,而 include 动作则是在请求阶段才将文件包含到当前页面中,最终将会生成两个 Servlet,编译效率高,但执行较慢,可以称之为动态包含。其语法格式如下:
<jsp:include page="文件相对 url 地址" flush="是否刷新缓冲区" />
useBean
useBean 动作用来加载一个将在 JSP 页面中使用的 JavaBean,它使得我们可以发挥 Java 组件复用的优势。其语法格式为:
<jsp:useBean id="对象name" class="包含包名的完整类路径" />
其等价为:
Object obj = new Object();
setProperty
setProperty 动作用来设置已经实例化的 Bean 对象的属性,其语法格式如下:
<!-- 手动指定属性值 -->
<jsp:setProperty name="对象name" property="属性名" value="属性值" />
<!-- 与请求参数匹配 -->
<jsp:setProperty name="对象name" property="属性名" param="参数名" />
需要注意的是,以上两种方式只能选择一种,不能同时出现 value
和 param
属性。如果 setProperty 动作作为 useBean 动作元素的子元素,只有在实例化一个新的 Bean 时才有效 ,引用已存在的 Bean 实例是无效的。
getProperty
getProperty 动作用来获取已经实例化的 Bean 对象的属性,其语法格式如下:
<jsp:getProperty name="对象name" property="属性名" />
forward
forward 动作用来将请求转发到另一个页面,其本质为请求转发,而不是请求重定向。其语法格式为:
<jsp:forward page="相对URL" />
其等价为:
request.getRequestDispatcher("URL").forward(request, response);
param
param 动作元素是用来传递属性的,常作为 forward 动作元素的子元素存在。示例如下:
<jsp:forward page="相对URL">
<jsp:param value="属性值" name="属性名" />
</jsp:forward>
传递的参数值可以使用 request.getParameter(name)
获取,也可以覆盖掉已有参数的值。