挂毯中的绑定地图5

时间:2012-05-19 15:21:30

标签: java binding tapestry

在我的动作类中,我希望有一个字符串映射。在我的tml中我想用textfield访问这个地图。

之类的东西
<t:form>
    <t:textfield value="myMap['key1']"/>
    <t:textfield value="myMap['key2']"/>
...

我不坚持语法,但目前在tapestry中有这样的东西吗?如果没有,我需要以最简单的方式创建这样的转换?类型胁迫?定制组件?我开始学习挂毯了,所以请随意大肆宣传:)

4 个答案:

答案 0 :(得分:5)

另一种选择是绑定自己的tml前缀。有一个绑定前缀here的例子。

我们为map编写了自己的前缀,这允许我们像这样获取tml中的值:

${map:myMap.key1}

答案 1 :(得分:3)

好吧,我明白了。我做了一个简单的组件MapField:

@Parameter(required=true)
Map<String, String> map;

@Parameter(required=true, allowNull=false, defaultPrefix = BindingConstants.LITERAL)
String key;

public String getMapValue() {
    return map.get(key);
}

public void setMapValue(String value) {
    map.put(key, value);
}

TML:

<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd">
    <t:textfield value="mapValue"/>
</html>

就是这样。现在我们可以在其他tml中使用它了:

<t:mapField key="existingOrNot" t:map="myMap"/>

在页面中我们只需要myMap作为属性:

@Property @Persist Map<String, String> myMap;

可能还有更多的事情要做,比如将所有额外的html参数传递给文本字段等等

答案 2 :(得分:2)

您需要在java类中创建一个访问器方法。

最直接的方法是添加一个方法:

getMapValue(String key){...}

然后您可以更改您的tml以使用

value="getMapValue('key1')"

答案 3 :(得分:1)

你应该能够像这样循环键集:

<form t:type="Form">
    <t:Loop t:source="myMap.keySet()" t:value="currentKey"> 
        <input type="text" t:type="Textfield" t:value="currentValue"/>
    </t:Loop>
</form>

您必须在存储当前地图密钥的类文件中添加一些代码,并允许访问当前值:

@Property
private Object currentKey;

@Persist
@Property
private Map<String,String> myMap;

public String getCurrentValue() {
     return this.myMap.get(this.currentKey);
}

public void setCurrentValue(final String currentValue) {   
    this.myMap.put(this.currentKey, currentValue);
}

(此答案改编自我earlier answers之一。)