JSP2.0新特性

一、JSP定义
JSP 属性定义使用<jsp-property-group/>元素配置,主要包括如下四个方面。
·是否允许使用表达式语言:使用<el-ignored/>元素确定,默认值为false 。
·是否允许使用Java 脚本:使用<scripting-invalid/>元素确定,默认值为false 。
·声明JSP 页面的编码:使用<page-encoding/>元素确定。
·使用隐式包含:使用<include-prelude/>和<include-coda/>元素确定。
例:
<?xm1 version="1.0" encoding="ISO-8859-1"?>
<!-- Serv1et2.4 以上版本的Web 应用配置的根元素 -->
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org /2 001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<!-- 关于JSP 的配置信息 -->
<jsp-config>
<jsp-property-group>
<!-- 对哪个文件应用配置二 -->
<url-pattern>/test1.jsp</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>/test2.jsp</url-pattern>
<el-ignored>false</el-ignored>
<!-- 页面编码方苯-->
<page-encoding>GBK</page-encoding>
<!-- 允许使用Java 脚本-->
<scripting-invalid>false</scripting-invalid>
</jsp-property-group>
</jsp-config>
</web-app>

二、表达式语言
使用表达式语言可以以标记格式方便地访问JSP 的隐含对象和JavaBeans 组件
表达式语言的语法格式是:${expression}
(1)表达式语言使用算术和逻辑运算
表达式语言支持的算术运算符非常多,在Java 语言里支持的算术运算符,表达式语
言都可以使用。例:${6-5}输出1,而\${6-5}则直接输出${6-5}
注意:如需要在支持表达式语言的页面中正常输出"$"符号,则在"$"符号前加特义字符"γ' ,否则系统以为"$"是表达式语言的标记。
逻辑运算符也适用。
(2)表达式语言的内置对象
使用表达式语言可以直接获取请求参数,可获取页面中某个JavaBean 的属性值,获取请求头及获取session 属性值等,这些都得益于表达式语言的内置对象。
表达式语言包含如下11 个内置对象。
• pageContext: 代表该页面的pageContext 对象,与JSP 的pageContext 内置对象相同。
• pageScope: 用于获取page 范围的属性值。
• requestScope: 用于获取request 范围的属性值。
• sessionScope: 用于获取session 范围的属性值。
• applicationScope: 用于获取application 范围的属性值。
• param: 用于获取请求的参数值。
• paramValues: 用于获取请求的参数值,与param 的区别在于,该对象用于获取属
性值为数组的属性值。
• header: 用于获取请求头的属性值。
• headerValues: 用于获取请求头的属性值,与header 的区别在于,该对象用于获
取属性值为数组的属性值。
• initParam: 用于获取请求Web 应用的初始化参数。
• cookie: 用于获取应用的Cookie 值。
例:
<%@page contentType="text/html; charset=gb2312" language="java"%>
<html>
<head>
<title>表达式语言-内置对象</title>
</head>
<body>
<h2>
表达式语言-内置对象
</h2>
<hr>
请输入你的名字:
<!-- 通过表单提交请求参数 -->
<form action="test.jsp" method="post">
<!-- 通过${param[ 'name']} 获取请求参数 -->
你的名字=
<input type="text" name="name" value="${param['name']}">
<input type="submit" value="提交">
</form>
<%
session.setAttribute("user", "abc");
%>
<br>
<table border="1" bgcolor="aaaadd">
<tr>
<td>
<b>表达式语言</b>
</td>
<td>
<b>计算结果</b>
</td>
<tr>
<!-- 使用两种方式获取请求参数值-->
<td>
\${param.name}
</td>
<td>
${param.name} 
</td>
</tr>
<tr>
<td>
\${param["name"] }
</td>
<td>
${param["name"] } 
</td>
</tr>
<!-- 获取请求头信息-->
<tr>
<td>
\${header.host}
</td>
<td>
${header.host}
</td>
</tr>
<tr>
<td>
\${header["accept"]}
</td>
<td>
${header["accept"]}
</td>
</tr>
<!-- 获取初始化参数-->
<tr>
<td>
\${initParam["author"]}
</td>
<td>
${initParam["author"] }
</td>
</tr>
<!-- 获取sesslon 属性-->
<tr>
<td>
\${sessionScope["user"]}
</td>
<td>
${sessionScope["user"]}
</td>
</tr>
</table>
</body>
</html>

