如何使用POST参数的JSF隐式重定向

Ach*_*raf 2 parameters jsf post

在我的JSF应用程序,我有两页,list.jsf并且details.jsf,每个网页有与视图范围内自己的控制器.在list.jsf我有一个<h:commandLink>调用动作并传递参数:

<h:commandLink value="details" action="#{listBean.goToDetails}" >
   <f:param  name="id" value="#{listBean.object.pk}"/></h:commandLink>
Run Code Online (Sandbox Code Playgroud)

这是bean方法:

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

我在第二个bean中读取参数,如下所示:

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

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

所以我想要做的是使用带有POST参数的"jsf隐式重定向"(不是前向)(f:param).

Eli*_*les 6

您无法使用POST重定向.

当您使用faces-redirect=true您使用的是HTTP重定向,并且发生的事情是:服务器发送一个HTTP 302与重定向,然后在浏览器确实在该网址上的GET请求的URL响应浏览器.

你可以做的是重定向到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);
}
Run Code Online (Sandbox Code Playgroud)

您可能希望创建一个util的方法,这样的事情,喜欢Faces#redirect()OmniFaces库.

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

public String goToDetails(){
    // some code
    String id = object.getPk().toString();
    return "details?faces-redirect=true&id=" + id;
}
Run Code Online (Sandbox Code Playgroud)


Arj*_*jms 5

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

您可以使用以下<h:link>标记:

<h:link value="details" outcome="details.jsf" >
    <f:param  name="id" value="#{listBean.object.pk}"/>
</h:link>
Run Code Online (Sandbox Code Playgroud)

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

<f:metadata>
    <f:viewParam name="id" value="#{detailsBean.id}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)

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

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

工作实例:

另见: