在我的 JSF 应用程序中,我有两个页面,list.jsf
and details.jsf
,每个页面都有自己的控制器和视图范围。在list.jsf
我有一个<h:commandLink>
调用一个动作并传递一个参数:
<h:commandLink value="details" action="#{listBean.goToDetails}" >
<f:param name="id" value="#{listBean.object.pk}"/></h:commandLink>
这是 bean 方法:
@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 隐式重定向”(不是转发)。
您无法使用 POST 进行重定向。
当你使用faces-redirect=true
你正在使用一个HTTP重定向,发生的情况是:服务器发送一个HTTP 302使用用于重定向的 URL 响应浏览器,然后浏览器对该 URL 执行 GET 请求。
您可以做的是重定向到发送以下内容的 URLid
通过 GET 获取参数,如下所示:
public void goToDetails(){
// some code
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext()
String id = object.getPk().toString();
ec.redirect(ec.getRequestContextPath() + "/details.jsf?id=" + id);
}
您可能想为此类事情创建一个 util 方法,例如Faces#redirect() of OmniFaces 库.
UPDATE:正如评论中所述,也可以只在返回字符串中添加 id:
public String goToDetails(){
// some code
String id = object.getPk().toString();
return "details?faces-redirect=true&id=" + id;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)