ITEEDU

6.3 Bean 标记

这个标记库中包含用于定义新bean、访问bean 及其属性的标记。Struts 框架提供了多种自定义标记用来在JSP 页中处理JavaBean。这些标记被封装在一个普通的标记库中,在文件struts-bean.tld 中定义了它的标记库描述器。Bean 标记库将标记定义在四个子类别中:
 创建和复制bean 的标记
 脚本变量定义标记
 bean 翻译标记
 消息国际化标记

6.3.1 Bean 复制标记

可定义新bean,可复制现有bean,还可从现有bean 复制属性。
<bean:define>标记用来:
 定义新字符串常数
 将现有的bean 复制到新定义的bean 对象
 复制现有bean 的属性来创建新的bean
<bean:define>标记属性:

属性	描述
Id	新定义的bean 脚本变量名称,必须设置
Type	定义引入脚本变量的类
Value	为id 属性定义的脚本变量分配一个新的对象
Name	目标bean 的名称。若value 属性没有设置,这个属性就必须设置
property Name	属性定义的bean 的属性名称,用来定义新的bean
Scope	源bean 的作用域。若没有设置,搜索范围是从页作用域到应用程序作用域
toScope	目标bean 的作用域。若没有设置,默认值是页作用域

例如:定义一个bean:
<bean:define id=”test” value=”this is a test”/>
源bean 在页作用域中被拷贝大哦请求作用域中的另一个bean:

<bean:define id=”targetBean” name=”sourceBean”
scope=”page” toScope=”request”/>

6.3.2 定义脚本变量的标记

从多种资源中定义和生成脚本变量,这些资源包括cookie,请求参数,HTTP 标头等等。
属性如下:

属性   描述
Id     脚本变量和要定义的页作用域属性的名称
Name    cookie/标头/参数的名称
multiple  如果这个属性设置了任意一个数值,所有匹配的cookie 都会被积累并存储到一个Cookie[](一个数组)类型的bean 里。若无设置,指定cookie 的第一个值将作为Cookie 类型的值
Value     如果没有匹配的cookie 或数值,就返回这个属性指定的默认值

例如:

<bean:cookie id=”myCookie” name=”userName”/>

脚本变量名称是myCookie,用来创建这个属性的cookie 的名称是userName。

<bean:header id=”myHeader” name=”Accept-Language”/> 

脚本变量名称是myHeader,请求标头的名称是Accept-Language.

<bean:parameter id=”myParameter” name=”myParameter”> 

脚本变量名称是myPatameter,它保存的请求参数的名称也是myParameter.
<bean:include>标记将对一个资源的响应进行检索,并引入一个脚本变量和字符串类型的页作用域属性。这个资源可以是一个页,一个ActionForward 或一个外部URL。与
<jsp:include>的不同是资源的响应被存储到一个页作用域的bean 中,而不是写入到输出流。属性如下:

属性	描述
Id	脚本变量和要定义的页作用域属性的名称
Page	一个内部资源
forward	一个ActionForward
Hre f	要包含的资源的完整URL

例如:

<bean:include id=”myInclude” page=”MyJsp?x=1”/> 

脚本变量的名称是myInclude,要检索的响应来自资源MyJsp?x=1。
<bean:resource>标记将检索web 应用中的资源,并引入一个脚本变量和InputStream或字符串类型的页作用域属性。如果在检索资源时发生问题,就会产生一个请求时间异常。
属性如下:

属性	描述
Id	  脚本变量和要定义的页作用域属性的名称
Name	资源的相对路径
Input	如果这个属性不存在,资源的类型就是字符串

例如:


<bean:resource id=”myResource” name=”/WEB-INF/images/myResource.xml”/>

脚本变量的名称是myResource,要检索的资源的名称是myResource.xml。

6.3.3显示Bean 属性

标记库中定义了<bean:write>标记,用来将bean 的属性输送到封装的JSP 页写入器。这个标记与<jsp:getProperty>类似,属性如下:

