无法使用JSF表达式值设置managed-property参数

时间:2012-01-20 08:51:18

标签: jsf param selectonemenu

我有一个奇怪的问题,我一直试图修复一段时间,但我被困在一个地方,并不太明白这里发生了什么。

我的索引页面如下所示:

<h:selectOneMenu id="selectMenu" value="#{indexBean.model.selected_id}" styleClass="indexItems">
    <f:selectItems value="#{indexBean.myModelValues}" />    
    <a4j:support event="onchange" reRender="peek" />        
</h:selectOneMenu> 
<br>
<h:outputText id="peek" value ="#{indexBean.model.selected_id}"/>
<br>
<a4j:commandButton value="Go to Form" action="form" styleClass="indexItems">
    <f:param name="selected" value="#{indexBean.model.selected_id}" />                                       
</a4j:commandButton>

当我想从selectOneMenu获取所选位置时,commandButton会将用户发送到下一页。问题是没有发送任何东西。当我从菜单中选择一些值时,'peek'outputText被正确地重新渲染,我可以看到正确的选择。但是它不会发送到下一页和Bean。令人惊讶的是,当我将参数的值更改为固定的String时,它的工作原理!所以即:

<f:param name="selected" value="someValue1" />

在下一个Bean中正确读取!!!使用RichFaces @KeepAlive注释来请求所有bean的范围(我尝试没有注释,它是相同的)。我已经打过道了: - 将a4j:commandButton改为h:commandLink或h:outputLink - 将indexBean.model.selected_id改为indexBean.selected_id - 最终将输入源从h:selectOneMenu更改为h:inputText

没有任何帮助 - 它仍然是相同的 - 硬编码的String正确传递到下一页,但是当我尝试使用expresion时,参数始终为空。

这里我发布了faces-config.xml的片段:

<managed-bean>
    <managed-bean-name>indexBean</managed-bean-name>
    <managed-bean-class>id.webapp.beans.IndexBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>model</managed-bean-name>
    <managed-bean-class>id.webapp.beans.Model</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>formBean</managed-bean-name>
    <managed-bean-class>id.webapp.beans.FormBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>selectedValue</property-name>
        <value>#{param.selected}</value>
    </managed-property>
</managed-bean> 

有没有人知道为什么这不起作用?我已经使用过去的托管属性参数,并且它起作用(意味着使用一些动态更改的值而不是静态String)。

1 个答案:

答案 0 :(得分:1)

<f:param>在初始请求期间(显示表单时)进行评估,而不是在表单提交请求期间进行评估。所以它仍然是初始值,而不是改变的值。

<a4j:commandButton> id并在reRender中引用它,以便在按下按钮之前重新评估其<f:param>

<h:selectOneMenu id="selectMenu" value="#{indexBean.model.selected_id}" styleClass="indexItems">
    <f:selectItems value="#{indexBean.myModelValues}" />    
    <a4j:support event="onchange" reRender="peek,button" />        
</h:selectOneMenu> 
<br>
<h:outputText id="peek" value ="#{indexBean.model.selected_id}"/>
<br>
<a4j:commandButton id="button" value="Go to Form" action="form" styleClass="indexItems">
    <f:param name="selected" value="#{indexBean.model.selected_id}" />                                       
</a4j:commandButton>