У меня есть действие со следующим свойством -
private Map<String,String> assetProps;
...
public Map<String, String> getAssetProps() {
return assetProps;
}
public void setAssetProps(Map<String, String> assetProps) {
this.assetProps = assetProps;
}
Чтобы установить значения на карте, в основном есть два шага. Во-первых, OGNL не может создать экземпляр карты, так что решать вам. В своем действии я реализую интерфейс Preparable, но создаю его экземпляр перед запуском метода public string input () следующим образом -
public class EditAction extends ActionSupport implements Preparable {
...
public void prepare() {
// just satisfying Preparable interface so we can have prepareInput()
}
public void prepareInput() throws Exception {
assetProps = new HashMap<String,String>();
}
Теперь объект не нулевой, я могу использовать синтаксис, подобный следующему в JSP -
<s:iterator value="asset.properties" var="prop">
<sjx:textfield name="%{'assetProps[\\'' +#prop.propName +'\\']'}"
value="%{#prop.propValue}"
label="%{#prop.propName}" size="25"/>
</s:iterator>
Итератор извлекает набор объектов из стека и перебирает его. Важной частью является раздел "name =", обратите внимание на двойные кавычки. Таким образом, когда страница отображается, имя элемента ввода становится (например) - assetProps ['Screen Size']. Когда страница отправляется внутри метода public void execute (), assetProps заполняется полностью.