viewscoped bean不保存会话参数

时间:2012-03-15 12:45:14

标签: jsf-2

我有一个带有数据表的页面,其中包含产品信息,在产品选择操作中,我会重定向到产品信息页面,传递参数:

configurableNavigationHandler.performNavigation("productInfo?faces-redirect=true&prId=" + selectedCpl.getP().getPrId());

在我的init方法的viewscoped bean中,我得到了request参数并填充了所需的对象:

@ManagedBean
@ViewScoped
public class ProductInfo implements Serializable {

private Product p;
private Integer prId;

@PostConstruct
private void init() {
    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
    if (request.getParameter("prId") != null) {
        prId = Integer.parseInt(request.getParameter("prId"));
        p = pf.find(prId);

在我的productInfo.xhtml上我有一个产品信息视图和一个用于编辑产品信息的对话框但是当我按下提交时我的请求参数为空:

<p:commandButton styleClass="button-edit" value="Submit" actionListener="#{productInfo.saveProduct()}" update="prodInfo" oncomplete="dlg.hide();"/>  

我正在使用带有primefaces元素的jsf 2.0。

任何人都可以帮助我吗?谢谢。

1 个答案:

答案 0 :(得分:1)

这不是会话参数。这是一个请求参数。这是null是因为您没有将其与提交请求一起发送。通过<f:param>发送。

<p:commandButton ...>
    <f:param name="prId" value="#{productInfo.prId}" />
</p:commandButton>

对具体问题

无关,还有其他几个潜在的问题。首先,在提交表单时,应该重新创建视图范围的bean。也许您在视图中使用了标记处理程序。其次,你应该尽可能避免在JSF封面下运行原始的javax.servlet API。请改用ExternalContext#getRequestParameterMap()。第三,<f:viewParam>比后构造更清洁。第四,由导航处理程序重定向闻起来像视图中的设计问题,例如,为什么不只使用GET链接?

Communication in JSF 2.0中提供了对所有这些问题的深入解释。