读书人

Tapestry4中是不是控件定义与放置位置

发布时间: 2012-10-25 10:58:57 作者: rapoo

Tapestry4中是否控件定义与放置位置有关?
环境:T4
Home.html

<html><body jwcid="@Body">
<table width="246" border="0" cellpadding="0" cellspacing="0" align="center">
<form jwcid="submitForm">
<tr><td width="219" height="16" valign="top">
input1<input type="text" name="textfield" jwcid="input1"/>
</td></tr>
<tr><td height="23" valign="top">
<input type="submit" name="Submit2" jwcid="submit1"/>
</td></tr>
<tr><td height="21" valign="top">
<input type="submit" name="Submit22" jwcid="submit2"/>
</td></tr>
<tr><td height="29" colspan="2" valign="top">
input2<input type="text" name="textfield22" jwcid="input2"/>
</td></tr>
</form>
</table>
</body></html>

Home.page

<component id="submitForm" type="Form"/>
<component id="input1" type="TextField">
<binding name="value" value="input1"/>
</component>
<component id="input2" type="TextField">
<binding name="value" value="input2"/>
</component>
<component id="submit1" type="Submit">
<binding name="listener" value="listener:submit1"/>
</component>
<component id="submit2" type="Submit">
<binding name="listener" value="listener:submit2"/>
</component>
Home.java


public abstract class Home extends BasePage{

@InjectPage("Home")
public abstract Home getHome();
private String input1;
private String input2;
public String getInput1() {
return input1;
}
public void setInput1(String input1) {
this.input1 = input1;
}
public String getInput2() {
return input2;
}
public void setInput2(String input2) {
this.input2 = input2;
}
public IPage submit1(){
this.setInput2(this.getInput1()+this.getInput2());
return getHome();
}
public IPage submit2(){
this.setInput1(this.getInput1()+this.getInput2());
return getHome();
}
}
运行程序,对input1,input2,submit1,submit2操作如下:
1,在input1中输入1;input2中输入2,如图:

2,点击submit1,得到如下结果:

3,重复步骤1, 在input1中输入1;input2中输入2,然后点击submit2,得到如下结果:

------------------------------
上述,操作中input2根本没有接受任何参数,但是input1却是正常的,请问这个问题是什么原因造成?是否是bug. <input type="submit" value="Submit2" jwcid="submit2"/><br>
input2<input jwcid="input2"/><br>

这样定义,那么我们可以得到的输出是:

我是submit2(),我运行拉
我是setInput2(),我运行拉

很明显,赋值发生在调用之后。所以会有null出现

不知道我解释得对不对哈~~
这里

你定义的是Submit组件,但是并没有告诉Tapestry你的Form的listener是谁。

所以我们可以这样写代码

Home.html




Home.java


    @InjectPage("Home")    public abstract Home getHome();        public IPage submit1(){        getHome().setInput2(getInput1() + getInput2());        return getHome();    }        public IPage submit2(){        getHome().setInput1(getInput1() + getInput2());        return getHome();    }

测试ok,可以在submit中直接调用。没有必要通过form的listener来执行。
thank you all.

读书人网 >软件架构设计

热点推荐