JSP九大内置对象

一、JSP运行原理

  每个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大对象的引用。

二、JSP中的四大作用域

      JSP中存在四大作用域,九大内置对象分属于不同的作用域,内置对象只在其所在的作用域中起作用。

      四大作用域分别为:page, request ,session, application。

      1.page:只在当前页面有效,也就是用户请求的页面有效,当前页面关闭或转到其他页面时,page里的对象将在响应回馈给客户端后释放。

      2.request:在当前请求中有效,request可以通过setAttribute()方法实现页面中的信息传递,也可以通过forward()方法进行页面间的跳转,需要注意的是request是转发不是重定向,转发相对于浏览器来说是透明的,也就是无论页面如何跳转,地址栏上显示的依旧是最初的地址。

      3.session:在当前会话中有效。当打开浏览器对服务器进行多次访问,到关闭浏览器为止,在这多次访问之间传递的信息就是session作用域的范围。它从浏览器发出第一个HTTP请求即认为会话开始,但是会话结束的时间是不确定的,因为在浏览器关闭时并不会通知服务器,一般Tomcat设置的默认时间为120分钟,也可以通过setMaxInactiveInterval(int)方法进行设置,或是通过invalidate()方法强制结束当前会话。

     4. application:在所有的应用程序中都有效,也就是当服务器开始到服务器结束这段时间,application作用域中存储的数据都是有效的,同样可以通过setAttribute赋值和getAttribute取值。

三、九大内置对象

内置对象 类型作用域
pageContext页面上下文对象 javax.servlet.jsp.PageContext  Page
request请求对象 javax.servlet.ServletRequest Request
response响应对象javax.servlet.SrvletResponse Page
session会话对象 javax.servlet.http.HttpSession Session
application应用程序对象 javax.servlet.ServletContext  Application
out输出对象javax.servlet.jsp.JspWriterPage
config配置对象javax.servlet.ServletConfigPage
page页面对象javax.lang.ObjectPage
exception例外对象 javax.lang.ThrowablePage

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

四、内置对象使用说明

1.page

      page对象表示当前一个JSP页面,可以理解为一个对象本身,即:把一个JSP当作一个对象来看待。page对象在开发中几乎不用,了解一下即可。

常用方法:

1. class getClass 返回此Object的类 (常用)

2. int hashCode() 返回此Object的hash码 

3. boolean equals(Object obj) 判断此Object是否与指定的Object对象相等 (常用)

4. void copy(Object obj) 把此Object拷贝到指定的Object对象中 

5. Object clone() 克隆此Object对象 

6. String toString() 把此Object对象转换成String类的对象 (常用)

7. void notify() 唤醒一个等待的线程 

8. void notifyAll() 唤醒所有等待的线程 

9. void wait(int timeout) 使一个线程处于等待直到timeout结束或被唤醒 

10. void wait() 使一个线程处于等待直到被唤醒 

11. void enterMonitor() 对Object加锁 

12. void exitMonitor() 对Object开锁

2.out对象

       out对象用于向客户端发送文本数据。可以通过调用pageContext对象的getOut方法得到out对象的。
  JSP页面中的out对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,它不是直接将数据输出到页面,而是先将数据存放到自己的缓冲区中,然后再把数据刷新到response的缓冲区,最后再输出数据。设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。 
  只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:

  • 设置page指令的buffer属性关闭了out对象的缓存功能
  • out对象的缓冲区已满
  • 整个JSP页面结束

常用方法:

1. void clear() 清除缓冲区的内容 ,如果缓冲区被刷新过,会抛出异常

2. void clearBuffer() 清除缓冲区的当前内容 

3. void flush() 先输出缓冲区的内容再清空

4. int getBufferSize() 返回缓冲区可以存储的字节数的大小,如不设缓冲区则为0 

5. int getRemaining() 返回缓冲区还剩余多少可用 

6. boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常 

7. void close() 关闭输出流 

关于out.write与response.getWrite.write:

根据感觉应该是先输出“out对象”,再输出“response对象”。看一下运行结果:

运行结果是先输出“response对象”,再输出“out对象”。分析一下执行过程:

out和response各有一个缓冲区,浏览器只读取response缓冲区中的数据,执行out.write(“out对象”)时,向out缓冲区中写入数据:

out缓冲区
out对象

                         

response
 

 

 

 

 

 

 

执行response.getWrite.write(“response对象”)时,向response缓冲区写入数据:

out缓冲区
out对象

            

response
response对象

 

 

 

 

 

 

