如何使用带有POST参数的JSF隐式重定向
在我的JSF应用程序中,我有两个页面,如何使用带有POST参数的JSF隐式重定向,jsf,post,parameters,Jsf,Post,Parameters,在我的JSF应用程序中,我有两个页面,list.JSF和details.JSF,每个页面都有自己的具有查看范围的控制器。在list.jsf中,我有一个调用操作并传递参数的: <h:commandLink value="details" action="#{listBean.goToDetails}" > <f:param name="id" value="#{listBean.object.pk}"/></h:commandLink> 我在第二个be
list.JSF
和details.JSF
,每个页面都有自己的具有查看范围的控制器。在list.jsf
中,我有一个调用操作并传递参数的
:
<h:commandLink value="details" action="#{listBean.goToDetails}" >
<f:param name="id" value="#{listBean.object.pk}"/></h:commandLink>
我在第二个bean中读取参数,如下所示:
Map<String, String> params = FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap();
this.setIdParam(params.get("id"));
public void goToDetails(){
// some code
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext()
String id = object.getPk().toString();
ec.redirect(ec.getRequestContextPath() + "/details.jsf?id=" + id);
}
Map params=FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap();
this.setIdParam(params.get(“id”));
当我运行这段代码时,参数不会传递给第二个bean实例。
但是,当我将导航更改为forward
(不带faces redirect=true
)时,参数被传递,我可以在details.jsf
中查看详细信息,但URL与当前页面不匹配
所以我想做的是使用带有POST参数(f:param)的“jsf隐式重定向”(不是转发)。不能使用POST重定向 当您使用
faces redirect=true
时,您使用的是,发生的情况是:服务器向浏览器发送一个带有重定向URL的响应,然后浏览器对该URL执行GET请求
相反,您可以通过GET重定向到一个URL,发送id
参数,如下所示:
Map<String, String> params = FacesContext.getCurrentInstance()
.getExternalContext().getRequestParameterMap();
this.setIdParam(params.get("id"));
public void goToDetails(){
// some code
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext()
String id = object.getPk().toString();
ec.redirect(ec.getRequestContextPath() + "/details.jsf?id=" + id);
}
您可能想为这类事情创建一个util方法,比如
更新:如注释中所述,也可以只在返回字符串中添加id:
public String goToDetails(){
// some code
String id = object.getPk().toString();
return "details?faces-redirect=true&id=" + id;
}
如果
list.jsf
后面的支持bean不需要进行任何处理(从示例中看,它看起来不像),那么您应该通过GET请求直接链接到details.jsf
您可以按如下方式使用
标记:
<h:link value="details" outcome="details.jsf" >
<f:param name="id" value="#{listBean.object.pk}"/>
</h:link>
工作实例:
//一些代码
,这意味着有更多的东西。否则,我完全同意链接是最好的。是的,你是对的。根据“某些代码”的作用,确实需要PRG模式,但是您可以使用带有参数的结果字符串,而不是以编程方式设置重定向。我很好奇什么是“一些代码”。对于从列表链接到详细信息视图,我觉得这也不需要,但当然只有OP知道这一点;)是的,我不知道你可以在返回字符串中添加URL参数。现在刚完成测试,学到了一些新东西!:)感谢这种方法确实更好,尽管OP的代码中有一条注释暗示action方法中有更多的代码。感谢您的回复,这非常有用,但在我的情况下,我必须使用commandButton进行操作。@Achraf您还知道为什么需要commandButton吗?如果您只想渲染一个按钮,那么也可以使用h:button。这将触发一个get请求,就像h:link一样。除了重定向,您的操作还做了哪些特殊的事情?(只是好奇和帮助他人选择哪种方法)。谢谢感谢@MikeBraun的干预。在我的例子中,操作在重定向之前执行一些代码。解释:我有多个详细视图(details1.jsf、details2.jsf…),每个对象实例都必须与相应的视图相关联,因此在goToDetails方法中,我必须执行一些逻辑来指定重定向目标
<f:metadata>
<f:viewParam name="id" value="#{detailsBean.id}" />
<f:event type="preRenderView" listener="#{detailsBean.preRenderView()}" />
</f:metadata>