(3)表达式语言的自定义函数
下面介绍定义函数的开发过程。
(a)开发函数处理类:函数处理类就是普通类,这个普通类中包含若干个静态方法,
每个静态方法都可定义成一个函数。
public class Functions {
// 对字符串进行反转
public static String reverse(String text) {
return new StringBuffer(text).reverse().toString();
}
// 统计字符串的个数
public static int countChar(String text) {
return text.length();
}
}

(b)使用标签库定义函数,配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 标签库配置文件的根元素 -->
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/200l/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<jsp-version>2.0</jsp-version>
<tlib-version>l.O</tlib-version>
<!-- 定义第一个函数-->
<function>
<!-- 定义第一个函数:reverse-->
<name>reverse</name>
<!-- 定义函数的处理类 -->
<function-class>lee.Functions</function-class>
<!-- 定义函数的对应的方法-->
<function-signature>
java.lang.String reverse( java.lang.String )
</function-signature>
</function>
<function>
<!-- 定义第二个函数: countChar -->
<name>countChar</name>
<!-- 定义函数的处理类 -->
<function-class>lee.Functions</function-class>
<!-- 定义函数的对应的方法 -->
<function-signature>
int countChar( java.lang.String )
</function-signature>
</function>
</taglib>

(c)与自定义标签库相同,在web.xml 文件中要增加标签库定义
(d)在JSP 页面中使用函数时也需要先导入标签库,然后再使用函数。下面是使用函数的JSP 页面片段:
<%@page contentType="text/html; charset=gb2312" language="java"%>
<!-- 导入标签库 -->
<%@taglib prefix="my" uri="/tags/mytag"%>
<html>
<head>
<title>表达式语言-自定义函数</title>
</head>
<body>
<h2>
表达式语言自定义函数
</h2>
<hr>
请输入---个字符串:
<form action="functions.jsp" method="post">
字符串=
<input type="text" name="name" value="S{param['name']}">
<input type="submit" value="提交">
</form>
<table border="l" bgcolor="aaaadd">
<tr>
<td>
<b>表达式语言</b>
</td>
<td>
<b>计算结果</b>
</td>
<tr>
<tr>
<td>
\${param["name"] }
</td>
<td>
${param["name"]} 
</td>
</tr>
<!-- 使用reverse 函数 -->
<tr>
<td>
\${my:reverse(param["name"])}
</td>
<td>
${my:reverse(param["name"])} 
</td>
</tr>
<tr>
<td>
\${my:reverse(my:reverse(param["name"]))}
</td>
<td>
${my:reverse(my:reverse(param["name"]))} 
</td>
</tr>
<!-- 使用countChar 函数 -->
<tr>
<td>
\${my:countChar(param["name"])}
</td>
<td>
${my:countChar(param["name"])} 
</td>
</tr>
</table>
</body>
</html>

注意:函数处理类的方法必须是public static,因为这些方法是直接调用,无须实例化
自定义函数,也提供了类似于自定义标签库的作用,使用简单的指令就可以完成复杂的功能。与自定义标签库不同的是,可以在表达式语言中直接使用函数
三、简化的自定义标签
无须重写烦琐的doStartTag和doEndTag 等方法。即使是带标签体的标签,也与不带标签体的标签处理方式完全相同,无须重写doAfterBody 等方法,通常只需重写doTag 方法。
(1)书写标签处理类。
JSP 2.0 的标签处理类继承SimpleTagSupport 类,通常只需重写doTag 方法,即使是带标签体的标签,通常也只需重写doTag 方法。下面是标签处理类的代码:
// 简单标签处理类,继承SimpleTagSupport 类
public class MylteratorTag extends SimpleTagSupport {
// 标签属性
private String bean;
// 标签属性必须的setter 和getter 方法
public void setBean(String bean) {
this.bean = bean;
}
public String getBean() {
return bean;
}
// 标签的处理方法,简单标签处理类只需要重写doTag 方法
public void doTag() throws JspException, IOException {
// 从page scope 中获取名为bean 的集合属性
Collection<String> itemList = (Collection<String>) getJspContext().getAttribute(bean);
// 遍历集合
for (String s : itemList) {
// 将集合的元素设置到page 范围
getJspContext().setAttribute("item", s);
getJspBody().invoke(null);
}
}
}

