7.3.5 variable指令

7.3.5 variable指令

通过variable可以将tag file中的一些值传递JSP页面tag file中的variable指令和标签库描述文件中的variable元素类似,它用于定义那些需要传递到JSP页面的变量。
tag file支持多个variable指令,这意味着可以传递多个值到JSP页面
相对而言,attribute指令的作用与variable相反,attribute指令用于将值从JSP页面传递到tag file
variable指令的语法如下:

1
<%@ variable attribute1="value1" attribute2="value2" ... %>

variable属性

属性 描述
name-given 变量名。在JSP页面的脚本和EL表达式中,可以使用该变量名。如果指定了name-from-attribute属性,那么name-given属性就不能出现了,反之亦然。name-given的值不能和同一个tag file中的属性名重复
name-from-attribute name-given属性类似,由标签属性的值来决定变量的名称。如果name-from-attributename-given属性同时出现或者都不出现的话会出现错误
alias 设定一个用来接收变量值的局部范围
variable-class 变量的类型。默认为java.lang.String
declare 设定该变量是否声明。默认值为false
scope 用于指定该变量的范围。可取的值为AT_BEGINAT_END、和NESTED。默认值为NESTED
description 用于描述该变量
你或许会奇怪,既然JSP页面可以调用JspWriter来接收变量值了,为什么还需要通过variable指令来传递变量值呢。那是因为通过JspWriter只能简单地将一个String传递到JSP页面,灵活性很差

实例

firstTag.tag

下面的firstTag.tag用于输出服务器长格式的当前日期。

1
2
3
4
5
6
7
<%@ tag import="java.util.Date" import="java.text.DateFormat"%>
<%
DateFormat dateFormat =
DateFormat.getDateInstance(DateFormat.LONG);
Date now = new Date(System.currentTimeMillis());
out.println(dateFormat.format(now));
%>

但是如果你还需要输出短格式的服务器日期的话,就必须再写一个tag file。写两个功能类似的tag file显然是冗余工作。如果使用变量指令,就没有这样的问题了,只需要在tag file中定义longDateshortDate两个变量就可以了

varDemo.tag

varDemo.tag提供了输出服务器当前日期长格式和短格式的两个功能,它定义了两个变量:longDateshortDate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ tag import="java.util.Date" import="java.text.DateFormat"%>
<%@ tag pageEncoding="utf-8"%>
<!-- 要向JSP页面传递的参数的名称 -->
<%@ variable name-given="longDate"%>
<%@ variable name-given="shortDate"%>
<!-- 引入核心标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
Date now = new Date(System.currentTimeMillis());
DateFormat longFormat = DateFormat.
getDateInstance(DateFormat.LONG);
DateFormat shortFormat = DateFormat
.getDateInstance(DateFormat.SHORT);
//给jspContext内置对象设置属性
jspContext.setAttribute("longDate", longFormat.format(now));
%>
<!-- 给shorDate参数设值 -->
<c:set var="shortDate"><%=shortFormat.format(now)%></c:set>
<!-- <mytags:variableDemo>xxxxxxx</mytags:variableDemo>
的标签体为xxxx-->
<!-- 执行标签体中的JSP代码 -->
<jsp:doBody />

注意,这里使用了jspContext.setAttribute方法来设置变量。jspContext是一个隐藏对象。JSTL中的set标签也能实现同样的功能。
同时需要注意的是,这里使用了doBody动作元素来执行<mytags:variableDemo>标签的标签体。关于doBodyinvoke动作元素我们将在下一节进行介绍。

varDemoTest.jsp页面

varDemoTest.jsp使用了varDemo.tag的标签。

1
2
3
4
5
6
7
8
9
10
<%@ page language="java" contentType="text/html; 
charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="mytags" tagdir="/WEB-INF/tags"%>
当前日期
<ul>
<mytags:variableDemo>
<li>长日期格式:${longDate}</li>
<li>短日期格式:${shortDate}</li>
</mytags:variableDemo>
</ul>

可以通过下面的URL来访问varDemoTest.jsp:
http://localhost:8080/app07a/variableDemoTest.jsp
显示效果如下图所示:
这里有一张图片
在很多情况下都需要用到变量。比如说,你希望实现一个这样的功能:根据产品标识从数据库中获取该产品的详细信息。你可以通过一个属性来传递产品标识。然后可以用多个变量来保存产品的详细信息,每个变量对应为产品的每个属性。最终,你会用到例如namepricedescriptionimageURL等变量。