今天开始接触到Tapestry框架,用的是Tapestry3.03包(MyEclipse 的tapstry插件),开发环境是Eclipse,Web服务器用的是Weblogic。参照的教程是《享受Tapestry给Web开发带来的乐趣》,果然它不辱使命,给我带来了无限的“乐趣”。
可能教程上用的是Tapestry4,而我使用的是Tapestry3的缘故吧,好象高版本是有了很多新功能,我完全找着教程上抄一个例子,搞了半天才看到一个“Hello John”。原因就是遇到了好多版本3和4不兼容的问题一样,不知道各位大侠有何高见。
首先就是,在page文件里,一使用ognl前缀,就要报错,听作者Ka Iok 'Kent' Tong说,page文件中默认使用ognl语言,而html文件中则不是,但不是说page文件里就不能使用ognl语言,例如他也使用了,而且也没错啊。
第二就是page文件的dtd好像是变了吧,有的属性加进去就不合法,比如作者用的就是<binding name=”value” value=”ognl:greetingSubject”>,而我只能使用<binding name=”value” expression=”greetingSubject”>。
第三就是使用<form jwcid=”@Form” listener=”listener:onOk”>,老是不能把监听器注册给Page对象的onOk方法,非要我使用<form jwcid=”@Form” listener=”ognl:listeners.onOk”>。
Page文件里不能注入组件,比如页面,作者就使用<inject property=”resultPage” type=”page” object=”Result”>在page文件中注入一个页面,而3版本的page文件不支持inject元素。
第四,在BasePage的子类里也不支持注入对象的语法,如:
public abstract class Home extends BasePage{
//注意哦,下面这一句可不是注释,而是注入对象的语法哦,Result必须是已经注//册过的面对象的名称。
@InjectPage(“Resul”)
public abstract Result getResultPage();
}
第四,监听方法只能返回void,一返回其他类型,就好像没了作用,例如,我可以如下定义onOk方法,将用户导向Result指定的页面:
public void onOk(IRequestCycle cycle) {
int stockValue = stockId.hashCode() % 100;
//从页面池中取出Result页面来
Result resultPage = (Result) cycle.getPage("Result");
//重设页面对象
resultPage.setStockValue(stockValue);
//激活Result,将用户导向Result页面
cycle.activate(resultPage);
}
这样是可以的,而作者使用的是另一种方法,直接用onOk方法返回页面:
public IPage onOk(IRequestCycle cycle) {
//public void onOk(IRequestCycle cycle) {
int stockValue = stockId.hashCode() % 100;
Result resultPage = (Result) cycle.getPage("Result");
resultPage.setStockValue(stockValue);
return resultPage;
//cycle.activate(resultPage);
}
按照作者的做法,也应该是对的,毕竟别个是出了书的嘛,我想也应该没问题,作者可以而我这样写就报错,应该不是人品问题吧,我还是认为它是Tapestry的版本问题,哎,呵呵,真没办法,菜鸟就是这样啊,
最后恳请各位高手批评指正一下,问题究竟在哪儿?搞得我如此郁闷。