【问题标题】:viewscoped bean doesn't save session parameterviewscoped bean 不保存会话参数
【发布时间】:2012-03-15 12:45:14
【问题描述】:

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

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

在我的 init 方法中的 viewscoped bean 中,我获取请求参数并填充所需的对象:

@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。

谁能帮帮我?谢谢。

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    这不是会话参数。这是一个 request 参数。它是null 是因为您没有将它与提交请求一起发送。通过&lt;f:param&gt;发送。

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

    与具体问题无关,还有其他几个潜在问题。首先,当您提交表单时,应该重新创建视图范围的 bean。也许您正在视图中使用标记处理程序。其次,您绝对应该尽可能避免从 JSF 的封面下获取原始的 javax.servlet API。请改用ExternalContext#getRequestParameterMap()。第三,&lt;f:viewParam&gt; 比 postconstruct 干净得多。第四,导航处理程序的重定向听起来像是视图中的设计问题,例如为什么不只使用 GET 链接?

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

    【讨论】:

    • 谢谢..是的,但即使使用参数,对象也会重新创建并且无法保存更改。我使用了另一种方法,并在每次重定向到 productinfo 页面之前使我的 bean sessionscoped 和列表页面上我销毁了会话对象 FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("productInfo"); ...使其工作的唯一方法...关于其他建议...我不明白为什么我的 viewscoped bean 是根据 ajax 请求重建的...我需要 postconstruct 来填充我正在使用的 10 个对象视图
    • 阅读“无关”说明。不应重新创建视图范围 bean,您应该使用 &lt;f:viewParam&gt;。给定链接后面已经提供了详细的解释/解决方案/示例。使用会话范围不是解决方案,而是一种技巧/解决方法。
    • 我阅读了整篇文章,它帮助我改进了部分代码。我在 select - 重定向上使用 p:datatable 和 p:ajax 请求,这是我可以重定向的唯一方法。我不明白的是,在我做重定向之后,我的 productList viewscoped bean 再次被重建......它是有点慢。你也是对的,我首先使用标签我必须使用模板,所以我使用 将模板包含在 xhtmls 和 用于内容部分。这是我的第一个 JSF 应用程序,我真的很想把它做好。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-08-15
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多