9.4.3 <fmt:setBundle>标签

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

<fmt:setBundle>标签和<fmt:bundle>标签的基本功能相同,也用于创建ResourceBundle对象实例,但<fmt:setBundle>标签可以将创建的LocalizationContext对象实例(该对象实例中封装了由<fmt:setBundle>标签创建的ResourceBundle对象)以指定的属性名保存在某个Web域中。<fmt:setBundle>标签的语法格式如下:

<fmt:setBundle basename="basename" [var="varName"]

[scope="{page|request|session|application}"]/>

<fmt:setBundle>标签的属性说明如表9.15所示。

表9.15 <fmt:setBundle>标签的属性

属性名

是否支持动态属性值

属性类型

属性描述

basename

true

String

指定创建ResourceBundle对象实例的基名。实际上,该属性值就是ResourceBundle类的getBundle方法的参数值。该方法用于返回ResourceBundle对象实例。

var

false

String

指定创建的LocalizationContext对象实例保存在Web域中的属性名。

scope

false

String

指定创建的LocalizationContext对象实例保存的Web域。

在使用<fmt:setBundle>标签时应注意如下几点:

1 如果basename属性值为null、空字符串,或找不到basename属性指定的资源,<fmt:setBundle>标签创建的ResourceBundle对象实例为null。

2 <fmt:setBundle>标签保存在某个域中的对象并不是ResourceBundle对象实例,而是javax.servlet.jsp.jstl.fmt.LocalizationContext对象实例。LocalizationContext类可以在JSTL库的源代码中找到。LocalizationContext对象封装了ResourceBundle对象和Locale对象。通过LocalizationContext类的getResourceBundle方法和getLocale方法可以分别返回ResourceBundle对象和Locale对象。从这一点可以看出,如果<fmt:setBundle>标签创建的ResourceBundle对象实例为null,保存在Web域中的对象也不是null,而是LocalizationContext对象实例,只是通过LocalizationContext类的getResourceBundle方法会返回null。

3 如果指定var属性,<fmt:setBundle>标签会把LocalizationContext对象实例以var属性值作为属性名保存在Web域中。

4 如果未指定var属性,<fmt:setBundle>标签会把LocalizationContext对象实例以javax.servlet.jsp.jstl.fmt.LocalizationContext.scope作为属性名保存在Web域中,其中scope表示scope属性的值,如scope属性值是request,则javax.servlet.jsp.jstl.fmt.LocalizationContext.request就是保存在Web域中的LocalizationContext对象的属性名。

关于<fmt:setBundle>标签的使用方法请读者详见9.4.1节中的例子。