属性	    描述
Name	    要进行属性显示的bean 的名称
property	要显示的属性的名称。如果这个属性类有java.beans.PropertyEditor,getAsText()或toString 方法会被调用
Scope	    Bean 的作用域,若没有设置,搜索范围是从页到应用程序作用域
Filter	  如果设置true,属性中的所有特殊HTML 字符都将被转化为相应的实体引用
Ignore	  如果设置false,当发现属性时会产生一个请求时间异常,否则返回null

例如:

<bean:write name=”myBean” property=”myProperty” scope=”request”
filter=”true”/>

myBean 的属性myProperty 将会被显示,作用域为请求,如果发现任何HTML 特殊字符
都将被转化为相应的实体引用。

6.3.4消息标记和国际化

strtus 框架支持国际化和本地化。用户在他们的计算机中定义自己所在的区域,当web应用程序需要输出一条消息时,它将引用一个资源文件,在这个文件中所有的消息都使用了适当的语言。一个应用程序可能提供了很多资源文件,每个文件提供了用不同语言编写的消息。如果没有找到所选语言的资源文件,就将使用默认的资源文件。
struts 框架对国际化的支持是使用<bean:message>标记,以及使用java.util 数据包中定义的Locale 和ResourceBundle 类来实现Java2 平台对这些任务的支持。
Java.text.MessageFormat 类定义的技术可以支持消息的格式。利用此功能,开发人员不需了解这些类的细节就可进行国际化和设置消息的格式。

用strtus 实现国际化和本地化:
第一步要定义资源文件的名称,这个文件会包含用默认语言编写的在程序中会出现的所有消息。这些消息以“关键字-值”的形式存储,如下:
error.validation.location = The entered location is invalid这个文件需要存储在类的路径下, 而且它的路径要作为初始化参数传送给ActionServlet 作为参数进行传递时,路径的格式要符合完整Java 类的标准命名规范。比如, 如果资源文件存储在WEB-INF\classes 目录中, 文件名是ApplicationResources.properties,那么需要传递的参数值是ApplicationResources。如果文件在WEB-INF\classes\com\test 中, 那么参数值就应该是com.test.ApplicationResources.
为了实现国际化,所有的资源文件必须都存储在基本资源文件所在的目录中。基本资源文件包含的是用默认地区语言-本地语言编写的消息。如果基本资源文件的名称是
ApplicationResources.properties,那么用其他特定语言编写的资源文件的名称就应该是ApplicationResources_xx.properties(xx 为ISO 编码,如英语是en)。因此这些文件应包含相同的关键字,但关键字的值是用特定语言编写的。ActionServlet 的区域初始化参数必须与一个true 值一起传送,这样ActionServlet
就会在用户会话中的Action.LOCALE_KEY 关键字下存储一个特定用户计算机的区域对象。现在可以运行一个国际化的web 站点,它可以根据用户计算机上的设置的区域自动以相应的语言显示。

我们还可以使用特定的字符串来替换部分消息,就象用java.text.MessageFormat 的方
法一样:
error.invalid.number = The number {0} is valid
我们可以把字符串{0}替换成任何我们需要的数字。<bean:message>标签属性如下:

属性	  描述
Key	   资源文件中定义消息关键字
Locale	用户会话中存储的区域对象的属性名称。若没有设置, 默认值是Action.LOCALE_KEY
Bundle	在应用程序上下文中,存储资源对象的属性的名称。如果没有设置这个属性,默认值是Action.MESSAGE_KEY
arg0	  第一个替换参数值
arg1	  第二个替换参数值
arg2	  第三个替换参数值
arg3	  第四个替换参数值

例如:资源文件中定义了一个消息:

info.myKey = The numbers entered are  {0},{1},{2},{3} 

我们可使用下面的消息标记:

<bean:message key=”info.myKey” arg0=”5” arg1=”6” arg2=”7” arg3=”8”/> 

这个信息标记输出到JSP 页会显示为:The numbers entered are 5,6,7,8