2023年11月28日发(作者:)

JSP的学习(3——语法知识⼆之page指令

本篇接上⼀篇《》,继续来学习JSP的语法。本⽂主要从JSP指令中的page指令,对其各个属性进⾏详细的学习:

JSP指令:

JSP指令是为JSP引擎⽽设计的,JSP指令不产⽣任何可见输出,只是告诉在转换成Servlet的过程中如何处理JSP页⾯中的其余部分。

JSP 2.0 规范中共定义了三个指令:

1) page指令

2) include指令

3) taglib指令

taglib指令是导⼊标签库的指令,以后会介绍到。

JSP指令格式:

<%@ 指令(pageincludetaglib) 属性1="属性值" 属性2="属性值" … %>

例如:

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

如果⼀个指令有多个属性,这多个属性可以写在⼀个指令中,也可以分开写。

例如:

1 <%@ page contentType = "text/html;charset=utf-8" %>

2 <%@ page import = "" %>

或者写成:

<%@ page contentType="text/html;charset=utf-8" import="" %>

page指令

page指令⽤于定义JSP页⾯的各种属性,⽆论page指令出现在JSP页⾯中的什么地⽅,它作⽤的都是整个JSP页⾯,为了保持程序的可

读性和良好习惯,page指令最好都放置在整个page页⾯的起始位置。

page指令包含以下属性(属性值为⽰例):

(1). language = “java ” 指⽰JSP页⾯如果嵌⼊的代码为Java代码。

(2). extends = “” 指定当该JSP转换后的Servlet继承哪个类(通常不⽤动)。

(3). import = ”包名.类名或者包名.*” 等等格式,

其中JSP引擎会⾃动导⼊如下包:

.*

t.*

.*

.*

正是因为这样,所以我们在JSP中使⽤像Systemresponserequest这样的类或对象都不需要再另外导包。

使⽤多条page指令的“import”属性进⾏导⼊多个类或包,也可以在⼀条page指令的“import”属性中导⼊多个类或包,其中每个包或者类之

间⽤逗号隔开,例如:

<%@ page import=" , .* " %>

(4). session = “true”(默认值)”false”

若在page指令中将“session”属性置为“true”,那么在JSP转换后的Servlet中将⾃动创建Session对象。

如果我们在page指令中指定“session”属性置为“true”,那么在Tomcat的【work】⽬录下JSP对应的 .java⽂件中就⾃动出现如下代码:

session = sion() ;

这时我们就可以在JSP脚步⽚断中直接使⽤session,如果在page指令中指定“session”属性置为“false”,那么就不能在JSP脚步⽚断中直

接使⽤session,想使⽤就⼿动获取 (sion())

(5). buffer = “none” ”8 kb”(默认值) ⾃定义值kb”

指定JSP页⾯是否需要缓冲。即我们直到JSP转换后的Servlet中包含⼤量的通过out对象进⾏输出,但输出的数据并⾮直接写给浏览器,

⽽是直到缓冲满时才将数据发送回浏览器上。

(6). autoFlush = “true”(默认值) ”false”

指定JSP页⾯是否⾃动刷新。

(7). isThreadSafe = “true”(默认值) ”false”

JSP中的“isThreadSafe”属性如果设置为“false”,那么表⽰转换后的Servlet将会继承SingleThreadMode接⼝,以Singleton(单线程)模式

运⾏,这种模式同⼀个时刻只允许⼀个实例,若多个⽤户同时访问该JSP,那么只有先访问者完全访问完该页⾯后,后访问者才能开始进⾏

访问。

例:未设置“isThreadSafe”属性时:

设置“isThreadSafe”属性为“false”后:

⽽如果“isThreadSafe”属性设置为“true”,默认值也是“true”,那么表⽰转换后的Servlet以多线程⽅式运⾏,是线程安全的。

(8). info = “⾃定义信息…”

⽤于在JSP页⾯中定义⼀些说明,可以在Servlet中通过getServletInfo()⽅法获取通过page指令获取”info”的值。

(9). errorPage = “/ 相对URL ”

