我使用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>
答案 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>