【JavaWeb】JSP运行原理和九大隐式对象

xiaoxiao2021-02-28  63

【运行原理】

       每个jsp页面在第一次被访问的时候 ,web容器都会把请求交给jsp引擎(即一个Java程序)去处理。jsp引擎先将jsp翻译成一个jsp servlet,然后按照servlet调用方式进行调用。        由于jsp第一次访问时翻译成servlet,所以第一次访问通常比较慢,第二次访问,jsp引擎发现jsp没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。

【九大隐式对象】

       在调用jsp对应的jsp servlet时,会传递或创建9个与web开发相关的对象供jsp servlet使用。特此定义9个相应变量便于开发人员编写jsp页面时,获得web对象引用。在jsp页面通过这些变量,就可以快速获得9大对象的引用。                    

【Out 隐式对象】

       作用:向客户端发送文本数据        通过调用pageContext对象的getOut方法返回,作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象很相似。        jsp页面中out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置jsp页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。        只有向out对象中写入了内容,且满足如下任何一个条件是,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区的内容真正写入到servlet引擎提供的缓冲区中。          1.设置page指令的buffer属性关闭了out对象的缓存功能          2.out对象的缓冲区已满          3.整个jsp页面结束

       在jsp页面中,写下面两行代码:

Out.write("one"); Response.getWriter().write("two");

       谁会先输出呢?        答案并不是先one后two,而是先two后one。为什么呢?        因为jsp页面的内容,最后会通过out输出,out会有缓冲,所以显示信息还是会在response.getwriter().write("two") 输出的two之后。                                        使用建议:输出对象最好使用隐式输出,不要用response输出。

【pageContext对象】

       JSP技术中最重要的一个对象,它代表jsp页面的运行环境。        这个对象不仅封装了对其它8大隐式对象的引用,自身还是一个域对象,可以用来保存数据。封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源,检索其它域对象中的属性等。        通过pageContext 可以获得其他对象:        getException、 getPage、 getRequest、 getResponse、 getServletConfig 、getServletContext 、 getSession、 getOut 。

       pageContext封装其它8大内置对象的意义

       用在自定义标签开发技术。

       良好的jsp页面是不允许出现一行Java代码的,但不可避免的要写Java代码,就需要用自定义标签技术来移除,就是把Java代码移到自定义标签里面去。你需要围绕标签写Java类,但是传8个对象到Java类里是很麻烦的,所以自定义标签技术就只传一个pageContext过去,传一个pagecontext过去就相当于把剩下的8个对象也都传过去了。

       pageContext对象的方法 getAttribute getAttribute removeAttribute

       page域是四个域对象中最小的。

       四大域和对象的对应 :

       page域——pagecontext对象,生命周期在整个页面范围内        request域——request对象,生命周期在请求范围内        session域——session对象,生命周期在会话范围内        application域——servletcontext对象,生命周期在整个web应用内。         pageContext可以访问其它域 。通过getAttribute,管理所有域的入口 request.setAttribute("data","aaa"); String data=(string)pageContext.getAttribute("data",PageContext.REQUEST_SCOPE); out.write(data);

       重点:findAttribute 

pageContext.findAttribute("data"); //page request session application         先从page域里找data,如果没有。就在Request域里找,如果没有。在session里找,如果还没有,在application里找。四个域里都没有,就返回空,任何一个域里有,就返回data的值。      EL表达式就是在jsp页面里取数据的,${data}同样也是依赖上面的这行代码。

       引入和跳转到其它资源

       pageContext类中定义了一个forward方法和两个include方法来分别简化和替代requestDispatcher.forward 和 include方法。方法接收资源以“/”开头,“/”代表当前web应用。

       PS:当然,在Java中完成跳转和引入功能可以有很多种方法实现。

pageContext.forward("/1.jsp"); pageContext.include("/foot.jsp");

【小结】

       对于Java的很多基础的知识还有待充电,本文只介绍了Out和pageContext两个隐式对象,对于其他隐式对象的 总结还在持续中。

      谢谢各位看官的阅读,如有共鸣欢迎交流。

转载请注明原文地址: https://www.6miu.com/read-30618.html

最新回复(0)