使用向导时,如何将输入框值绑定到支持Bean属性中的映射值

alg*_*one 5 jsf binding map primefaces

我正在使用Primefaces向导组件.在一个选项卡上,我基于先前的选项卡输入(用户类型)动态创建输入框.输入框文本标签是从列表派生的.在我的支持bean中,我有一个地图,其中包含输入标签作为键,输入框输入作为值.

点击下一步,我想用用户输入(对应键)更新地图(值)

<c:forEach items="#{gdsiGeodataBean.actionCommand.fields}" var="reqs">
  <h:outputLabel for="#{reqs.name}" value="#{reqs.name}:* " />  
  <pou:inputText value="#{gdsiGeodataBean.actionCommand.values['reqs.name']}"  required="true" requiredMessage="Input is required."/> 
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

我的支持豆:

private List<RequiredParam> fields; // +getter (no setter required)
private Map<String, String> values; // +getter (no setter required)

public CommandAction(String actionName, String actionParams, String context) {
    this.actionName = actionName;
    this.actionParams = actionParams;
    this.contextName = context;

    //Set up parameters
    getRequiredParams();
    getOptionalParams();
    fields = getFields();
    values = new HashMap<String, String>();
}
Run Code Online (Sandbox Code Playgroud)

基本上我想要的是使用textinput框中的用户输入更新地图值.

Bal*_*usC 12

将输入值绑定到地图的方法并不完全正确.

<pou:inputText value="#{gdsiGeodataBean.actionCommand.values['reqs.name']}"  required="true" requiredMessage="Input is required."/> 
Run Code Online (Sandbox Code Playgroud)

您正在根据当前迭代的内容指定固定的映射键而不是动态映射键#{reqs}.这样,所有提交的值都将以一个相同的固定映射键结束"reqs.name",每个键都会相互覆盖,以便您只获取映射中最后一个字段的值.

您需要删除这些单引号,使其成为一个非常动态的密钥.

<pou:inputText value="#{gdsiGeodataBean.actionCommand.values[reqs.name]}"  required="true" requiredMessage="Input is required."/> 
Run Code Online (Sandbox Code Playgroud)

具体问题无关,即使这种方法在您的问题中按原样使用时,<c:forEach>在某些情况下也会失败.例如,在复合组件或迭代JSF组件中使用时.而是<ui:repeat>改为使用.另请参阅JSF2 Facelets中的JSTL ......有意义吗?

  • @maple_shaft:只需要一个getter`getValues()`.地图/列表上不需要setter.JSF EL将通过EL给定键/索引在获取的地图/列表上设置值.像这样:`gdsiGeodataBean.getActionCommand().getValues().put(reqs.getName(),newValue)`.这不管它是否在`<c:forEach>`,`<ui:repeat>`等中. (2认同)