9.4.3 <fmt:setBundle>标签
<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节中的例子。