Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用带有POST参数的JSF隐式重定向_Jsf_Post_Parameters - Fatal编程技术网

如何使用带有POST参数的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

在我的JSF应用程序中,我有两个页面,
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>
工作实例:

另见:


相关:非常好奇;goToDetails中的“一些代码”由什么组成?从您描述的方法名称和用例来看,很难想象它能做什么。如果它确实做了一些有用的事情,eljunior的答案是最好的(但是用一个简单的结果替换这些陈述),否则arjan tijms的答案更好。我真的很抱歉投了反对票。你回答的第一部分很好,但我觉得第二部分不是最佳答案。你现在建议做一个PRG,而这里需要的只是一个get。即使需要iff PRG,也可以返回带有重定向指令和参数的结果。例如return“details.jsf?faces redirect=true&id=“+id;但如果你不需要PRG,直接链接即可。这对性能更有利,直接链接可以被添加书签,提前检查,等等。@MikeBraun我同意简单的链接更好,只是OP的代码中有一条注释说,
//一些代码
,这意味着有更多的东西。否则,我完全同意链接是最好的。是的,你是对的。根据“某些代码”的作用,确实需要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>