JSP页⾯错误,或者其中的Java程序出错,抛出异常没有处理,那么在浏览器上访问的JSP页⾯可以跳转到“errorPage”属性指定的某

个页⾯,友好显⽰。

注意,”errorPage”属性的值是相对于web应⽤下的地址(给服务器端的地址,因为抛出异常的话是由服务器来处理跳转到哪个页⾯)。

例如:在web⼯程【JSPLearning】下,创建⼀个【exceptions】⽬录,并在该⽬录下新建⼀个“”,同时记住将该JSP中的JSP

指令中的pageEncoding改为⽀持中⽂格式的编码,内容如下:

1 <body>

2 对不起,你的页⾯内容有错。。。

3 body>

在该web⼯程的【WebRoot】即根⽬录下创建⼀个“”⽂件,写⼊⼀段JSP脚本⽚断:

1 <%

2 int x = 1;

3 (1/0); //会抛出异常

4 %>

同时在该JSP的上部添加进JSP指令,这⾥直接写了属性:

errorPage = "/exceptions/"

那么现在我们来访问这个web应⽤的“”页⾯,可以看到:

会抛出我们没有处理的异常的JSP⾃动跳转到了我们在“errorPage”属性设置的页⾯,这样⽤户就不会看到那些经典505页⾯和⾥⾯各

种异常的说明了。

题外话:

当我们是个⼤项⽬时,⾥⾯会有很多个⽹页,当这些⽹页多起来后,如果对每个JSP⽹页都设置“errorPage”肯定是不切实际的。这时我

们就可以在⽂件中设置错误处理页⾯。如果要将Tomcat中所有的web应⽤设置,就在Tomcat的【conf】⽂件下的⽂件中设

置;如果只对某个web应⽤设置错误处理页⾯,就在该web应⽤中【WEB-INF】⽬录下的⽂件中设置。

⽂件中使⽤标签为整个web应⽤程序设置错误处理页⾯,其中⼦元素指定具体异常完整包名和

异常名称,标签指定以“/”开头的错误处理页⾯的路径(也是以web应⽤为根⽬录的路径,即服务器端的路径)。

我们对上⾯的例⼦进⾏重新改写,将包含“errorPage”属性的page指令从中删除,由于我们知道在⽂件中我们的JSP脚本⽚断

会抛出ArithmeticException异常,因此记下这个异常及异常的包名路径,之后需要添加到标签中。

接着我们我们到web⼯程【JSPLearning】中的【WEB-INF】⽬录下的⽂件,添加下⾯⼏句代码:

1 <error-page>

2 <exception-type>eticExceptionexception-type>

3 <location>/exceptions/location>

4 error-page>

完成上⾯的⼯作之后,当访问该web应⽤下的某个资源(不管是JSP还是Servlet等等),只要会抛出ArithmeticException这个异常,服

务器会⽴马将资源跳转到指定这个异常的错误处理页⾯,在我们的例⼦中是/exceptions/,再次访问还是看到同样的效果:

这样就完成了在⼀个web应⽤中进⾏全部资源的错误处理页⾯的配置,当然这点有⼀个不⾜的地⽅就是使⽤这种⽅法必须指明会发⽣何

种错误异常(必须指明)。但如果使⽤就可以免去这种烦扰,后⾯会说到。

另外⼀个,采⽤这种⽅法时,如果浏览器,⽐如说IE,在其【⼯具】--->Internet选项】中,选择【⾼级】,找到⼀个【显⽰友好

HTTP错误信息】,如下图所⽰:

通常这个选项浏览器默认是勾选上的,这会有⼀个什么问题呢,就是采⽤在⽂件中配置这元素时,如果我们的错

误处理页⾯中的内容太少,不⾜1024字节,那么在浏览器是⽆法正常跳转到错误处理页⾯的,⽐如说我们刚才的/exceptions/中将

标签内容就设置为:ERROR!,内容够少了吧,那么我们重新打开浏览器来访问

可以看到⽆法看到错误处理页⾯。

