在
web
应用中下拉选择菜单是必不可少的东西。在
Tapestry
中是用
select
组件实现的。而且
select
组件能很好的和
emun
相结合,避免在页面中写死那些选项。
我们在注册页面上价格选择框,让用户选择他的国家:
按惯例还是先看代码:
<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
废话不多说了,自己看看效果吧。