使用多个消息资源束
这是另外一个 Struts 101 配置任务。在许多 Struts 书籍中都会找到它,包括 参考资料 中列出的 Struts Cookbook。同样,在许多书籍中都会有它,因为它是一个非常好的想法。
在 struts-config.xml 文件中已经看到过 message-resources 元素:
|
但是,不太有人知道:在 struts-config.xml 中这些元素可以放置不止一个。 例如,下面是非常合法的配置片断:
|
这里面的第一个元素(没有 key 属性)成为默认的资源集。所以所有的 JSP 和 servet 都可以通过 servlet 上下文访问这组资源。但是,通常是应用程序中的大块部分才需要资源。例如,前面的代码示例中包含的一组资源只针对应用程序的帮助部分(消息、图标、出错、字段标签等等),而且另一组资源特定于访客(没有登录的用户)。在核心应用程序、系统的帮助部分和访客屏幕之间,没有太多共享的信息。所以不必把所有这些资源混合到一个文件中,可以把它们分解到三个独立的文件中。
但是,比起使用三个(或多个)struts-config.xml 文件,这略有不同。在多个 stuts-config.xml 的情况下,多个文件实际上合并成一组配置数据。在多个资源束的情况下,多个文件没有 合并。相反,如果 JSP 页面想使用非默认的资源集,就必须指出要使用哪个资源(在这个示例中是 BankingMessageResources 包)。要做到这一点,需要使用 message 标记,它是 bean 标记库的一部分。
所以,假设:
◆把 bean 标记库与前缀 bean 关联。
◆在 BankingHelpResources 包中有一个属性的键是 help.label.seeAlso。
要引用这个属性,应当在 JSP 中使用以下行:
|
额外的属性 bundle 允许指定要使用的非默认包,剩下的标记正常操作,就像访问默认包中的键一样。
您可能还注意到:即使有多个包,示例也只使用了一个特定于包的前缀:与帮助有关的资源在 BankingHelpResources 中,但是键仍然用 help 作为前缀,就像在 help.label.seeAlso 中那样。一开始这看起来可能是多余的,为什么在这个键只在特定于 help 的包中才可用的时候还用 help 做前缀呢?
回答是:一切为了文档:
◆这样会让键的目的更加清晰:其他程序员就不必猜想这个键是做什么的(如果键只是 label.seeAlso,可能就不那么清楚了)。
◆如果包的名称本身不太有说明性(可能有一些没有读过这份教程的初级程序员把它改成了BankingExtraResources),那么标签仍然可以帮助识别出键的目的。
◆如果想把资源从 BankingHelpResources 转移到另一个文件,那么键仍然会保留清晰性。
应当一直采用清楚的命名方式,不管您认为变量或键的上下文或使用方式让它们的目的有多么清楚。
结束语
尽管我是一个程序员(不管是因为业务还是因为选择),但是我在配置、设置、部署和管理应用程序上,要花费比实际编码更多的时间。我并非特别关心这个(实话实说,我一点儿也不喜欢它),但是它是生活的现实。因此,像这份教程所示的解决方案会让我的生活更轻松。只需花一点儿时间把 Struts 应用程序的配置文件分解,但结果绝对物有所值。不会有单点故障:不会只有一个文件,不会只有一个程序员能理解这个文件,也不会只有一个服务器保存这个文件;分解了可能的故障点,降低了出现严重错误的机会。
而且,就像我前面说过的,至少多睡几夜好觉也是值得的。
下载
Demo: Struts Online Banking application
关于作者
Brett McLaughlin 从 Logo 时代(还记得那个小三角吗?)就从事计算工作。最近几年,他已经成为 Java 技术和 XML 社区最著名的作者和程序员之一。他为 Nextel Communications 工作过,实现了复杂的企业系统;在 Lutris Technologies 工作时,实际编写了应用服务器;最近是在 O'Reilly Media, Inc. 工作,在这里他继续编写和编辑这方面的图书。他的最新大作 Java 1.5 Tiger: A Developer's Notebook 是关于最新版本 Java 技术的第一本书,他的经典作品 Java and XML 一直是在 Java 语言中使用 XML 技术方面的权威作品之一。
(责任编辑 火凤凰 sunsj@51cto.com TEL:(010)68476636-8007)






















