JSP编译指令详解

来源:互联网 发布:迅雷快鸟网络异常 编辑:程序博客网 时间:2024/06/07 04:50

JSP编译指令:通知jsp引擎的消息

作用:设置jsp程序的属性以及由该jsp生成的serverlet里的属性

jsp常用的编译指令有:

  • page:该指令是针对当前页面的指令。
  • include :用于指定如何包含另一个页面。
  • taglib:用于定义和访问自定义标签。

1.page指令:

page指令主要用于定义当前jsp的全局指令,包括当前jsp所使用的脚本语言类型,需要导入java包的列表等等,一般情况下page编译指令位于页面的最上方,一个页面可以有多个编译配置指令。

page指令属性:

  • language

    声明当前JSP页面使用的脚本语言的种类。目前该属性的值只能为java,默认值也为java,所以通常无须设置。

  • import

    用来导入包。默认导入的包有:java.lang.*, javax.servlet.*, javax.servlet.http.*, javax,.servlet.jsp.*.

  • contentType

    告知客户端,服务器对此次请求响应的正文格式(MIME类型)和编码字符集。默认为contentType="text/html;charset=UTF-8ISO-8859-1"。如设置为:contentType="text/html;charset=UTF-8",就是告诉客户端,服务器响应的正文文件格式为text/html,这样客户端就会用默认的浏览器方式打开文件,而不用别的应用程序。charset=UTF-8告知客户端浏览器,服务器返回的文件编码格式为UTF-8,浏览器将按照UTF-8格式进行解码并且以UTF-8字符集进行页面显示。contentType的作用本质上相当于模拟了一个Http协议的消息头。contentType虽然写在JSP文件中,但是因为JSP文件其实并不能直接响应客户端请求,它必须编译成对应的Servlet以后才能响应请求。所以本质上这个contentType是针对Servlet的设置,即Servlet告诉客户端,我返回的文件(以流的形式,response.getWriter())的MIME类型为text/html,文件的编码字符集为UTF-8。

  • pageEncoding

    设定JSP源文件保存时所使用的编码。因为JSP文件要想响应客户端的请求,它就必须先被编译成一个Servlet,而Servlet是一个Java类,Java类在内存中是以Unicode进行编码的,如果JSP引擎(将JSP翻译成对应的Servlet)不知道JSP的编码格式,就无法进行解码,然后将其转换成内存中的Unicode编码。注意区分contentType的charset和pageEncoding,charset是响应时Servlet(JSP已经编译成了Servlet)告诉客户端浏览器”我“是以这种字符编码的,”你“也要以这种字符解码并显示,整个过程涉及服务器和客户端两方面,而pageEncoding是服务器端JSP文件告诉JSP引擎要以何种编码进行解码,即此时JSP还没被编译成Servlet,它是被编译成Servlet的前提准备工作,整个过程都发生在服务器端,与客户端无关。

  • session

    设定这个JSP页面是否支持session机制,默认为true,所以一般不需要设置,保持默认值即可。

  • errorPage

    指定错误处理页面的地址。如果本页面产生了异常或者错误,而该JSP页面没有对应的处理代码,此时就会自动调用该属性所指向的JSP页面。

  • isErrorPage

    和errorPage属性配合使用。设置本JSP页面是否为错误处理页面。

  • info

    设置该JSP程序(不要忘记本质上是个Servlet)的信息,也可以看做其说明。可以通过Servlet.getServletInfo()方法获取该值。在JSP页面中,可以直接调用getServletInfo()方法获取该值如:<%=getServletInfo()%>.因为JSP是Servlet,而任何一个Servlet都实现了Servlet接口,Servlet接口中含有getServletInfo()方法。

  • extends

    指定JSP编译生成的Servlet所继承的父类或所实现的接口,一般很少用。

  • buffer

    指定输出缓冲区的大小。JSP的隐含对象out(JSP有九大隐含对象或者说内置对象)用于缓存JSP(其实是Servlet)对客户端浏览器的输出,默认值为8KB,可以设置为none,也可以设置为其他的值,单位为KB。

  • autoFlush

    当输出缓冲区即将溢出时,是否需要强制输出缓冲区的内容。设置为true时可以正常输出,设置为false时,则会在buffer溢出时产生一个异常。默认为true。最常用的是import,contentType,pageEncoding,最常见的最简单的JSP模版为:

    <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>

  • isELIgnored

    如果设定为真,那么JSP中的表达式被当成字符串处理。比如下面这个表达式<p>${2000/20}</p>在isELIgnored="true"时输出为${2000/20},而isELIgnored="false"时输出为100.0。默认为false。

  • isThreadSafe

    用来指定该JSP文件是否支持多线程使用。如果设置为true,则表示该JSP文件支持多线程的使用,也就是表示该JSP文件能够同时处理多个用户的请求;如果设置为false,则表示该JSP文件不支持多线程的使用,也就是表示该JSP文件只能一次处理一个用户的请求。isThreadSafe属性的默认值为true

  • trimDirectiveWhitespaces

    可以使jsp输出的html时去除多余的空行(jsp上使用EL和tag会产生大量的空格和空行)。

  • deferredSyntaxAllowedAsLiteral

    该属性指示在JSP页面的模板文本中是否允许出现字符序列#{。如果该属性的值为false(默认值),当模板文本中出现字符序列#{时,将引发页面转换错误。

    该属性是在JSP 2.1规范中引入的,字符序列#{被保留给表达式语言使用,你不能在模板本中使用字符序列#{。如果在模板文本中需要出现字符序列#{,那么可以将该属性设置为true。


