9.3.2 <c:set>标签
<c:set>标签有如下的几种功能:
1 设置或删除各种Web域的属性。
2 向Web域中的java.util.Map对象中添加key-value对,如果Map对象中存在相应的key-value对,则修改value。如果<c:set>标签未指定value,则删除Map对象中的key-value对。
3 设置Web域中JavaBean对象的属性值,或将JavaBean对象的属性值设为null。
<c:set>标签有如下六种语法格式:
语法1:使用value属性值设置某个域属性的值
<c:set value="value" var="varName"
[scope="{page|request|session|application}"]/>
语法2:使用标签体的内容设置某个域属性的值
<c:set var="varName" [scope="{page|request|session|application}"]>
body content
</c:set>
语法3:使用value属性值设置目标对象的属性值
<c:set value="value" target="target" property="propertyName"/>
语法4:使用标签体的内容设置目标对象的属性值
<c:set target="target" property="propertyName">
body content
</c:set>
语法5:删除Web域中的属性
<c:set var="varName" [scope="{page|request|session|application}"]/>
语法6:删除Web域中的Map对象的key-value对,或将JavaBean对象的属性设为null
<c:set target="target" property="propertyName"/>
其中黑体字部分为属性的默认值。
<c:set>标签的属性的详细说明如表9.4所示。
表9.4 <c:set>标签的属性
属性名 | 是否支持动态属性值 | 属性类型 | 属性描述 |
value | true | Object | 指定属性值。 |
var | false | String | 指定要设置的Web域中的属性名 |
scope | false | String | 指定要保存或删除的属性的Web域 |
target | true | Object | 指定要设置属性的对象,该对象必须是JavaBean对象或java.util.Map对象 |
property | true | String | 指定要为对象设置的属性名称 |
在使用<c:set>标签时应注意如下几点:
l <c:set>标签不能同时指定value属性和标签体,否则将抛出异常。
2 如果value属性值或标签体中的内容不能转换成property属性指定的对象属性类型时,<c:set>标签将会抛出异常。
3 在不指定value属性或标签体的情况下,<c:set>标签将删除var属性指定的Web域中的属性,或删除property属性指定的Map对象的key-value对。如果target属性指定的是JavaBean对象,<c:set>标签会将property属性指定的JavaBean属性的值设为null。如果JavaBean对象的属性类型无法设为null(如int),<c:set>标签并不会抛出异常,而是输出空串。
4 如果同时指定了var属性和target属性,那么var属性的优先级更高。也就是说,<c:set>标签会优先设置var属性指定的Web域属性的值,而target属性指定的对象将被忽略。
5 虽然<c:set>标签的所有属性都是可选的,但var属性和target属性必须至少有一个,否则<c:set>标签将抛出JspTagException异常。
6 如果将var属性和target属性都设为null,那么<c:set>标签也会抛出JspTagException异常。
set.jsp页面是一个演示<c:set>标签的例子,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
java.util.Map<String, String> map = new java.util.HashMap<String,String>();
chapter9.Message message = new chapter9.Message();
request.setAttribute("map", map );
request.setAttribute("message", message );
%>
使用value属性值设置request域属性的值
<c:set var="webrequestdomain" value = "webrequestdomain_value" scope="request"/>
<c:out value="${requestScope.webrequestdomain}"/><hr>
使用标签体设置session域属性的值
<c:set var="websessiondomain" value = "websessiondomain_value" scope="session"/>
<c:out value="${sessionScope.websessiondomain}"/><hr>
使用value属性值向java.util.Map对象中添加key-value对
<c:set target="${map}" property="map_key" value = "map_value" />
<c:out value="${map.map_key}"/><hr>
使用标签体设置JavaBean对象的属性值
<c:set target="${message}" property="name" value = "property_value" />
<c:out value="${message.name}"/><hr>
request域中的webrequestdomain属性已经被删除
<c:set var="webrequestdomain" scope="request"/>
<!-- 输出空串 -->
<c:out value="${requestScope.webrequestdomain}"/><hr>
Message对象的name属性值已经被设为null
<c:set target="${message}" property="name" />
<!-- 输出空串 -->
<c:out value="${message.name}"/><hr>
其中Message类的实现代码如下:
package chapter9;
public class Message
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
在浏览器地址栏中输入如下的URL:
http://localhost:8080/demo/chapter9/set.jsp
浏览器显示的效果如图9.3所
图9.3 <c:set>标签的演示效果
从图9.3所示的效果可以看出,虽然Message对象的name属性值被设置为null,但由于JSP标签的输出原则是尽可能输出友好的信息。因此,使用空串代替null来输出Message对象的name属性值。