一. JSP的指令
1. JSP指令简介
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页
面中的其余部分。在JSP 2.0规范中共定义了三个指令:
(1) page指令;
(2) Include指令;
(3) taglib指令;
2. JSP指令的基本语法
(1) 语法格式:<%@ 指令 属性名="值" %>
(2) 举例:<%@ page contentType="text/html;charset=UTF-8"%>
3. 注意事项
(1) 如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。
(2) 举例:
-
<%@ page contentType="text/html;charset=UTF-8"%>
-
<%@ page import="java.util.Date"%>
也可以写作:
<%@ page contentType="text/html;charset=UTF-8" import="java.util.Date"%>
二. include指令
1. 简介
(1) include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP
翻译成一个servlet。所以include指令引入通常也称之为静态引入。
(2) 通常一个网站的头部和底部都是重复的,我们一般都不会去重复的写头部和底部,而是把公共页面的部分抽取
出来放到一个页面中去。
2. 作用
在当前页面用于包含其他页面。
3. 语法
<%@include file="common/header.jsp"%>
其中的file属性用于指定被引入文件的相对路径。 file属性的设置值必须使用相对路径,如果以“/”开头,表示
相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。
4. 注意细节
(1) 被引入的文件必须遵循JSP语法。
(2) 被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里
面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。
(3) 由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令
不能冲突(除了pageEncoding和导包除外)。
(4) include指令的原理是把被包含的页面(header.jsp)的内容翻译到包含页面(index.jsp)中,合并成翻译成一个
java源文件,再编译运行!这种包含叫静态包含(源码包含)。
(5) 如果使用静态包含,被包含页面中不需要出现全局的html标签了!(如html、head、body)
三. page指令
1. 简介
page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页
面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。
2. 作用
告诉tomcat服务器如何翻译JSP文件。
3. 语法
-
<%@ page
-
language=
"java" --告诉服务器使用什么动态语言来翻译jsp文件
-
import="java.util.*" --告诉服务器java文件使用什么包
-
可以在一条page指令的
import属性中引入多个类或包,其中的每个包或类之间使用逗号分隔:
-
-
pageEncoding=
"utf-8" --告诉服务器使用什么编码翻译jsp文件(成java文件)
-
contentType=
"text/html; charset=utf-8" 服务器发送给浏览器的数据类型和内容编码
-
-
errorPage=
"error.jsp" --指定当前jsp页面的错误处理页面。
-
-
isErrorPage=
"false" --指定当前页面是否为错误处理页面。
false,不是错误处理页面,则不能使用exception内置对象;
true,是错误处理页面,可以使用exception内置对象。
-
buffer=
"8kb" --jsp页面的缓存区大小。
-
session=
"true" --是否开启session功能。
false,不能用session内置对象;
true,可以使用session内置对象。
-
isELIgnored=
"false" --是否忽略
EL表达式。
-
%>
4. 注意事项
(1) <%@ page import="java.util.Date,java.sql.*,java.io.*"%>
上面的语句也可以改写为使用多条page指令的import属性来分别引入各个包或类:
-
<%@ page
import=
"java.util.Date"%>
-
<%@ page
import=
"java.sql.*"%>
-
<%@ page
import=
"java.io.*"%>
(2) JSP引擎会根据page指令的contentType属性生成相应的调用ServletResponse.setContentType方法的语
句。
(3) page指令的contentType属性还具有说明JSP源文件的字符编码的作用。在开发工具中,以后只需要设置
pageEncoding即可解决中文乱码问题
(4) errorPage属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注
意不是站点根目录),否则,表示相对于当前页面。
(5) 可以在web.xml文件中使用<error-page>元素为整个WEB应用程序设置错误处理页面,其中的<exception-
type>子元素指定异常类的完全限定名,<location>元素指定以“/”开头的错误处理页面的路径。 如果设置了
某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将不对该页面起作用。
(6) 全局错误处理页面
5. 使用page指令解决JSP中文乱码
(1) 分析
① JSP文件中有个”中国”字符,保存后保存到硬盘中,此时硬盘中就有”中国”的字节(01二进制代码),此时
字符转换成字节也是需要查码表的,用记事本写的保存后是以默认值GBK保存的;
② Tomcat从硬盘中读取到这个文件后就会翻译,把它翻译成一个Java源文件,Java源文件中是一个文件,文件
中也是中文,所以存储的也是字符,字节变字符仍然需要编码,此时查码表就是查pageEncoding=”utf-8”中
声明的码表;
③ 然后进行编译,把它编译成class字节码文件,这个过程也需要查码表,这个时候就是前面源文件保存的时候是
什么编码,那么就编译成什么编码。前面翻译的时候是以”utf-8”翻译的,后面编译也是以”utf-8”编译。所
以是根据源文件的内容的编码来决定的;
④ 字节码文件也需要构造对象运行,运行最后要输出给浏览器,输出给浏览器的过程就需要把字节数据转换成字
符数据,输出到浏览器的过程查看的码表是由contentType = “text/html;charset=utf-8”决定的;
⑤最后,浏览器也需要解码,所以还要看下浏览器的编码设置。
(2) 结论:如果在Eclipse工具中要避免中文乱码问题,只需要写pageEncoding即可。如果用记事本那么就需要
注意别的问题。
(3) JSP程序存在有与Servlet程序完全相同的中文乱码问题
①输出响应正文时出现的中文乱码问题
②读取浏览器传递的参数信息时出现的中文乱码问题
(4) JSP引擎将JSP页面翻译成Servlet源文件时也可能导致中文乱码问题(UTF-8);
(5) 如何解决JSP引擎翻译JSP页面时的中文乱码问题?
答:通过page指令的contentType属性说明JSP源文件的字符集编码或page指令的pageEncoding属性说明JSP
源文件的字符集编码。
四. taglib指令
Taglib指令用于在JSP页面中导入标签库。