天天看点

Tapestry学习十四:关于组件(九)Select组件

  在 web 应用中下拉选择菜单是必不可少的东西。在 Tapestry 中是用 select 组件实现的。而且 select 组件能很好的和 emun 相结合,避免在页面中写死那些选项。  

我们在注册页面上价格选择框,让用户选择他的国家:

Tapestry学习十四:关于组件(九)Select组件

按惯例还是先看代码:   <tr> <td>Country:</td> <td> <select t:type="select"  t:model="countries" t:value="country"> <option>Country 1</option> <option>Country 2</option> </select> </td> </tr>   可以看到 select 组件是隐藏在 HTML 控件中的,如果你不想那么写可以以: <t:select t:model=”contris” t:value=”country”/> 这个组件有两个参数: model 和 value 。 Value 属性是和以前的组件一样,都是 class 中的属性。 Model 参数提供显示在下拉列表中的数据。这个参数从 page class 中接受一个实现了 SelectModel 接口的类。提供 SelectModel 类的实现有几种方式,这取决与我们想要多灵活和强大。这里我们只考虑简单的,复杂的会在最后讨论。 首先我们要创建一个 enum 类:   package com.packtpub.celebrities.model; public enum Country { GERMANY , UK, USA }   这里只写了几个,你想要以后可以自己添加。看看类中的代码:   @Inject private Messages messages; public SelectModel getCountries() { return new EnumSelectModel(Country.class, messages); } @Persist private Country country; public Country getCountry() { return country; } public void setCountry(Country country) { this.country = country; }   我们实例化了一个 EnumSelectModel 类,这个类实现了一个 SelectModel 接口, EnumSelectModel 构造器有两个参数,一个是在下拉框中显示的数据,还有一个被我们注入的是有点神秘兮兮的 message 。这个 message 是什么?   这个话题和以后要说道的国际化就很接近了。每一个 Tapestry 应用都能有一些资源文件,这些资源文件可以被应用和组件使用,它是一个 .properties 的文件,放在 web-inf 文件夹下。它们是以键值对的方式存在的。   当这个 message 被注入到页面,这个对象就从资源文件中提供了很多可用的键值对给页面使用。我们需要提供一个这样的文件给他。 但是这个资源文件的名字可不是随便定义的,它的名字是对应这 web.xml 中 tapestry filter 的名字。 <filter> <filter-name>app</filter-name> <filter-class>org.apache.tapestry.TapestryFilter </filter-class> </filter> 所以我们要新建一个叫 app.properties 的文件: Country.Germany=Germany country.UK=United Kingdom COUNTRY.USA=United States 废话不多说了,自己看看效果吧。

继续阅读