演示isErrorPage属性:

  1. 新建一个get_error.jsp文件用来人为制造异常
  2. 创建handle_error.jsp用来处理异常
  3. 配置page属性,实现访问get_error页面跳转到handle_error

get_error.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java"  %><html><head>    <title>人为异常</title></head><body><%    int a=4;    int b=0;    int c=a/b;%></body></html>

handle_error.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %><html><head>    <title>处理异常</title></head><body>界面发生了异常</body></html>

运行IDEA启动项目,如图所示:

更新源码

界面显示:

02_异常处理

假如我们删除isErrorPage属性,则页面会显示错误信息:

未处理异常

2.include指令:

include是jsp的静态包含指令,使用此指令可将一个外部文件包含到jsp程序中。外部文件可以是html文件也可以是jsp文件。
假如是jsp文件,在导入进来之前会先解析jsp文件中的语句。
注意:在include指令中包含页面和被包含页面同一类型的参数不能被定义两次。

include指令的语法如下:
<%@ include file="relativeURLspec" %>

3.taglib指令

taglib指令允许页面使用用户定制的标签。
taglib指令的语法如下:
<%@ taglib (uri="tagLibraryURI" | tagdir="tagDir") prefix="tagPrefix" %>

taglib指令有三个属性:

  • uri

    :该属性唯一地标识和前缀(prefix)相关的标签库描述符,可以是绝对或者相对的URI。这个URI被用于定位标签库描述符的位置。

  • tagdir

    :该属性指示前缀(prefix)将被用于标识安装在/WEB-INF/tags/目录或其子目录下的标签文件,一个隐含的标签库描述符被使用。
    下面三种情况将发生转换(translation)错误:
    属性的值不是以/WEB-INF/tags/开始。
    属性的值没有指向一个已经存在的目录。
    该属性与uri属性一起使用。

  • prefix

    :定义一个prefix:tagname形式的字符串前缀,用于区分多个自定义标签。以jsp:,jspx:,java:,javax:,servlet:,sun:和sunw:开始的前缀被保留。前缀的命名必须遵循XML名称空间的命名约定。在JSP 2.0规范中,空前缀是非法的。

1 0