发表于: 2017-10-09 21:53:44
1 812
一、今日完成
今天准备小课堂,整理关于JSP内置对象的知识:
一、背景介绍
JSP 所包含的元素,包括JSP 注释、声明、表达式、程序段、JSP 指令(Directive Elements)、JSP 动作(Action Elements)以及JSP 异常处理。
JSP 的内置对象是指在JSP 页面系统中已经默认内置的Java 对象,这些对象不需要开发人员显式声明即可使用,也被称为隐式对象(Implicit Objects)或预定义变量(pre-defined variables)。
二、知识剖析
1.内置对象的作用范围(Scope)
指每个内置对象的某个实例在多长的时间和多大的范围内有效,即在什么样的范围内可以有效地访问同一个对象实例。在JSP 中,定义了四种作用范围,即:Application、Session、Page 和Request,它们代表了对象各自的“生命周期”。
(1)Application Scope :起始于服务器开始运行,application对象被创建之时;终止于服务器关闭之时。
(2)Session Scope :用户请求访问服务器时session 对象开始生效,用户断开退出时session 对象失效。
(3)Request Scope :在一个JSP 页面向另一个JSP 页面提出请求到请求完成之间,在完成请求后此范围即结束。(使用<jsp:forward>或者<jsp:include>实现在页面跳转中共享request 对象的数);
(4)Page Scope :仅限于获取本页的数据。
2.内置对象
(1)application 对象
application 对象的主要方法
方法 | 说明 |
Object getAttribute(String name) | 获取指定名字的application 对象的属性值。 |
Enumeration getAttributes() | 返回所有的application 属性。 |
ServletContext getContext( String uripath ) | 取得当前应用的ServletContext 对象。 |
String getInitParameter( String name ) | 返回由name 指定的application 属性的初始值。 |
Enumeration getInitParameters() | 返回所有的application 属性的初始值的集合。 |
int getMajorVersion() | 返回servlet 容器支持的Servlet API 的版本号。 |
String getMimeType( String file ) | 返回指定文件的MIME 类型,未知类型返回null。一般为"text/html"和"image/gif"。 |
String getRealPath( String path ) | 返回给定虚拟路径所对应物理路径。 |
void setAttribute(String name, Java.lang.Object object) | 设定指定名字的application 对象的属性值。 |
Enumeration getAttributeNames() | 获取所有application 对象的属性名。 |
String getInitParameter(String name) | 获取指定名字的application 对象的属性初值。 |
URL getResource( String path ) | 返回指定的资源路径对应的一个URL 对象实例,参数要以"/"开头。 |
InputStream getResourceAsStream( String path ) | 返回一个由path 指定位置的资源的InputStream 对象实例。 |
String getServerInfo() | 获得当前Servlet 服务器的信息。 |
Servlet getServlet( String name ) | 在ServletContext 中检索指定名称的servlet。 |
Enumeration getServlets() | 返回ServletContext 中所有servlet 的集合。 |
void log( Exception ex, String msg/String msg, Throwablet /String msg ) | 把指定的信息写入servlet log 文件。 |
void removeAttribute( String name ) void setAttribute( String name, Object value ) | 移除指定名称的application 属性。 设定指定的application 属性的值。 |
由于 application 对象具有在所有客户端共享数据的特点,因此经常用于记录所有客户端公用的一些数据,例如页面访问次数。
(2)config 对象
config 对象中存储着一些servlet 初始的数据结构,它跟page 对象一样,很少被用到。config 对象实现了javax.servlet.ServletConfig 接口。
config 对象的主要方法
方法 | 说明 |
String getInitParameter(String name ) | 返回名称为name 的初始参数的值。 |
Enumeration getInitParameters() | 返回这个JSP 所有的初始参数的名称集合。 |
ServletContext getContext() | 返回ServletContext 对象。 |
String getServletName() | 返回servlet 的名称。 |
(3)exception对象
当JSP 页面发生错误时,会产生异常。而exception 就是用来针对异常作出相应处理的对象。要使用该内置对象,必须在page 命令中设定<%@ page isErrorPage=”true”%>,否则编译会出现错误。
exception对象的主要方法
方法 | 说明 |
String getMessage() | 返回错误信息。 |
void printStackTrace() | 以标准错误的形式输出一个错误和错误的堆栈。 |
void toString() | 以字符串的形式返回对异常的描述。 |
void printStackTrace() | 打印出Throwable 及其call stack trace 信息。 |
(4)out对象
out 是用于向客户端输出的PrinterWriter 对象。这里的out 实际上是带有缓冲特性的PrinterWriter,可以称之为JspWriter。缓冲区容量是可以设置的,甚至也可以关闭,只要通过page 指令的buffer 属性就可以达到此目的。out 一般用在程序段内,而JSP 表达式一般会自动形成字符串输出,所以JSP 表达式中一般很少用到out 对象。
out对象的主要方法
方法 | 说明 |
void clear() | 清除输出缓冲区的内容,但是不输出到客户端。 |
void clearBuffer() | 清除缓冲区的内容,并且输出数据到客户端。 |
void close() | 关闭输出流,清除所有内容。 |
void flush() | 输出缓冲区里面的数据。 |
int getBuffersize() | 获得缓冲区大小。缓冲区的大小可用<%@ page buffer="size" %>设置。 |
int getRemaining() | 获得缓冲区可使用空间大小。 |
void newLine() | 输出一个换行字符。 |
boolean isAutoFlush() | 该方法返回一个boolean 类型的值,如果为true 表示缓冲区会在充满之前自动清除;返回false 表示如果缓冲区充满则抛出异常。是否auto fush 可以使用<%@ page is AutoFlush="true/false"%>来设置。 |
print(boolean b/char c/char[] s/double d/float f/int i/long l/Object obj/String s) | 输出一行信息,但不自动换行。 |
println(boolean b/char c/char[] s/double d/float f/int i/long l/Object obj/String s) | 输出一行信息,并且自动换行。 |
Appendable append( char c /CharSequence cxq, int start, int end/CharSequence cxq) | 将一个字符或者实现了CharSequence 接口的对象添加到输出流的后面。 |
(5)page对象
page 对象代表JSP 本身,或者说它代表了被转换后的Servlet,因此它可以调用任何被Servlet 类所定义的方法。
(6)pageContext对象
pageContext 能够存取其他内置对象,当内置对象包括属性时,pageContext 也支持对这些属性的读取和写入。
pageContext对象的主要方法
方法 | 说明 |
Exception getException( ) | 回传目前网页中的异常,不过此网页要为 error page,例如:exception 隐含对象。 |
JspWriter getOut( ) | 回传目前网页的输出流,例如:out 隐含对象。 |
Object getPage( ) | 回传目前网页的 Servlet 实体(instance),例如:page 隐含对象。 |
ServletRequest getRequest( ) | 回传目前网页的请求,例如:request 隐含对象。 |
ServletResponse getResponse( ) | 回传目前网页的响应,例如:response 隐含对象。 |
ServletContext getServletContext( ) | 回传目前此网页的执行环境(context),例如: application 隐含对象。 |
HttpSession getSession( ) | 回传和目前网页有联系的会话(session),例如:session 隐含对象。 |
pageContext对象获取其他内置对象属性的方法
方法 | 说明 |
Object getAttribute(String name, int scope/ String name) | 回传名称为 name,范围为 scope 的属性 对 象 , 回 传类 型为java.lang.Object。 |
getAttributeNamesInScope(int scope) | 回传所有属性范围为Scope 的属性名称,回传类型为Enumeration |
Enumeration getAttributesScope(String name) | 回传属性名称为 name 的属性范围。 |
void removeAttribute(String name) | 移除属性名称为 name 的属性对象。 |
void removeAttribute(String name, int scope) | 移除属性名称为 name,范围为scope 的属性对象。 |
void setAttribute(String name, Object value, int scope) | 指定属性对象的名称为 name、值为value、范围为 scope |
Object findAttribute(String name) | 在所有范围中寻找属性名称为name 的属性对象。 |
(7)request 对象
与request 相联系的是HttpServletRequest 类。通过getParameter 方法可以得到request的参数,通过GET、POST、HEAD 等方法可以得到request 的类型,通过cookies,Referer,等可以得到引入的HTTP 头。
request 对象的主要方法
方法 | 说明 |
Object getAttribute(String name) | 返回name 指定的属性值,如果不存在该属性则返回null。 |
Enumeration getAttributeNames() | 返回request 对象所有属性的名字。 |
String getCharacterEncoding() | 返回请求中的字符编码方法,可以在response 对象中设置。 |
String getContentType() | 返回在response 中定义的内容类型。 |
Cookie[] getCookies() | 返回客户端所有Cookie 对象,其结果是一个Cookie 数组。 |
String getHeader(String name) | 获取HTTP 协议定义的文件头信息。 |
Enumeration getHeaderNames() | 获取所有HTTP 协议定义的文件头名称。 |
Enumeration getHeaders(String name) | 获取request 指定文件头的所有值的集合。 |
ServletInputStream getInputStream() | 返回请求的输入流。 |
String getLocalName() | 获取响应请求的服务器端主机名。 |
String getLocalAddr() | 获取响应请求的服务器端地址。 |
int getLocalPort() | 获取响应请求的服务器端端口。 |
String getMethod() | 获取客户端向服务器提交数据的方法(GET 或POST)。 |
String getParameter(String name) | 获取客户端传送给服务器的参数值,参数由name 属性决定。 |
Enumeration getParameterNames() | 获取客户端传送给服务器的所有参数名称, 返回一个 Enumerations 类的实例。使用此类需要导入util 包。 |
String[] getParameterValues(String name) | 获取指定参数的所有值。参数名称由“name”指定。 |
String getProtocol() | 获取客户端向服务器传送数据所依据的协议,如HTTP/1.1、HTTP/1.0。 |
String getQueryString() | 获取request 参数字符串,前提是采用GET 方法向服务器传送数据。 |
BufferedReader getReader() | 返回请求的输入流对应的Reader 对象, 该方法和 getInputStream()方法在一个页面中只能调用一个。 |
String getRemoteAddr() | 获取客户端用户IP 地址。 |
String getRemoteHost() | 获取客户端用户主机名称。 |
String getRemoteUser() | 获取经过验证的客户端用户名称,未经验证返回null。 |
StringBuffer getRequestURL() | 获取request URL,但不包括参数字符串。 |
void setAttribute(String name,Java.lang.Object object) | 设定名字为name 的reqeust 参数的值,该值由object 决定。 |
(8)response 对象
与response 相联系的是HttpServletResponse 类,用于控制HTTP 连接。因为输出流是放入缓冲的,所以可以设置HTTP状态码和response 头。主要用于向客户端发送数据,如Cookie、HTTP 文件头等信息。
response 对象的主要方法
方法 | 说明 |
void addCookie(Cookie cookie) | 添加一个Cookie 对象,用来保存客户端的用户信息。 |
void addHeader( String name,String value) | 添加HTTP 头。该Header 将会传到客户端,若同名的Header 存在,原来的Header 会被覆盖。 |
boolean containsHeader( String name ) | 判断指定的HTTP 头是否存在。 |
String encodeRedirectURL(String url) | 对于使用sendRedirect()方法的URL 编码。 |
String encodeURL(String url ) | 将URL 予以编码,回传包含session ID 的URL。 |
void flushBuffer() | 强制把当前缓冲区的内容发送到客户端。 |
int getBufferSize() | 取得以kb 为单位的缓冲区大小。 |
String getCharacterEncoding() | 获取响应的字符编码格式。 |
String getContentType() | 获取响应的类型。 |
ServletOutputStream getOutputStream() | 返回客户端的输出流对象。 |
PrintWriter getWriter() | 获取输出流对应的writer 对象。 |
void reset() | 清空buffer 中的所有内容。 |
void resetBuffer() | 情况buffer 中所有的内容,但是保留HTTP 头和状态息。 |
void sendError(int sc,String msg) 或void sendError(int sc) | 向客户端传送错误状态码和错误信息。如:505:服务器内部错误;404:网页找不到错误。 |
void sendRedirect(String location) | 向服务器发送一个重定位至location 位置的请求。 |
void setCharacterEncoding(String charset ) | 设置响应使用的字符编码格式。 |
void setBufferSize( int size ) | 设置以kb 为单位的缓冲区大小。 |
void setContentLength( int length ) | 设置响应的BODY 长度。 |
void setHeader(String name,String value) | 设置指定HTTP 头的值。设定指定名字的HTTP 文件头的值,若该值存在,它将会被新值覆盖。 |
void setStatus(int sc) | 设置状态码。为了使得代码具有更好的可读性, 可以用HttpServletResponse 中定义的常量来避免直接使用整数。这些常量根据HTTP 1.1 中的标准状态信息命名,所有的名字都加上了SC前缀(Status Code 的缩写)并大写,同时把空格转换成了下划线。 |
(9)session 对象
session 用来分别保存每一个用户的信息,使用session,可以轻易的识别每一个用户,然后针对每个用户的要求,给予正确的响应。因此,在网上购物时购物车中最常使用的就是session。当用户把物品放入购物车时,就可以将用户选定的商品信息存放在session 中,当需要进行付款等操作时,又可以将session 中的信息取出来。
<%@page %>指令有session=”true|false”属性指明 session 对象是否可用,如果指定为false 就无法创建session 对象,当然也无法定义 session 相关属性。默认值为true。
session 对象的主要方法
方法 | 说明 |
Object getAttribute(String name) | 获取指定名字的属性。 |
Enumeration getAttributeNames() | 获取session 中所有的属性名称。 |
long getCreationTime() | 返回当前session 对象创建的时间。单位是毫秒,由1970年1 月1 日零时算起。 |
String getId() | 返回当前session 的ID。每个session 都有一个独一无二的ID。 |
long getLastAccessedTime() | 返回当前session 对象最后一次被操作的时间。单位是毫秒,由1970 年1 月1 日零时算起。 |
int getMaxInactiveInterval() | 获取session 对象的有效时间。 |
void invalidate() | 强制销毁该session 对象。 |
ServletContext getServletContext() | 返回一个该JSP 页面对应的ServletContext 对象实例。 |
HttpSessionContext getSessionContext() | 获取session 的内容。 |
Object getValue( String name ) | 取得指定名称的session 变量值,不推荐使用。 |
String[] getValueNames() | 取得所有session 变量的名称的集合,不推荐使用。 |
boolean isNew() | 判断session 是否为新的,所谓新的session 只是由服务器产生的session 尚未被客户端使用。 |
void removeAttribute(String name) | 删除指定名字的属性。 |
void pubValue( String name, Object value ) | 添加一个session 变量,不推荐使用。 |
void setAttribute(String name,Java.lang.Object object) | 设定指定名字属性的属性值,并存储在session 对象中。 |
void setMaxInactiveInterval(int interval) | 设置最大的session 不活动的时间,若超过这时间,session将会失效,时间单位为秒。 |
三、常见问题
用户关闭浏览器是否就关闭了session scope?
四、解决方案
当首次请求服务器上的JSP页面时,服务器会生成一个session对象,具有一个服务器上唯一的ID号:session ID ,同时这个ID号会被发送到客户端,存放到客户的cookie中。session的创建和销毁由服务器端控制。当浏览器关闭后,session还停留在服务器端;当浏览器重新发送请求到服务器,会创建另一个session,这个时候的session id已经不一样了,也就不能访问上一次的session里的内容。
如果一定的时间内客户端没有反应,则认为会话结束。Tomcat的默认值为120分钟,这个值可以通过HttpSession的setMaxInactiveInterval()方法来设置最大时长。
五、扩展思考
内置对象中response 的sendRedirect()方法,在使用上同<jsp:forward/>实现页面跳转的方法有什么区别?
关于 sendRedirect和forward原理及区别总结参见:http://javacrazyer.iteye.com/blog/769889
二、明日计划
1.把小课堂PPT和代码实战部分整理完;
2.继续任务5.
三、遇到问题
在IDE中编写单独的JSP页面,调用内置对象提供的方法,类似Java代码,必须引入相关依赖的jar包,如果缺少jar支持,IDE会产生编译错误:
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jsp</artifactId>
<version>9.2.22.v20170606</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>apache-jsp</artifactId>
<version>9.4.7.v20170914</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>3.0.7</version>
</dependency>
四、收获
以上。
评论