深入体会JavaWeb开发内幕——JSP技术简介之二JSP中的指令和out隐式对象

深入体验JavaWeb开发内幕——JSP技术简介之二JSP中的指令和out隐式对象
一、JSP指令

      JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。在JSP 2.0规范*定义了三个指令:
          •page指令
         •Include指令
             •taglib指令
 
    JSP指令的基本语法格式:

              <%@ 指令 属性名="值" %>

   举例:<%@ page contentType="text/html;charset=gb2312"%>
     l如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。
   例如:
      <%@ page contentType="text/html;charset=gb2312"%>
     <%@ page import="java.util.Date"%>
    也可以写作:
      < %@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>

1.page指令:

       page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。
      JSP 2.0规范中定义的page指令的完整语法:

          其中,深入体会JavaWeb开发内幕——JSP技术简介之二JSP中的指令和out隐式对象

深入体会JavaWeb开发内幕——JSP技术简介之二JSP中的指令和out隐式对象

深入体会JavaWeb开发内幕——JSP技术简介之二JSP中的指令和out隐式对象

深入体会JavaWeb开发内幕——JSP技术简介之二JSP中的指令和out隐式对象

深入体会JavaWeb开发内幕——JSP技术简介之二JSP中的指令和out隐式对象


 

 对于page指令中相关属性的理解:

    language:用以指定jsp中的脚本语言一般默认为“java”

   

    extends:为jsp解析引擎指明所要继承的Servlet类一般默认的继承“HttpBaseServlet”

   

         import:指明jsp脚本中所要用到的包,可以连续导中间用逗号分隔即可。


      session:为JSP解析引擎指定是否要产生session隐式对象。


       buffer:为JSP隐式对象out的缓冲区,默认为8kb,其大小可以*设置。


     autoFlush:为JSP隐式对象out的缓冲区指明是否自动刷新buffer缓冲区。

  

      isThreadSafe:为JSP解析引擎指明当前的JSP页面是否为线程安全的页面。

  

      infor:指明通过解析引擎为该jsp页面添加的备注信息类型。一般为text。


           errorPage:为JSP解析引擎指明如果当前的jsp页面是错误页面的话所要跳转到的其他页面。

   

         isErrorPage:为JSP解析引擎指明当前的jsp页面是否为错误页面。

      

        contentType:为JSP解析引擎的响应消息设置编码方式,如果没有pageEncoding的话该设置也对当前的jsp页面起作用。


          pageEncoding:为当前页面及JSp解析引擎设置请求和响应时的编码方式。一般情况下只需用它进行相关编码问题的处理。


          isELIgnoried:为JSP解析引擎指明是否忽略jsp页面中的EL表达式。

 

使用page指令解决JSP中文乱码

 JSP程序存在有与Servlet程序完全相同的中文乱码问题

      输出响应正文时出现的中文乱码问题

 

    读取浏览器传递的参数信息时出现的中文乱码问题

 

JSP引擎将JSP页面翻译成Servlet源文件时也可能导致中文乱码问题

        JSP引擎将JSP源文件翻译成的Servlet源文件默认采用UTF-8编码,而JSP开发人员可以采用各种字符集编码来编写JSP源文件,因此,JSP引擎将JSP源文件翻译成Servlet源文件时,需要进行字符编码转换。

        如果JSP文件中没有说明它采用的字符集编码,JSP引擎将把它当作默认的ISO8859-1字符集编码处理。

 

如何解决JSP引擎翻译JSP页面时的中文乱码问题


      page指令的pageEncoding属性说明JSP源文件的字符集编码

 

2、include指令

  include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。

 

语法:

       <%@include file="relativeURL"%>

       其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。

 

细节:

      被引入的文件必须遵循JSP语法。


         被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。


          由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。

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

Page

exception

Out

pageContext

二、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页面结束


深入体会JavaWeb开发内幕——JSP技术简介之二JSP中的指令和out隐式对象


             好了今天就到这里吧!