每次JSP页面的代码执行完成后,都会自动执行out.flush()方法,将out缓冲区内的数据写入response缓冲区:

out缓冲区
 

       

response

response对象

out对象

 

 

 

 

 

 

最后对response执行刷新操作,将response缓冲区内的数据写个浏览器,于是先输出response对象,再输出out对象。

如果在执行完out.write()后,执行out.flush(),那么会将out缓冲区内的数据立刻刷新到response缓冲区中,程序也就会按原来顺序输出。

3.pageContext对象

         pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象(容器),可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。

常用方法:

JspWriter getOut() 返回当前客户端响应被使用的JspWriter流(out) 

2. HttpSession getSession() 返回当前页中的HttpSession对象(session) 

3. Object getPage() 返回当前页的Object对象(page) 

4. ServletRequest getRequest() 返回当前页的ServletRequest对象(request) 

5. ServletResponse getResponse() 返回当前页的ServletResponse对象(response) 

6. Exception getException() 返回当前页的Exception对象(exception) 

7. ServletConfig getServletConfig() 返回当前页的ServletConfig对象(config) 

8. ServletContext getServletContext() 返回当前页的ServletContext对象(application) 

9. void setAttribute(String name,Object attribute) 设置属性及属性值

10. void setAttribute(String name,Object obj,int scope) 在指定范围内设置属性及属性值 

11. public Object getAttribute(String name) 取属性的值 

12. Object getAttribute(String name,int scope) 在指定范围内取属性的值 

13. public Object findAttribute(String name) 寻找一属性,返回起属性值或NULL 

14. void removeAttribute(String name) 删除某属性

15. void removeAttribute(String name,int scope) 在指定范围删除某属性 

16. int getAttributeScope(String name) 返回某属性的作用范围 

17. Enumeration getAttributeNamesInScope(int scope) 返回指定范围内可用的属性名枚举 

18. void release() 释放pageContext所占用的资源 

19. void forward(String relativeUrlPath) 使当前页面重导到另一页面 

20. void include(String relativeUrlPath) 在当前位置包含另一文件 

      重点看一下 findAttribute(String name)方法,这个方法是用来查找 各个域中的属性的,当要查找某个属性时,findAttribute按照“page—>request—>session—>application”在这四个对象中去查找,只要找到了就返回属性值,如果四个对象都没有找到,则返回null。

示例:

<body>
<%
    pageContext.setAttribute("name1", "孤傲苍狼");
    request.setAttribute("name2", "白虎神皇");
    session.setAttribute("name3", "玄天邪帝");
    application.setAttribute("name4", "灭世魔尊");
%>
<%
    String refName1 = (String) pageContext.findAttribute("name1");
    String refName2 = (String) pageContext.findAttribute("name2");
    String refName3 = (String) pageContext.findAttribute("name3");
    String refName4 = (String) pageContext.findAttribute("name4");
    String refName5 = (String) pageContext.findAttribute("name5");//查找一个不存在的属性
%>
<h1>pageContext.findAttribute方法查找到的属性值:</h1>
<h3>pageContext对象的name1属性:<%=refName1%>
</h3>
<h3>request对象的name2属性:<%=refName2%>
</h3>
<h3>session对象的name3属性:<%=refName3%>
</h3>
<h3>application对象的name4属性:<%=refName4%>
</h3>
<h3>查找不存在的name5属性:<%=refName5%>
</h3>
</body>

运行结果:

 

3.1pageContext封装其他八大内置对象的意义

        通过pageContext的方法可以看出,可以通过pageContext来得到其他的八大内置对象,即pageContext中封装了其他八大内置对象,那么这有什么意义呢?

        如果在编程过程中,把pageContext对象传递给一个普通java对象,那么这个java对象将可以获取8大隐式对象,此时这个java对象就可以和浏览器交互了,此时这个java对象就成为了一个动态web资源了,这就是pageContext封装其它8大内置对象的意义,把pageContext传递给谁,谁就能成为一个动态web资源,那么什么情况下需要把pageContext传递给另外一个java类呢,什么情况下需要使用这种技术呢,在比较正规的开发中,jsp页面是不允许出现java代码的,如果jsp页面出现了java代码,那么就应该想办法把java代码移除掉,我们可以开发一个自定义标签来移除jsp页面上的java代码,首先围绕自定义标签写一个java类,jsp引擎在执行自定义标签的时候就会调用围绕自定义标签写的那个java类,在调用java类的时候就会把pageContext对象传递给这个java类,由于pageContext对象封装了对其它8大隐式对象的引用,因此在这个java类中就可以使用jsp页面中的8大隐式对象(request,response,config,application,exception,Session,page,out)了,pageContext对象在jsp自定义标签开发中特别重要。

