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).
您无法使用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)
如果后面的支持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)
工作实例:
另见: