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指令格式:
<%@ 指令(如page、include或taglib) 属性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中使⽤像System,response,request这样的类或对象都不需要再另外导包。
使⽤多条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】⽬录下的⽂件中设置。
在⽂件中使⽤
异常名称,
我们对上⾯的例⼦进⾏重新改写,将包含“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字节(多添加点很容易就超过了)。以上两种⽅法都可以重新看到错误处理页⾯。
上⾯说到在
可以设置
404!500!眼熟吗,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指令,那么在
⽂件中设置的
(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表达式。


发布评论