4.request对象

 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据(包括头信息、系统信息、请求方式以及请求参数等)。

常用方法:

1. object getAttribute(String name) 返回指定属性的属性值

2. Enumeration getAttributeNames() 返回所有可用属性名的枚举 

3. String getCharacterEncoding() 返回字符编码方式

4. int getContentLength() 返回请求体的长度(以字节数) 

5. String getContentType() 得到请求体的MIME类型 

6. ServletInputStream getInputStream() 得到请求体中一行的二进制流 

7. String getParameter(String name) 返回name指定参数的参数值

8. Enumeration getParameterNames() 返回可用参数名的枚举 

9. String[] getParameterValues(String name) 返回包含参数name的所有值的数组 

10. String getProtocol() 返回请求用的协议类型及版本号 

11. String getScheme() 返回请求用的计划名,如:http.https及ftp等 

12. String getServerName() 返回接受请求的服务器主机名 

13. int getServerPort() 返回服务器接受此请求所用的端口号 

14. BufferedReader getReader() 返回解码过了的请求体 

15. String getRemoteAddr() 返回发送此请求的客户端IP地址 

16. String getRemoteHost() 返回发送此请求的客户端主机名 

17. void setAttribute(String key,Object obj) 设置属性的属性值

18. String getRealPath(String path) 返回一虚拟路径的真实路径
部分方法示例:

五、response对象

response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。

常用方法:

1.String getCharacterEncoding() 返回响应用的是何种字符编码 

2. ServletOutputStream getOutputStream() 返回响应的一个二进制输出流 

3. PrintWriter getWriter() 返回可以向客户端输出字符的一个对象 

4. void setContentLength(int len) 设置响应头长度 

5. void setContentType(String type) 设置响应的MIME类型 

6. sendRedirect(java.lang.String location) 重新定向客户端的请求

六、session对象

    session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。

常用方法:

1. long getCreationTime() 返回SESSION创建时间 

2. public String getId() 返回SESSION创建时JSP引擎为它设的唯一ID号 

3. long getLastAccessedTime() 返回此SESSION里客户端最近一次请求时间 

4. int getMaxInactiveInterval() 返回两次请求间隔多长时间此SESSION被取消(ms) 

5. String[] getValueNames() 返回一个包含此SESSION中所有可用属性的数组 

6. void invalidate() 销毁SESSION

7. boolean isNew() 返回服务器创建的一个SESSION,客户端是否已经加入 

8. void removeValue(String name) 删除SESSION中指定的属性 

9. void setMaxInactiveInterval() 设置两次请求间隔多长时间此SESSION被取消(ms)

七、application对象

      application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。

       实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。

常用方法:

1. Object getAttribute(String name) 返回给定名的属性值 

2. Enumeration getAttributeNames() 返回所有可用属性名的枚举 

3. void setAttribute(String name,Object obj) 设定属性的属性值 

4. void removeAttribute(String name) 删除一属性及其属性值 

5. String getServerInfo() 返回JSP(SERVLET)引擎名及版本号 

6. String getRealPath(String path) 返回一虚拟路径的真实路径 

7. ServletContext getContext(String uripath) 返回指定WebApplication的application对象 

8. int getMajorVersion() 返回服务器支持的Servlet API的最大版本号 

9. int getMinorVersion() 返回服务器支持的Servlet API的最大版本号 

10. String getMimeType(String file) 返回指定文件的MIME类型 

11. URL getResource(String path) 返回指定资源(文件及目录)的URL路径 

12. InputStream getResourceAsStream(String path) 返回指定资源的输入流 

13. RequestDispatcher getRequestDispatcher(String uripath) 返回指定资源的RequestDispatcher对象 

14. Servlet getServlet(String name) 返回指定名的Servlet 

15. Enumeration getServlets() 返回所有Servlet的枚举

八、config对象

config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。

config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)。

常用方法:

1. ServletContext getServletContext() 返回含有服务器相关信息的ServletContext对象 

2. String getInitParameter(String name) 返回初始化参数的值 

3. Enumeration getInitParameterNames() 返回Servlet初始化所需所有参数的枚举

九、exception对象

       exception 对象的作用是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

常用方法:

1. String getMessage() 返回描述异常的消息 

2. String toString() 返回关于异常的简短描述消息 

3. void printStackTrace() 显示异常及其栈轨迹 

4. Throwable FillInStackTrace() 重写异常的执行栈轨迹
 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值