2.11 JSP2特性

2.11 JSP2特性

目前Servlet3.1对应于JSP2.3规范,JSP2.3也被统称为JSP2。相比JSP1.2,JSP2主要增加了如下新特性。

  • 直接配置JSP属性。
  • 表达式语言。
  • 简化的自定义标签API
  • Tag文件语法

如果需要使用JSP2语法,其web.xml文件必须使用Servlet2.4以上版本的配置文件。Servlet2.4以上版本的配置文件的根元素写法如下:

<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd" version="2.4">

</web-app>

本书所给出的Web应用都是使用Servlet3.1规范,也就是对应于JSP2.3规范,因此完全支持JSP2的特性。Servlet3.1规范的web-app元素的写法如下:

<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
    http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

</web-app>

2.11.1 配置JSP属性

JSP属性定义使用<jsp-property-group>元素配置,主要包括如下4个方面。

  1. 是否允许使用表达式语言:使用<el-ignored>元素确定,默认值为flase,即允许使用表达式语言。
  2. 是否允许使用JSP小脚本:使用<scripting-invalid>元素确定,默认值为false,即允许使用JSP小脚本。
  3. 声明JSP页面的编码:使用<page-encoding>元素确定,配置该元素后,可以代替每个页面里page指令contentType属性的charset部分。
  4. 使用隐式包含:使用<include-prelude><include-coda>元素确定,可以代替在每个页面里使用include编译指令来包含其他页面。(此处隐式包含的作用与JSP提供的静态包含的作用相似。)

下面的web.xml文件配置了该应用下的系列属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 关于JSP的配置信息 -->
<jsp-config>
<jsp-property-group>
<!-- 对哪些文件应用配置 -->
<url-pattern>/noscript/*</url-pattern>
<!-- 忽略表达式语言 -->
<el-ignored>true</el-ignored>
<!-- 页面编码的字符集 -->
<page-encoding>GBK</page-encoding>
<!-- 不允许使用Java脚本 -->
<scripting-invalid>true</scripting-invalid>
<!-- 隐式导入页面头 -->
<include-prelude>/inc/top.jspf</include-prelude>
<!-- 隐式导入页面尾 -->
<include-coda>/inc/bottom.jspf</include-coda>
</jsp-property-group>
<jsp-property-group>
<!-- 对哪些文件应用配置 -->
<url-pattern>*.jsp</url-pattern>
<el-ignored>false</el-ignored>
<!-- 页面编码字符集 -->
<page-encoding>GBK</page-encoding>
<!-- 允许使用Java脚本 -->
<scripting-invalid>false</scripting-invalid>
</jsp-property-group>
<jsp-property-group>
<!-- 对哪些文件应用配置 -->
<url-pattern>/inc/*</url-pattern>
<el-ignored>false</el-ignored>
<!-- 页面编码字符集 -->
<page-encoding>GBK</page-encoding>
<!-- 不允许使用Java脚本 -->
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>

<context-param>
<param-name>author</param-name>
<param-value>yeeku</param-value>
</context-param>

</web-app>

上面的配置文件中配置了三个<jsp-property-group>元素,每个元素配置一组JSP属性,用于指定哪些JSP页面应该满足怎样的规则。例如,第一个jsp-property-group元素指定:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<jsp-property-group>
<!-- 对哪些文件应用配置 -->
<url-pattern>/noscript/*</url-pattern>
<!-- 忽略表达式语言 -->
<el-ignored>true</el-ignored>
<!-- 页面编码的字符集 -->
<page-encoding>GBK</page-encoding>
<!-- 不允许使用Java脚本 -->
<scripting-invalid>true</scripting-invalid>
<!-- 隐式导入页面头 -->
<include-prelude>/inc/top.jspf</include-prelude>
<!-- 隐式导入页面尾 -->
<include-coda>/inc/bottom.jspf</include-coda>
</jsp-property-group>

/noscript/*下的所有页面应该使用GBK字符集进行编码,且不允许使用JSP脚本,忽略表达式语言,并隐式包含页面头、页面尾。
如果在不允许使用JSP脚本的页面中使用JSP脚本,则该页面将出现错误。即/noscript/*下的页面中使用JSP脚本将引起错误。

noscript\test1.jsp

看下面的JSP页面代码,为test1.jsp页面代码。

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %>
<!DOCTYPE html>
<html>
<head>
<title> 页面配置1 </title>
</head>
<body>
<h2>页面配置1</h2>
下面是表达式语言输出:<br/>
${1 + 2}
</body>
</html>

上面的页面中粗体字代码就是表达式语言,关于表达式语言请看下一节介绍。但由于在web.xml文件中配置了表达式语言无效,所以浏览该页面将看到系统直接输出表达式语言。在浏览器中浏览该页面的效果如图2.44所示。

从图2.44中可以看出,test1.jsp的表达式语言不能正常输出,这是因为配置了忽略表达式语言
上面页面中看到隐式include的页面头分别是inc\top.jspfinc\bottom.jspf,这两个文件依然是JSP页面,只是将文件名后缀改为了jspf而已。

test2.jsp

而位于应用根路径下的JSP页面则支持表达式语言和JSP脚本,但没有使用隐式include包含页面头和页面尾。应用根路径下的test2.jsp页面代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %>
<!DOCTYPE html>
<html>
<head>
<title> 页面配置2 </title>
</head>
<body>
<h2>页面配置2</h2>
下面是表达式语言输出:<br/>
${1 + 2}<br/>
下面是小脚本输出:<br/>
<%out.println("hello Java");%>
</body>
</html>

上面的页面中两行粗体字代码正是嵌套在JSP页面中的JSP脚本和表达式语言,浏览该页面将看到如图2.45所示的效果。

图2.45中椭圆形圈出的3就是${1+2}的结果这就是表达式语言的计算结果。