0

我使用 Pretty Faces 和 JSF 2。

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

我不想要这样的网址:addpartipant.xhtml,或 addparticipant.xhtml?study_name=TEST 或 /Addparticpant/New/TEST。

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

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

我该怎么办?感谢您的帮助。我在ajax调用中尝试了这样的监听器来设置bean中的值参数,但它实际上不起作用?

/* 当您更改 selectOneMenu 的值以将该值作为参数添加到第二个表单时,该表单会引发 ajax 事件 */

<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>

/* 第二种形式,其中要传递的参数是从下面形式的 move 事件的 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>
4

2 回答 2

0

Prettyfaces总是使用 POST-REDIRECT-GET模式来执行导航。因此,您的机会是在您的操作方法中调用托管 bean 方法,h:commandButton而不是返回导航结果本身并将您的参数放在flash 范围内

<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
}

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

每当您想使用标准的可见 GET 参数时,您会发现这篇文章很有帮助。使用 GET 参数涉及将它们与 GET 请求一起发送,因此您的目标页面必须使用一个捕获它们<f:viewParam>并且可以将它们保存到目标托管 bean 属性中。在这里你可以参考我之前回答的问题

来源页面:

<!--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>
于 2013-10-23T06:36:07.127 回答
0

正如您之前所说,另一种解决方案可能是简单地将前进与 JSF 导航一起使用。参数被隐藏在第一个导航 url 页面(例如我们可以说 /Home)。但是好的,你不会有 /Addparticpant/New/TEST 样式。

PrettyFaces 提供的 POST-REDIRECT-GET 有什么优势?而 f:param 实际上在您使用 PrettyFaces 因为 POST 时毫无意义......除非您使用 GET(这意味着您不使用 PrettyFaces)并且您将参数放在 URL 中。我会阅读您的链接,因为实际上我在根据范围、发布/获取操作和位置(在 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>
于 2013-10-23T09:18:41.150 回答