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.