我想用tapestry5创建一个子表单:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd">
<t:TextField t:id="name" />
</html>
并像这样使用它:
<form t:type="form" t:id="testForm">
<t:testComponent name="name" />
<input type="submit"/>
</form>
TestComponent.java:
import org.apache.tapestry5.annotations.Parameter;
import org.apache.tapestry5.annotations.Property;
public class TestComponent {
@Parameter(required = true, allowNull = false)
@Property
private String name;
}
这样我就可以使用'name'的值,如:
@Property
private String name;
void onSuccessFromTestForm() {
System.out.println(name);
}
但我得到的只是一个应用程序异常:
Render queue error in BeginRender[Index:testcomponent.name]: Failure reading parameter 'value' of component Index:testcomponent.name: Parameter 'name' of component Index:testcomponent is bound to null. This parameter is not allowed to be null.
问题是什么?
答案 0 :(得分:1)
Tapestry告诉您,包含Form
和TestComponent
的组件的属性“name”的值为null。所以问题不在你的TestComponent
中,而是在一个组件/页面更高。为name分配一个值,你应该很好。
修改强>
如果您的意思是允许人们通过表单分配值并在呈现页面时允许空值,请从allowNull = false
中的@Parameter
中删除TestComponent
。我假设你想在提交表单之前强制用户为name字段提供一个值。这是通过添加t:validate="required"
属性而不是@Parameter
在输入字段上完成的。 @Parameter
告诉tapestry实例变量如何与其容器交互,它没有关于如何在其自己的组件中使用该变量。
答案 1 :(得分:0)
@Parameter 注释就像构造函数的参数。基本上,你的代码就是这样说的,比如
public TestComponent(String name){
if(name == null) thrown new Exception("No Nulls in here boy");
}
这样做很好,如果您想在组件中进行一些处理,它可以防止NullPointers,并且搜索NPE的根目录是世界上最烦人的事情。更重要的是,您将 required 设置为true,这意味着您必须将一些值传递给组件。你必须将name变量初始化为某个东西,空字符串足够好,因为它不会搞乱你想要实现的行为,但会满足tapestry。
这将解决您目前遇到的技术问题。至于你的真正问题,通过验证,如joostschouten所提到的,你需要设置验证规则。有几种方法可以实现这一点,请添加 t:validate ,如提到的joostschouten或在组件中添加onValidateFromName(String name) throws ValidationException{...}
。对于这种简单的验证,第二种方法有点过分,但对于任何更复杂的事情可能都是必要的
关于该主题的一些参考文献:
http://tapestry.apache.org/forms-and-validation.html http://tapestry.apache.org/component-parameters.html http://jumpstart.doublenegative.com.au/jumpstart/examples/input/validators http://jumpstart.doublenegative.com.au/jumpstart/examples/input/morevalidation