两种解决⽅式:1,将【Internet选项】中的【显⽰友好HTTP错误信息】钩去除;2,在/exceptions/错误处理页⾯中将内容添加

超过1024字节(多添加点很容易就超过了)。以上两种⽅法都可以重新看到错误处理页⾯。

上⾯说到在中可以设置这个⼦元素,但是我们必须给定明确的异常,毕竟⿇烦。但是在中还

可以设置这个⼦元素,这个元素⽤来表明当浏览器访问遇到错误响应码时应该访问哪些页⾯,有哪些错误的响应码呢?

404500!眼熟吗,T_T

我们继续以上⾯的web⼯程【JSPLearning】为例,在之前的【exceptions】⽬录下新建⼀个,添加⾃定义内容。

接着我们继续在该web⼯程的中添加如下代码:

1 <error-page>

2 <error-code>404error-code>

3 <location>/exceptions/location>

4 error-page>

当我们访问⼀个在web应⽤中不存在的资源时,服务器就会帮我们跳转到这个出现404错误⽽设置的错误处理页⾯,友好显⽰:

可以看到,这样就⽐指定特别异常要⽅便的多,当然指定某个特定异常⾃然有其作⽤的地⽅,这些都要靠实际情况来考虑。

题外话讲多了,不过这都是对开发有帮助的技巧。这⾥最后说明⼀点,如果在某个页⾯中设置了“errorPage”属性的page指令,那么在

⽂件中设置的两种形式都对其没有作⽤,也就是说JSP页⾯只先认page指令的“errorPage”属性。

(10). isErrorPage = “true” ”false”(默认值)

结合上⼀点,当我们将某个JSP页⾯设置为错误处理页⾯,那么我们最好将该页⾯设置page指令的“isErrorPage”属性,并置其

“true”

这么做有什么好处呢?当这个错误处理JSP页⾯之后被转换成Servlet后,在这个Servlet中会⾃动⽣成⼀个异常对象exception,该对象封装

了之前错误访问的⼀些信息。记住,如果在错误处理页⾯中没有设置page指令的“isErrorPage”属性或者说为”false”的话,那么转换之后的

Servlet是不会有这个exception对象的。

那么我们还是以上⾯的web⼯程【JSPLearning】为例,当我们为/exceptions/这个JSP设置了page指令的“isErrorPage”属性:

<%@ page isErrorPage="true" %>

让浏览器访问⼀次有错误代码的使得浏览器跳转到错误处理页⾯后,我们到Tomcat的【work】⽬录下查看 error_⽂件,我

们会发现在error_jsp这个类中的_jspService()⽅法中多出了对exception对象的定义,这是没有设置“isErrorPage””true”JSP转换Servlet

所没有的:

这个exception对象同out对象,page对象等,都是可以在JSP中直接使⽤的,切记这个对象⼀定是在那些声明了“isErrorPage””true”JSP

中直接使⽤。

(11). contentType = “ MIME类型/对应类型 [(;chrset=某个编码表)可选] ”

page指令中的“contentType”属性告诉JSP引擎(或Tomcat)该JSP页⾯的类型,例如:

<%@ page contentType="text/html; charset=ISO-8859-1" %>

JSP转换到Servlet时,会根据page指令中的“contentType”属性⽣成相应的调⽤tentType(…)⽅法语句。

“contentType”属性是⽤来通知浏览器以什么码表来解码打开JSP(其实是Servlet)中的内容。

这个属性可以⽤来解决JSP中可能出现的乱码问题,这个问题我们以后会讨论到。

(12). pageEncoding = “某个编码表

page指令的属性“pageEncoding”指定服务器以什么码表将JSP⽂件翻译成.java⽂件中的内容。当设置了这个“pageEncoding”属性之

后,其实也默认将“contentType”属性中的编码表设置的和它⼀样,所以总结来说我们只需设置“pageEncoding”属性即可。

(13). isELIgnored = “true” “false”(默认值)

告诉JSP引擎(或Tomcat)该JSP页⾯是否忽略EL表达式。默认值为“false”JSP均⽀持EL表达式。