<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
<head>
<title>Celebrity Collector: Registration</title>
</head>
<body>
<h1>Registration</h1>
<t:form t:id="registrationForm">
<table>
<tr>
<td><t:label t:for="userName">
Label for user name</t:label>:</td>
<td><input type="text" t:type="textfield"
t:id="userName" t:value="userName"/></td>
</tr>
<tr>
<td><t:label t:for="password">
Label for password</t:label>:</td>
<td><input type="text" t:type="passwordfield"
t:id="password" t:value="password"/></td>
</tr>
<tr>
<td><t:label t:for="password2">
Label for password 2</t:label>:</td>
<td><input type="text" t:type="passwordfield" t:id="password2" t:label="Repeat password"
t:value="password2"/></td>
</tr>
<tr>
<td>Gender:</td>
<td>
<t:radiogroup t:value="gender">
<input type="radio" t:type="radio"
t:value="literal:M"/> Male
<input type="radio" t:type="radio"
t:value="literal:F"/> Female
</t:radiogroup>
</td>
</tr>
</table>
<input type="submit" value="Submit"/>
</t:form>
<br/>
<a href="#" t:type="PageLink" t:page="Start">
Back to the Start Page</a>
</body>
</html>
除了下面的这些代码其他的都很熟悉了
<t:radiogroup t:value="gender">
<input type="radio" t:type="radio" t:value="literal:M"/>
Male
<input type="radio" t:type="radio" t:value="literal:F"/>
Female
</t:radiogroup>
这是
Tapestry
创建一组单选按钮的代码。用到了两种组件:
radiogroup
和
radio-------radiogroup
是和
page class
交互,告诉它什么值被选中,而
radio
提供了一组可供选择的值。
Radiogroup
中的
value
参数是和
page class
中的属性相联系的。在例子中,要确保
Registration.java
中有
gender
属性:
package com.packtpub.celebrities.pages;
public class Registration
{
private String userName;
private String password;
private String password2;
private String gender;
public String getUserName()
{
return userName;
}
public void setUserName(String userName)
{
System.out.println("Setting user name: " + userName);
this.userName = userName;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
System.out.println("Setting password: " + password);
this.password = password;
}
public String getPassword2()
{
return password2;
}
public void setPassword2(String password2)
{
this.password2 = password2;
}
public String getGender()
{
return gender;
}
public void setGender(String gender)
{
System.out.println("Setting gender: " + gender);
this.gender = gender;
}
}
接下来作者说了一大推废话,意思就是说当提交注册页面表单的时候,
Tapestry
先
set
了
form
表单的值,然后再去寻找有没有方法去处理提交的事件。
还加了一下代码测试:
void onSubmitFromRegistrationForm()
{
System.out.println("The form was submitted!");
}
使用枚举为Radio组件提供值
现在执行应用程序,看到页面中的单选框没有默认选中的项,如果想要有默认选中,那么在类中加:
private String gender = "F"
;
页面可以正常的运行了,但是把
radio
的项都写死在页面中不是个好的设计,最好是卸载一个枚举类中:
com.packtpub.celebrities.model
package:
package com.packtpub.celebrities.model;
public enum Gender
{
MALE, FEMALE
}
接下来我们修改所有个
gender
相关的代码,把
String
类型替换成
Gender
:
private Gender gender;
...
public Gender getGender()
{
return gender;
}
public void setGender(Gender gender)
{
this.gender = gender;
}
如果你再想提供一个默认值
就要这样写了:
private Gender gender = Gender.FEMALE;
我们也需要修改模板,使每一个
radio
组件都有一个合适的值与他相对应,以前我们是用
literal
前缀来提供这个值:
t:value="literal:M"
对
Tapestry
这意味着,跟在前缀后面的值应该被理解从字面上理解,在这种情况下,是一个字符串。然而,对
radio
组件来说默认的前缀是
prop
,这意味在在
page class
中应该有一个对应的属性包含这个值。现在把
radio
组件改成
:
<input type="radio" t:type="radio" t:value="male"/> Male
<input type="radio" t:type="radio" t:value="female"/> Female
下面将在页面上添加两个只读的属性:
public Gender getMale()
{
return Gender.MALE;
}
public Gender getFemale()
{
return Gender.FEMALE;
}
不知道这么做有什么好处????作者之说给
gender
一个任意的值不是很好的设计,大概指的是
literal
前缀。我觉得不一定非要用
enum
。毕竟代码增加了。