quo;。
这里有一个组件显得很特别:@Form组件,这个组件由于是隐式定义地,因此它的参数就直接在HTML模板中进行定义:listener="ognl:listeners.submit",它表示当用户按下submit按钮后页面流程会交给当前Page组件类(即Welcome这个类)的submit函数进行管理。
下面我们再看一下它的Page组件的定义:
CustInfo.page
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE page-specification PUBLIC
"-//Apache Software Foundation//Tapestry Specification 3.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
<page-specification class="demo.Welcome">
<property-specification name="custName" type="java.lang.String"/>
<property-specification name="dob" type="java.util.Date"/>
<component id="custName" type="TextField">
<binding name="value" expression="custName"/>
</component>
<component id="dob" type="DatePicker">
<binding name="value" expression="dob"/>
</component>
</page-specification>
WEB开发模式Tapestry简介(6)
时间:2010-12-10
其中值得关注的是dob这个组件,它的类型是tapestry核心组件库中的DatePicker组件,有了它,我们就可以生成先前那个不可思义的选择日期的界面了。
这里出现了一个新面孔:property-specification元素,它是干什么用的呢?还是先让我们看一下那个“hello,world”例子中的组件类的定义吧:
Home.java
package demo;
import org.apache.tapestry.html.BasePage;
public class Home extends BasePage {
private String userName = "Jack";
public String getUserName() {
return this.userName;
}
}
其中userName这个属性是一个javaBean属性,通过get或set方法来存取userName的值,当然对于本例,property-specification这个元素和它一样,就是定义了一个javaBean的属性,其实你也可以像上例那样进行存取,而不需在CustInfo.page中进行定义。定义property-specification元素的根本原因其实很可笑:为了偷一点懒! 为什么这么说呢?因为如果你用property-specification元素来定义javaBean的属性的话,那你在组件类中就不必实现其get或set方法了,只需用一个抽像方法来完成,至于真正的get或set方法的实现就由tapestry来代劳了,其中,Welcome这个类的代码如下:
Welcome.java
package demo;
import java.util.Date;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.html.BasePage;
public abstract class Welcome extends BasePage {
public abstract void setCustName(String custName);
public abstract void setDob(Date dob);
public abstract String getCustName();
public abstract Date getDob();
public void submit(IRequestCycle cycle) {
if (getCustName() != null
&& !getCustName().trim().equals("")
&& getDob() != null) {
Welcome welcome = (Welcome) cycle.getPage("Welcome");
welcome.setCustName(getCustName());
welcome.setDob(getDob());
cycle.activate(welcome);
}
}
}
前面的几个抽像方法就不多说了,Welcome类的submit方法和在HTML模板中定义的@Form组件中的listener参数正好对应,也就是说,当用户按下提交按钮后,这个submit方法就会被激 |