深入体会JavaWeb开发内幕——JSP技术简介之二JSP中的指令和out隐式对象
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。在JSP 2.0规范中共定义了三个指令:
<%@ 指令 属性名="值" %>
其中,
对于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页面结束
好了今天就到这里吧!