9.3.2 <c:set>标签

优质
小牛编辑
128浏览
2023-12-01

<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所

03

图9.3 <c:set>标签的演示效果

从图9.3所示的效果可以看出,虽然Message对象的name属性值被设置为null,但由于JSP标签的输出原则是尽可能输出友好的信息。因此,使用空串代替null来输出Message对象的name属性值。