发表于: 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 中,定义了四种作用范围,即:ApplicationSessionPage Request,它们代表了对象各自的“生命周期”。

1Application Scope :起始于服务器开始运行,application对象被创建之时;终止于服务器关闭之时。

2Session Scope :用户请求访问服务器时session 对象开始生效,用户断开退出时session 对象失效。

3Request Scope :在一个JSP 页面向另一个JSP 页面提出请求到请求完成之间,在完成请求后此范围即结束。(使用<jsp:forward>或者<jsp:include>实现在页面跳转中共享request 对象的数);

4Page Scope :仅限于获取本页的数据。 

2.内置对象

1application 对象

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 对象具有在所有客户端共享数据的特点,因此经常用于记录所有客户端公用的一些数据,例如页面访问次数。

2config 对象

config 对象中存储着一些servlet 初始的数据结构,它跟page 对象一样,很少被用到。config 对象实现了javax.servlet.ServletConfig 接口。

config 对象的主要方法

方法

说明

String getInitParameter(String name )

返回名称为name 的初始参数的值。

Enumeration getInitParameters()

返回这个JSP 所有的初始参数的名称集合。

ServletContext getContext()

返回ServletContext   对象。

String getServletName()

返回servlet 的名称。

3exception对象

JSP 页面发生错误时,会产生异常。而exception 就是用来针对异常作出相应处理的对象。要使用该内置对象,必须在page 命令中设定<%@ page isErrorPage=true%>,否则编译会出现错误。

exception对象的主要方法

方法

说明

String getMessage()

返回错误信息。

void printStackTrace()

以标准错误的形式输出一个错误和错误的堆栈。

void toString()

以字符串的形式返回对异常的描述。

void printStackTrace()

打印出Throwable   及其call stack   trace 信息。

4out对象

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 接口的对象添加到输出流的后面。

5page对象

page 对象代表JSP 本身,或者说它代表了被转换后的Servlet,因此它可以调用任何被Servlet 类所定义的方法。

6pageContext对象

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 的属性对象。

7request 对象

request 相联系的是HttpServletRequest 类。通过getParameter 方法可以得到request的参数,通过GETPOSTHEAD 等方法可以得到request 的类型,通过cookiesReferer,等可以得到引入的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.1HTTP/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 决定。

8response 对象

response 相联系的是HttpServletResponse 类,用于控制HTTP 连接。因为输出流是放入缓冲的,所以可以设置HTTP状态码和response 头。主要用于向客户端发送数据,如CookieHTTP 文件头等信息。

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 的缩写)并大写,同时把空格转换成了下划线。

9session 对象

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 对象创建的时间。单位是毫秒,由19701 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分钟,这个值可以通过HttpSessionsetMaxInactiveInterval()方法来设置最大时长。

五、扩展思考

内置对象中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>


四、收获

以上。



返回列表 返回列表
评论

    分享到