2

在我的 JSF 应用程序中,我有两个页面,list.jsfdetails.jsf,每个页面都有自己的具有视图范围的控制器。在list.jsf我有一个<h:commandLink>调用一个动作并传递一个参数:

<h:commandLink value="details" action="#{listBean.goToDetails}" >
   <f:param  name="id" value="#{listBean.object.pk}"/></h:commandLink>

这是豆方法:

@ManagedBean
@ViewScoped
public class ListBean {
    public String goToDetails() {
        // some code
        return "details?faces-redirect=true";
    }
}

我像这样读取第二个 bean 中的参数:

Map<String, String> params = FacesContext.getCurrentInstance()
                .getExternalContext().getRequestParameterMap();
        this.setIdParam(params.get("id"));

当我运行此代码时,参数不会传递给第二个 bean 实例。但是,当我将导航更改为forward(不带faces-redirect=true)时,传递了参数,我可以看到详细信息,details.jsf但 URL 与当前页面不匹配。

所以我想做的是使用带有POST参数(f:param)的“jsf隐式重定向”(不是转发)。

4

2 回答 2

6

您不能使用 POST 重定向。

当您使用时,faces-redirect=true您正在使用HTTP 重定向,发生的情况是:服务器向浏览器发送HTTP 302响应,其中包含用于重定向的 URL,然后浏览器对该 URL 执行 GET 请求。

您可以做的是重定向到id通过 GET 发送参数的 URL,如下所示:

public void goToDetails(){
    // some code
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext()
    String id = object.getPk().toString();
    ec.redirect(ec.getRequestContextPath() + "/details.jsf?id=" + id);
}

Faces#redirect()您可能想为这类事情创建一个 util 方法,例如OmniFaces library

更新:如评论中所述,也可以在返回字符串中添加 id :

public String goToDetails(){
    // some code
    String id = object.getPk().toString();
    return "details?faces-redirect=true&id=" + id;
}
于 2012-12-27T13:07:10.530 回答
5

如果后面的支持 beanlist.jsf不需要做任何处理(从示例中它看起来不像),您应该details.jsf通过 GET 请求直接链接到。

您可以<h:link>为此使用标签,如下所示:

<h:link value="details" outcome="details.jsf" >
    <f:param  name="id" value="#{listBean.object.pk}"/>
</h:link>

在您的详细信息视图中,您可以声明该视图使用 GET 参数并将其直接绑定到该视图的支持 bean:

<f:metadata>
    <f:viewParam name="id" value="#{detailsBean.id}" />
</f:metadata>

此外,您可以直接验证和/或转换该参数,因此您detailsBean将获得正确类型的 Object 而不是基于字符串的 id。如果detailsBean在 GET 参数注入后需要做任何后期处理,可以使用preRenderView事件:

<f:metadata>
    <f:viewParam name="id" value="#{detailsBean.id}" />
    <f:event type="preRenderView" listener="#{detailsBean.preRenderView()}" />
</f:metadata>

工作示例:

另见:

于 2012-12-28T09:40:16.593 回答