一、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大对象的引用。
二、认识九个内置对象no. 内置对象 类型
1 pagecontext javax.servlet.jsp.pagecontext
2 request javax.servlet.http.httpservletrequest
3 response javax.servlet.http.httpservletresponse
4 session javax.servlet.http.httpsession
5 application javax.servlet.servletcontext
6 config javax.servlet.servletconfig
7 out javax.servlet.jsp.jspwriter
8 page java.lang.object
9 exception java.lang.throwable
request,response,session,application,config这些对象在前面都已经作了详细的介绍,这里重点介绍一下剩下的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对象的常用方法
java.lang.object findattribute(java.lang.string name)
重点介绍一下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方法查找属性值
pagecontext的findattribute方法查找属性值 pagecontext.findattribute方法查找到的属性值: pagecontext对象的name1属性: request对象的name2属性: session对象的name3属性: application对象的name4属性: 查找不存在的name5属性: 使用el表达式进行输出: pagecontext对象的name1属性:${name1} request对象的name2属性:${name2} session对象的name3属性:${name3} application对象的name4属性:${name4} 不存在的name5属性:${name5}
运行结果:
el表达式语句在执行时,会调用pagecontext.findattribute方法,用标识符为关键字,分别从page、request、 session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。
pagecontext对象中封装了访问其它域的方法
java.lang.object getattribute(java.lang.string name, setattribute(java.lang.string name, java.lang.object value, removeattribute(java.lang.string name, scope)
代表各个域的常量
pagecontext.page_scope
范例:pagecontext访问其它域
pagecontext访问其它域 取出存放在session对象中的属性值: 第一种做法:使用pagecontext.getattribute("attributename",pagecontext.session_scope);去取出session对象中值 姓名: 第二种做法:使用session.getattribute("attributename");去取出session对象中值 姓名:
3.7、pagecontext引入和跳转到其他资源pagecontext类中定义了一个forward方法(用来跳转页面)和两个include方法(用来引入页面)来分别简化和替代requestdispatcher.forward方法和include方法。
方法接收的资源如果以“/”开头, “/”代表当前web应用。
范例:使用pagecontext的forward方法跳转到其他页面
使用pagecontext的forward方法跳转页面
运行结果如下:
1 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方法引入资源
使用pagecontext的include方法引入资源
运行结果:
在实际开发中,使用pagecontext的include方法引入页面这种做法也很少用,一般都使用jsp:include标签引入资源,因此这种做法了解一下即可。
相关推荐:
jsp的内部对象
js的内置对象详解
以上就是jsp内置对象:pagecontext作用域对象的使用的详细内容。