(2) 编写标签库文件
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<!-- JSP 版本 -->
<jsp-version>2.0</jsp-version>
<tlib-version>1.0</tlib-version>
<!-- 定义第一个标签 -->
<tag>
<!-- 定义标签名 -->
<name>helloWorld</name>
<!-- 定义标签的处理类 -->
<tag-class>lee.HelloWorldSimpleTag</tag-class>
<!-- 定义标签体为空 -->
<body-content>empty</body-content>
</tag>
<!-- 定义第二个标签 -->
<tag>
<!-- 定义标签名 -->
<name>iterator</name>
<!-- 定义标签处理类 -->
<tag-class>lee.MylteratorTag</tag-class>
<!-- 定义标签体,该标签体是不允许脚本的标签 -->
<body-content>scriptless</body-content>
<!-- 定义标签属性 -->
<attribute>
<name>bean</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>

(3)在web.xml 文件中,定义了标签库URI
(4)在JSP 页面中使用标签时,同样也需要先导入标签库,然后使用标签
四、Tag File支持
Tag File 是自定义标签的简化用法,使用Tag File 可以无须定义标签处理类和标签库文件,甚至无须在web.xml 文件中定义标签库,但仍然可以在JSP 页面中使用自定义标签。
下面以Tag File 建立一个迭代器标签,其步骤如下。
(1)建立Tag 文件,在Tag File 的自定义标签中, Tag File 代理了标签处理类,它的格式类似于JSP 文件。可以这样理解:如使用JSP 代替Servlet 作为表现层一样, Tag File使用了更简单的Tag File 代替了标签处理类。
Tag File 具有以下5 个编译指令。
• taglib: 作用与JSP 文件中的taglib 指令效果相同,用于导入其他标签库。
• include: 作用与JSP 文件中的include 指令效果相同,用于导入其他JSP ,或静态页面。
• tag: 作用类似于JSP 文件中的page 指令,有pageEncoding 、body-content 等属性,用于设置页面编码等属性。
• attribute: 用于设置自定义标签的属性,类似于自定义标签处理类中的标签属性。
• variable: 用于设置自定义标签的变量,这些变量将传回JSP 页面使用。
下面是迭代器标签的Tag File ,这个Tag File 的语法与JSP 语法非常相似:
<%@ tag pageEncoding="GBK"%>
<!-- 使用JSTL 的标签 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt"%>
<!-- 定义了四个标签属性-->
<%@ attribute name="color"%>
<%@ attribute name="bgcolor"%>
<%@ attribute name="title"%>
<%@ attribute name="bean"%>
<table border="l" bgcolor="${color}" bordercolor="OOOOOO">
<tr>
<td>
<b>${title}</b>
</td>
</tr>
<c:forEach items="${bean}" var="var">
<tr>
<td bgcolor="${bgcolor}">
${var}
<ltd>
</tr>
</c:forEach>
</table>

这个Tag File 的命名必须遵守如下规则: tagName.tag。即Tag File 的文件名就是标签名,文件名后缀是tag。将该文件存放在某个路径下,这个路径就是标签库路径。
(2) 在页面中使用自定义标签时,需要先导入标签库,再使用标签。使用标签与普
通标签用法完全相似,只在导入标签时存在一些差异。由于此时的标签库没U有RI,只
有标签库路径。因此导入标签时,使用如下语法格式:
<%@ taglib prefix="tagPrefix" tagdir="path"%>

其中, prefix 与之前的taglib 指令的prefix属性完全相同,用于确定标签前缀:而tagdir标签库路径下存放很多Tag File,每个Tag File 对应一个标签。
下面是使用标签的JSP 页面代码:
<!-- 导入标签 -->
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags"%>
<%@ page contentType="text/html;charset=GBK" import="java.util.*"%>
<html>
<head>
<title>法代器tag file</title>
</head>
<body>
<h2>
迭代器tag file
</h2>
<hr>
<%
//创建集合对象,用于迭代
List<String> a = new ArrayList<String>();
a.add("hello");
a.add("world");
a.add("java");
//将集合对象放入页面范围
pageContext.setAttribute("a", a);
%>
//使用自定义标签
<tags:iterator color="#99dd99" bgcolor="#9999cc" title="迭代器"
bean="${pageScope.a}" />
</body>
</html>

tags 表明该标签使用IWEB-INF/tags 路径下的Tag File 处理标签;而iterator 是标签名,对应在标签库路径下包含iterator.tag 文件,由该文件负责处理标签。
Tag File 是自定义标签的简化。事实上,就如同JSP 文件会编译成Servlet 一样, Tag File 也会编译成Tag 处理类,自定义标签的后台依然由标签处理类完成,而这个过程由容器完成
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值