JSF 2:如何从SelectOneMenu中刷新支持bean的值?

时间:2013-10-21 07:43:54

标签: java ajax jsf-2 url-parameters prettyfaces

我使用Pretty Faces和JSF 2.

我有一个selectOneMenu来选择一个值。 然后我希望使用命令按钮将所选值传递给第二个表单,然后传递给另一个页面。我不想在URL中看到参数。

我不希望网址如下:addpartipant.xhtml或addparticipant.xhtml?study_name = TEST或/ Addparticpant / New / TEST。

我想要这样的URL / Addparticipant / New但是如果我这样做,我不会检索好的参数值,我只是在参数的bean中检索默认设置的值,而不是页面刷新值。

更令人不安的是,当我更改页面中的默认值时,我会出现一个按钮。它可以工作,但看起来参数的bean值没有影响,仍然保持默认值。

我应该怎么做?谢谢你的帮助。我在ajax调用中尝试了如此监听器在bean中设置值param但实际上它不起作用?

  

/ *更改值的时候抛出ajax事件的表单   selectOneMenu将值作为参数添加到第二种形式* /

<h:form id="studySelection_form">
  <h:outputText value="Sélection de l'étude :"/>
  <h:selectOneMenu  id="study" 
                    value="#{home.study_name}" 
                    required="true"
                    requiredMesage="Selectionnez au moins une étude.">
    <f:selectItems value="#{home.studyNameItems}" 
                   var="c" 
                   itemLabel="#{c.studyNameLabel}" 
                   itemValue="#{c.studyNameValue}" />

    <f:ajax execute="study" 
            render=":add_form" 
            event="change" 
            listener="#{home.updateStudyname}"/>
   </h:selectOneMenu>
 </h:form>
  

/ *从ajax注入要传递的参数的第二种形式   从下面的表格* /

中拨打移动事件
 <h:commandButton value="Ajout" 
                  type="button" 
                  action="pretty:participant" 
                  rendered="#{home.study_name ne '-----'}" >
   <f:param name="theNameofTheStudy" 
            value="#{home.study_name}"  />
 </h:commandButton>

PrettyFaces配置文件:

<url-mapping id="participant">
  <pattern value="/Participant/New/" />
  <view-id value="/addParticipant.xhtml" />
</url-mapping>

页面结果addParticipant.xhtml:

<h:outputFormat value="Print : {0}, {1} ">
  <f:param value="#{home.study_name}" />
  <f:param value=" #{theNameofTheStudy}" />
</h:outputFormat>

2 个答案:

答案 0 :(得分:0)

Prettyfaces always uses POST-REDIRECT-GET模式执行导航。因此,您可以在h:commandButton操作方法中调用托管bean方法,而不是返回导航结果本身并将参数放在flash scope中:

<h:commandButton value="Ajout" 
    action="#{home.actionGoToAddStudent}" 
    rendered="#{home.study_name ne '-----'}" />

在您的托管bean中:

public String actionGoToAddStudent(){
    FacesContext.getCurrentInstance().getExternalContext().getFlash().put("param1", study_name);
    return "pretty:participant"; //or just "/addParticipant.xhtml" and Prettyfaces will translate to pretty url
}

之后,您可以从目标托管bean中检索param1。这是使用隐藏参数。

每当您想使用标准的可见GET参数时,您会发现this post很有帮助。使用GET参数涉及使用GET请求发送它们,因此您的目标页面必须使用<f:viewParam>捕获它们并且可以将它们保存到目标托管bean属性中。在这里,您可以参考我的previously answered question

来源页面:

<!--Performs a GET request with study param-->
<h:button value="Basic GET request" outcome="pretty:participant">
    <f:param name="study" value="#{home.study}" />
</h:button>

目标网页

<f:metadata>
    <!--Takes the study param and sets it into the destination bean's property-->
    <f:viewParam name="study" value="#{destinationBean.study}" />
</f:metadata>

<h:outputFormat value="Print : {0} ">
   <f:param value="#{destinationBean.study}" />      
</h:outputFormat>

答案 1 :(得分:0)

如前所述,另一种解决方案可能是简单地使用JSF导航。参数保持隐藏在第一个导航URL页面(例如我们可以说/ Home)。但是你没有/ Addparticpant / New / TEST风格。

PrettyFaces提供的POST-REDIRECT-GET的优势是什么?并且f:param在使用PrettyFaces时实际上是没有意义的,因为POST ...除非你使用GET(这意味着你不使用PrettyFaces)&amp;你把参数放在URL中。我会读你的链接,因为我实际上遇到了一些问题,根据范围,Post / Get Action&amp;这个地方(在JSF页面/支持bean中)。

替代解决方案:                                                                 

    <navigation-rule>
       <from-view-id>/home.xhtml</from-view-id> 
       <navigation-case>
          <from-outcome>participant</from-outcome>
          <to-view-id>/addParticipant.xhtml</to-view-id>
       </navigation-case>
    </navigation-rule>


    /*I use viewparam but if I don't use it it's working too, I clearly don't understand what viewparam is used for  */

    <f:metadata>
          <f:viewParam name="study_name" value="#{home.study_name}" required="true"/>
     </f:metadata>

   /* What is the best way to retrieve information? Then how i load param in a backing bean who this destination page ? */ 
   <h:outputFormat value="Hello,{0},{1},">
                <f:param value="#{home.study_name}" />
                <f:param value="#{param.studynameItem}" />
    </h:outputFormat>