JSP 注释
<%-- 注释内容 --%>
与 JSP 注释形成对比的是 HTML 注释:
<!-- 注释内容 -->
上述两种注释都可用在 JSP 页面中,唯一的区别是 HTML 的注释可以通过源代码查看到,但 JSP 的注释是无法通过源代码查看到,即 JSP 注释不会被发送到客户端。
JSP 声明
JSP 声明用于声明变量和方法。声明的变量和方法会转换成对应 Servlet 的成员变量或成员方法。
JSP 声明的语法板式如下:
<%! 声明部分 %>
注意:
由于 JSP 声明语法定义的变量和方法对应于 Servlet 类的成员变量和方法,所以 JSP 声明部分定义的变量和方法可以使用 private、public 等访问控制符修饰,也可使用 static 修饰,将其变成静态变量和静态方法。但不能使用 abstract 修饰声明部分的方法,因为抽象方法将导致 JSP 对应的 Servlet 变成抽象类,从而导致无法实例化。
输出 JSP 表达式
<%=表达式%>
输出表达式语法后不能有分号
JSP 脚本
<%
脚本内容(可以放置任何可执行语句)
%>
JSP 脚本将转换成 Servlet 里 _jspService 方法的可执行代码。这意味着在 JSP 脚本部分也可以南明变量但在 JSP 脚本部分声明的变量是局部变量,不能使用 private、public 等访问控制符修饰,也不可以使用 static 修饰。
注意:
实际上不仅 JSP 脚本部分会转换成 _jspService 方法里的可代码,JSP 页面里的所有静态内容都将由 _jspService 方法里输出语句输出。
由于 JSP 脚本将转换成 _jspService 方法里的可挨靠代码,而 Java 语法不允许在方法里定义方法,所以 JSP 脚本里不能定义方法。
JSP 的 3 个编译指令
JSP 的编译指令是通知 JSP 引擎的消息,它不直接生成输出。编译指令都有默认值,因此开发人员无须为每个指令设置值。
常用的编译指令有如下三个:
- page:该指令是针对当前页面的指令
- include:用于指定包含另一个页面
- taglib:用于定义和访问自定义标签
编译指定的语法格式如下:
<%@ 编译指定名 属性名="属性值"···%>
page 指令
page 指令通常位于 JSP 页面的顶端,一个 JSP 页面可以使用多条 page 指令。page 指令的语法格式如下:
<%@ page
[language="java"]
[extends="package.class"]
[import="package.class|package.*,..."]
[session="true|false"]
[buffer="none|8kb|size kb"]
[autoFlush="true|false"]
[isThreadSafe="true|false"]
[info="text"]
[errorPage="relativeURL"]
[contentType="mimeType[;charSet=characterSet]"|"text/html;charSet=utf-8"]
[pageEncoding="utf-8"]
[isErrorPage="true|false"]
%>
page 指令相关属性说明:
-
language
- 声明当前 JSP 页面使用的脚本语言的各类,因为页面是 JSP,该属性的值通常都是 java。该属性的默认值也是 java,所以通常无须设置。 extends
- 指定 JSP 页面编译所产生的 Java 类所继承的父类,或所实现的接口。 import
- 用来导入包,必须使用全限定类名。下面几个包是默认自动导入的,不需要显式导入。默认导入的包有:java.lang.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*。 session
- 设定这个 JSP 页面是否需要 HTTP Session。默认为 true。 buffer
- 指定输出缓冲区的大小。输出缓冲区的 JSP 内部对象:out 用于缓存 JSP 页面对客户端浏览器的输出,默认值为 8kb,可以设置为 none,也可以设置为其他值,单位为 kb。 autoFlush
- 当输出缓冲区即将溢出时,是否需要强制输出缓冲区的内容。设置为 true 时为正常输出;如果设置为 false,则会在 buffer 溢出时产生一个异常。 info
- 设置该 JSP 程序的信息,也可以看做其他说明,可以通过 Servlet.getServletInfo() 方法获取该值。如果在 JSP 页面中,可直接调用 getServletInfo() 方法获取该值。 errorPage
- 指定错误处理页面。如果本页面产生了异常或者错误,而该 JSP 页面没有对应的处理代码,则会自动调用该属性所指定的 JSP 页面,该页面须指定 isErrorPage 属性为 true。 因为 JSP 内建了异常机制支持,所以 JSP 可以不处理异常,即使是 checked 异常。 isErrorPage
- 设置本 JSP 页面是否为错误处理程序。默认为 false。如果该页面是错误处理页面,则须指定 idErrorPage 属性为 true。 contentType
- 用于设定生成网页的文件格式和编码字符集,即 MIME 类型和页面字符集类型,默认的 MIME 类型是 text/html;默认的字符集类型为 ISO-8859-1。 pageEncoding
- 指定生成网页的编码字符集。
include 指令
使用 include 指令可以将一个外部文件嵌入到当前 JSP 文件中,同时解析这个页面中的 JSP 语句(如果有的话)。这是个静态的 include 语句,它会把目标页面的其他编译指令也包含进来,但动态 include 则不会。
include 既可以包含静态的文本,也可以包含动态的 JSP 页面。静态的 include 编译指令会将被包含的页面加入本页面,融合成一个页面,因此被包含页面甚至不需要是一个完整的页面。
include 编译指令的方法如下:
<%@ include file="relativeURLSpec"%>
如果被嵌入的文件经常需要改变,建议使用 <jsp:include>
操作指令,因为它是动态的 include 语句。
注意:
静态包含还会将被包含页面的编译指令也包含进来,如果两个页面的编译指令冲突,那么页面就会出错。
JSP 的 7 个动作指令
动作指令和编译指令不同,编译指令是通知 Servlet 引擎处理消息,而动作指令只是运行时的动作。编译指令在将 JSP 编译成 Servlet 时起作用;而动作指令通常可替换成 JSP 脚本,它只是 JSP 脚本的标准化写法。
JSP 动作指令主要有如下 7 个:
- jsp:forward:执行页面转向,将请求的处理转发到下一个页面
- jsp:param:用于传递参数,必须与其他支持参数的标签一起使用
- jsp:include:用于动态引入一个 JSP 页面
- jsp:plugin:用于下载 JavaBean 或 Applet 到客户端执行
- jsp:useBean:创建一个 JavaBean 实例
- jsp:setProperty:设置 JavaBean 实例的属性值
- jsp:getProperty:输出 JavaBean 实例的属性值
forward 指令
forward 指令用于将页面响应转发到另外的页面。既想尽转发到静态的 HTML 页面,也可憎转发到动态的 JSP 页面,或者 转发到容器中的 Servlet。
JSP 的 forward 指令的格式如下:
<!-- JSP 1.0 -->
<jsp:forward page="relativeURL|<%=expression%>"/>
<!-- JSP 1.1 + -->
<jsp:forward page="relativeURL|<%=expression%>">
[
<jsp:param name="" value=""/>
...
]
</jsp:forward>
从 JSP 1.1 规范开始,增加了转发时增加额外的请求参数的功能,增加的请求参数可通过 HttpServletRequest.getParamter() 方法获取。
<jsp:forward>
指令并没有重新向新页面发送请求,它只是完全采用了新页面来对用户生成响应,即请求依然是一次请求,所以:
- 执行 forward 指令转发时,用户请求的地址(浏览器地址栏的 URL)不会发生改变
- 执行 forward 指令转发时,客户端的请求参数不会丢失
include
include 指令是一个动态的 include 指令,也用于包含某个页面,它不会导入被 include 页面的编译指令,仅仅将被导入页面的 body 内容插入本页面。
JSP 的 include 指令的语法格式如下:
<jsp:include page="relative|<%=expression%>" flush="true"/>
<jsp:include page="relative|<%=expression%>" flush="true">
<jsp:param name="parameterName" value="parameterValue"/>
</jsp:include>
flush 属性用于指定输出缓存是否转移到被导入文件中。如果指定为 true,则包含在被导入文件中;如果指定为 false,则包含在原文件中。对于 JSP 1.1 及更旧的版本,只能设置为 false。默认值为 false。
总结:
- 动态导入和静态导入的区别
- 静态导入是将被导入页面的代码完全融入,两个页面融合成一个整体 Servlet;而动态导入则在 Servlet 中使用 include() 方法来引入被导入页面的内容
- 静态导入时被导入页面的编译指令会起作用;而动态导入时被导入页面的编译指令则失去作用,只是插入被导入页面的 body 内容
- 动态导入还可以增加额外的参数
- forward 和 include 的异同
- 两者都是采用方法来引入目标页面。通过查看 JSP 页面所生成的 Servlet 代码得出:forward 指令使用 forward() 方法来引入目标页面,而 include 指令则使用 include() 方法来引入目标页面
- 执行 forward 时,被 forward 的页面将完全替换原有页面;而执行 include 时,被 include 的页面只是插入原有页面。
useBean、setProperty、getProperty
这三个指令都是与 JavaBean 相关的指令,其中 useBean 指令用于在 JSP 页面中初始化一个 JavaBean 实例;setProperty 指令用于为 JavaBean 实例的属性设置值;getProperty 指令用于输出 JavaBean 实例的属性。
useBean 的语法格式如下:
<jsp:useBean id="name" class="className" scope="page|request|session|application"/>
说明:
id 属性是 JavaBean 的实例名,class属性确定 JavaBean 的实现类。scope 属性用于指定 JavaBean 实例的作用范围,该范围有以下 4 个值:
- page:该 JavaBean 实例仅在该页面有效
- request:该 JavaBean 实例在本次请求有效
- session:该 JavaBean 实例在本次 session 内有效
- application:该 JavaBean 实例在本应用内一直有效
setProperty 指定的语法格式如下:
<jsp:setProperty name="beanName" property="propertyName" value="value"/>
说明:
name 属性确定需要设定 JavaBean 的实例名;property 属性确定需要设置的属性名;value属性则确定需要设置的属性值。
getProperty 指定的语法格式如下:
<jsp:getProperty name="BeanName" property="propertyName"/>
说明:
name 属性确定需要输出的 JavaBean 的实例名;property 属性确定需要输出的属性名。
注意:
对于 setPorperty 和 getProperty 指令,JavaBean中是否真正定义了对应字段并不重要,因为其底层调用的是 getter 和 setter,所以,要使用这两个指令进行赋值和取值,在 JavaBean 中必须提供对应字段的 getter 和 setter。
plugin
plugin 指令用于下载服务器端的 JavaBean 或 Applet 到客户端执行。由于程序在客户端执行,因此客户端必须安装虚拟机。
实际由于现在很少使用 Applet,而且就算要使用 Applet,我们完全可以使用支持 Applet 的 HTML 标签,所以 jsp:plugin 标签的使用场景并不多,此处不做详细介绍。
param
param 指令用于设置参数值,这个指令本身不能单独使用,因为单独的 param 指令没有实际意义。param 指令可以与以下三个指令结合使用:
- jsp:include
- jsp:forward
- jsp:plugin
param 指令的语法格式如下:
<jsp:param name="paramName" value="paramValue"/>