jsp九大内置对象
来源:互联网 发布:win python 编辑:程序博客网 时间:2024/06/05 09:15
一、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大对象的引用。
二、认识九个内置对象
request,response,session,application,config,exception这些对象在前面都已经作了详细的介绍,这里重点介绍一下剩下的pageContext
对象,out
对象,page
对象。
三、内置对象使用说明
3.1、page对象
page对象表示当前一个JSP页面,可以理解为一个对象本身,即:把一个JSP当作一个对象来看待。page对象在开发中几乎不用,了解一下即可
3.2、out对象
out对象用于向客户端发送文本数据。
out对象是通过调用pageContext
对象的getOut
方法返回的,其作用和用法与ServletResponse.getWriter
方法返回的PrintWriter
对象非常相似。
JSP页面中的out对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer
属性可以调整它的缓存大小,甚至关闭它的缓存。
只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter
方法,并通过该方法返回的PrintWriter
对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
- 设置page指令的buffer属性关闭了out对象的缓存功能
- out对象的缓冲区已满
- 整个JSP页面结束
out对象的工作原理图
3.3、pageContext对象
pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象(容器),可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。
3.4、通过pageContext获得其他对象
- getException方法返回exception隐式对象
- getPage方法返回page隐式对象
- getRequest方法返回request隐式对象
- getResponse方法返回response隐式对象
- getServletConfig方法返回config隐式对象
- getServletContext方法返回application隐式对象
- getSession方法返回session隐式对象
- getOut方法返回out隐式对象
3.5、pageContext封装其它8大内置对象的意义
如果在编程过程中,把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自定义标签开发中特别重要。
3.6、pageContext作为域对象
pageContext对象可以作为容器来使用,因此可以将一些数据存储在pageContext对象中。
pageContext对象的常用方法
<code class="hljs avrasm has-numbering"> public void setAttribute(java<span class="hljs-preprocessor">.lang</span><span class="hljs-preprocessor">.String</span> name,java<span class="hljs-preprocessor">.lang</span><span class="hljs-preprocessor">.Object</span> value) public java<span class="hljs-preprocessor">.lang</span><span class="hljs-preprocessor">.Object</span> getAttribute(java<span class="hljs-preprocessor">.lang</span><span class="hljs-preprocessor">.String</span> name) public void removeAttribute(java<span class="hljs-preprocessor">.lang</span><span class="hljs-preprocessor">.String</span> name) public java<span class="hljs-preprocessor">.lang</span><span class="hljs-preprocessor">.Object</span> findAttribute(java<span class="hljs-preprocessor">.lang</span><span class="hljs-preprocessor">.String</span> name)</code>
重点介绍一下findAttribute
方法,这个方法是用来查找各个域中的属性的,查看这个方法的API可以看到关于这个方法的描述:
Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null.
当要查找某个属性时,findAttribute方法按照查找顺序”page→request→session→application“在这四个对象中去查找,只要找到了就返回属性值,如果四个对象都没有找到要查找的属性,则返回一个null。
范例:使用pageContext的findAttribute方法查找属性值
<code class="hljs xml has-numbering"><span class="vbscript"><%@page contentType=<span class="hljs-string">"text/html;charset=UTF-8"</span>%></span><span class="vbscript"><%@page import=<span class="hljs-string">"java.util.*"</span>%></span><span class="hljs-doctype"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"></span><span class="hljs-tag"><<span class="hljs-title">head</span>></span> <span class="hljs-tag"><<span class="hljs-title">title</span>></span>pageContext的findAttribute方法查找属性值<span class="hljs-tag"></<span class="hljs-title">title</span>></span><span class="hljs-tag"></<span class="hljs-title">head</span>></span><span class="vbscript"><% pageContext.setAttribute(<span class="hljs-string">"name1"</span>, <span class="hljs-string">"孤傲苍狼"</span>); <span class="hljs-built_in">request</span>.setAttribute(<span class="hljs-string">"name2"</span>, <span class="hljs-string">"白虎神皇"</span>); session.setAttribute(<span class="hljs-string">"name3"</span>, <span class="hljs-string">"玄天邪帝"</span>); application.setAttribute(<span class="hljs-string">"name4"</span>, <span class="hljs-string">"灭世魔尊"</span>);%></span><span class="vbscript"><% //使用pageContext的findAttribute方法查找属性,由于取得的值为Object类型,因此必须使用<span class="hljs-built_in">String</span>强制向下转型,转换成<span class="hljs-built_in">String</span>类型 //查找name1属性,按照顺序<span class="hljs-string">"page→request→session→application"</span>在这四个对象中去查找 <span class="hljs-built_in">String</span> refName1 = (<span class="hljs-built_in">String</span>)pageContext.findAttribute(<span class="hljs-string">"name1"</span>); <span class="hljs-built_in">String</span> refName2 = (<span class="hljs-built_in">String</span>)pageContext.findAttribute(<span class="hljs-string">"name2"</span>); <span class="hljs-built_in">String</span> refName3 = (<span class="hljs-built_in">String</span>)pageContext.findAttribute(<span class="hljs-string">"name3"</span>); <span class="hljs-built_in">String</span> refName4 = (<span class="hljs-built_in">String</span>)pageContext.findAttribute(<span class="hljs-string">"name4"</span>); <span class="hljs-built_in">String</span> refName5 = (<span class="hljs-built_in">String</span>)pageContext.findAttribute(<span class="hljs-string">"name5"</span>);//查找一个不存在的属性%></span><span class="hljs-tag"><<span class="hljs-title">h1</span>></span>pageContext.findAttribute方法查找到的属性值:<span class="hljs-tag"></<span class="hljs-title">h1</span>></span><span class="hljs-tag"><<span class="hljs-title">h3</span>></span>pageContext对象的name1属性:<span class="vbscript"><%=refName1%></span><span class="hljs-tag"></<span class="hljs-title">h3</span>></span><span class="hljs-tag"><<span class="hljs-title">h3</span>></span>request对象的name2属性:<span class="vbscript"><%=refName2%></span><span class="hljs-tag"></<span class="hljs-title">h3</span>></span><span class="hljs-tag"><<span class="hljs-title">h3</span>></span>session对象的name3属性:<span class="vbscript"><%=refName3%></span><span class="hljs-tag"></<span class="hljs-title">h3</span>></span><span class="hljs-tag"><<span class="hljs-title">h3</span>></span>application对象的name4属性:<span class="vbscript"><%=refName4%></span><span class="hljs-tag"></<span class="hljs-title">h3</span>></span><span class="hljs-tag"><<span class="hljs-title">h3</span>></span>查找不存在的name5属性:<span class="vbscript"><%=refName5%></span><span class="hljs-tag"></<span class="hljs-title">h3</span>></span><span class="hljs-tag"><<span class="hljs-title">hr</span>/></span><span class="hljs-tag"><<span class="hljs-title">h1</span>></span>使用EL表达式进行输出:<span class="hljs-tag"></<span class="hljs-title">h1</span>></span><span class="hljs-tag"><<span class="hljs-title">h3</span>></span>pageContext对象的name1属性:${name1}<span class="hljs-tag"></<span class="hljs-title">h3</span>></span><span class="hljs-tag"><<span class="hljs-title">h3</span>></span>request对象的name2属性:${name2}<span class="hljs-tag"></<span class="hljs-title">h3</span>></span><span class="hljs-tag"><<span class="hljs-title">h3</span>></span>session对象的name3属性:${name3}<span class="hljs-tag"></<span class="hljs-title">h3</span>></span><span class="hljs-tag"><<span class="hljs-title">h3</span>></span>application对象的name4属性:${name4}<span class="hljs-tag"></<span class="hljs-title">h3</span>></span><span class="hljs-tag"><<span class="hljs-title">h3</span>></span>不存在的name5属性:${name5}<span class="hljs-tag"></<span class="hljs-title">h3</span>></span></code>
运行结果:
EL表达式语句在执行时,会调用pageContext.findAttribute
方法,用标识符为关键字,分别从page、request、 session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。
pageContext对象中封装了访问其它域的方法
<code class="hljs cs has-numbering"> <span class="hljs-keyword">public</span> java.lang.Object <span class="hljs-title">getAttribute</span>(java.lang.String name,<span class="hljs-keyword">int</span> scope) <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAttribute</span>(java.lang.String name, java.lang.Object <span class="hljs-keyword">value</span>,<span class="hljs-keyword">int</span> scope) <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">removeAttribute</span>(java.lang.String name,<span class="hljs-keyword">int</span> scope)</code>
代表各个域的常量
- PageContext.APPLICATION_SCOPE
- PageContext.SESSION_SCOPE
- PageContext.REQUEST_SCOPE
- PageContext.PAGE_SCOPE
范例:pageContext访问其它域
<code class="hljs xml has-numbering"><span class="vbscript"><%@page contentType=<span class="hljs-string">"text/html;charset=UTF-8"</span>%></span><span class="vbscript"><%@page import=<span class="hljs-string">"java.util.*"</span>%></span><span class="hljs-doctype"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"></span><span class="hljs-tag"><<span class="hljs-title">head</span>></span> <span class="hljs-tag"><<span class="hljs-title">title</span>></span>pageContext访问其它域<span class="hljs-tag"></<span class="hljs-title">title</span>></span><span class="hljs-tag"></<span class="hljs-title">head</span>></span><span class="vbscript"><% //此时相当于往session对象中存放了一个name属性,等价于 session.setAttribute(<span class="hljs-string">"name"</span>,<span class="hljs-string">"孤傲苍狼"</span>); pageContext.setAttribute(<span class="hljs-string">"name"</span>,<span class="hljs-string">"孤傲苍狼"</span>,PageContext.SESSION_SCOPE);%></span><span class="vbscript"><% //取得session对象的属性,使用pageContext对象获取 <span class="hljs-built_in">String</span> refName1 = (<span class="hljs-built_in">String</span>)pageContext.getAttribute(<span class="hljs-string">"name"</span>,PageContext.SESSION_SCOPE); //由于取得的值为Object类型,因此必须使用<span class="hljs-built_in">String</span>强制向下转型,转换成<span class="hljs-built_in">String</span>类型 <span class="hljs-built_in">String</span> refName2 = (<span class="hljs-built_in">String</span>)session.getAttribute(<span class="hljs-string">"name"</span>); %></span><span class="hljs-tag"><<span class="hljs-title">h1</span>></span>取出存放在session对象中的属性值:<span class="hljs-tag"></<span class="hljs-title">h1</span>></span><span class="hljs-tag"><<span class="hljs-title">p</span>></span>第一种做法:使用pageContext.getAttribute("attributeName",PageContext.SESSION_SCOPE);去取出session对象中值<span class="hljs-tag"></<span class="hljs-title">p</span>></span><span class="hljs-tag"><<span class="hljs-title">h3</span>></span>姓名:<span class="vbscript"><%=refName1%></span><span class="hljs-tag"></<span class="hljs-title">h3</span>></span><span class="hljs-tag"><<span class="hljs-title">p</span>></span>第二种做法:使用session.getAttribute("attributeName");去取出session对象中值<span class="hljs-tag"></<span class="hljs-title">p</span>></span><span class="hljs-tag"><<span class="hljs-title">h3</span>></span>姓名:<span class="vbscript"><%=refName2%></span><span class="hljs-tag"></<span class="hljs-title">h3</span>></span></code>
3.7、PageContext引入和跳转到其他资源
PageContext类中定义了一个forward
方法(用来跳转页面)和两个include
方法(用来引入页面)来分别简化和替代RequestDispatcher.forward
方法和include
方法。
方法接收的资源如果以“/”开头, “/”代表当前web应用。
范例:使用pageContext的forward方法跳转到其他页面
<code class="hljs xml has-numbering"><span class="vbscript"><%@page contentType=<span class="hljs-string">"text/html;charset=UTF-8"</span>%></span><span class="vbscript"><%@page import=<span class="hljs-string">"java.util.*"</span>%></span><span class="hljs-doctype"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"></span><span class="hljs-tag"><<span class="hljs-title">head</span>></span> <span class="hljs-tag"><<span class="hljs-title">title</span>></span>使用pageContext的forward方法跳转页面<span class="hljs-tag"></<span class="hljs-title">title</span>></span><span class="hljs-tag"></<span class="hljs-title">head</span>></span><span class="vbscript"><% //使用pageContext的forward方法跳转到pageContextDemo05.jsp页面,/代表了当前的web应用 pageContext.forward(<span class="hljs-string">"/pageContextDemo05.jsp"</span>); //使用pageContext.forward(relativeUrlPath)替代RequestDispatcher.forward(relativeUrlPath) //使用RequestDispatcher的forward方法实现的跳转方式 //pageContext.getRequest().getRequestDispatcher(<span class="hljs-string">"/pageContextDemo05.jsp"</span>).forward(<span class="hljs-built_in">request</span>, <span class="hljs-built_in">response</span>);%></span></code>
运行结果如下:
pageContext.forward("/pageContextDemo05.jsp");
这种写法是用来简化和替代pageContext.getRequest().getRequestDispatcher("/pageContextDemo05.jsp").forward(request, response);
这种写法的。在实际开发中,使用pageContext.forward(relativeUrlPath)
方法跳转页面用得不多,主要是因为要在Jsp页面中嵌套java代码,所以这种做法简单了解一下即可,在开发中,要想从一个Jsp页面采用服务器端跳转的方式跳转到另一个Jsp页面,那么一般会使用<jsp:forward>
标签,<jsp:forward>
标签用于把请求转发给另外一个资源。
范例:使用pageContext的include方法引入资源
<code class="hljs xml has-numbering"><span class="vbscript"><%@ page language=<span class="hljs-string">"java"</span> import=<span class="hljs-string">"java.util.*"</span> pageEncoding=<span class="hljs-string">"UTF-8"</span>%></span><span class="hljs-doctype"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"></span><span class="hljs-tag"><<span class="hljs-title">head</span>></span> <span class="hljs-tag"><<span class="hljs-title">title</span>></span>使用pageContext的include方法引入资源<span class="hljs-tag"></<span class="hljs-title">title</span>></span><span class="hljs-tag"></<span class="hljs-title">head</span>></span><span class="vbscript"><% pageContext.include(<span class="hljs-string">"/jspfragments/head.jsp"</span>);%></span> 使用pageContext的include方法引入资源<span class="vbscript"><% pageContext.include(<span class="hljs-string">"/jspfragments/foot.jsp"</span>);%></span><span class="hljs-tag"><<span class="hljs-title">hr</span>/></span><span class="vbscript"><%--<jsp:include page=<span class="hljs-string">"/jspfragments/head.jsp"</span>/>使用jsp:include标签引入资源<jsp:include page=<span class="hljs-string">"/jspfragments/foot.jsp"</span>/>--%></span></code>
运行结果:
在实际开发中,使用pageContext的include
方法引入页面这种做法也很少用,一般都使用jsp:include
标签引入资源,因此这种做法了解一下即可。
- JSP九大内置对象
- JSP内置九大对象
- JSP九大内置对象
- JSP九大内置对象
- jsp 九大内置对象
- JSP九大内置对象
- JSP九大内置对象
- JSP九大内置对象
- Jsp九大内置对象
- JSP九大内置对象
- JSP九大内置对象
- JSP九大内置对象
- JSP九大内置对象
- JSP九大内置对象
- jsp九大内置对象
- JSP九大内置对象...
- jsp九大内置对象
- JSP九大内置对象
- MongoDB基本命令用
- android 获取状态栏高度
- 如何提高oracle的查询速度(详解)
- 给字符串分配容量
- 《thinking-in-java》读书笔记-第15章-泛型(一)
- jsp九大内置对象
- I/O流类库(四)
- Linux进程监测命令ps
- Android代码内存优化建议-OnTrimMemory优化
- 深度学习与计算机视觉系列(6)_神经网络结构与神经元激励函数
- CC2538之TinyOS例程实验:10-CoAPServer zigbee灯光无线控制实验
- 不喜欢的喜欢
- test
- CSS阴影效果