【问题标题】:How to add request parameter in jsf2?如何在jsf2中添加请求参数?
【发布时间】:2014-02-02 09:36:58
【问题描述】:

在我的应用程序中,在升级到 jsf 2 之前,在进行自定义重定向时,我曾经手动将具有特定值的请求参数放入外部上下文中,如下所示:

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()
                .put(CmwNavigationControllerBean.PARAM_DISPLAY_TARGET_POPUP, "true");

现在这一行,抛出异常,因为似乎不再允许修改此地图:

at java.util.Collections$UnmodifiableMap.put(Unknown Source) [rt.jar:1.7.0]

难道真的没有其他方法可以绕过这个异常吗?由于升级,我正在进行重构,并尝试将更改保持在最低水平。

【问题讨论】:

    标签: java jsf-2 jsf-1.2


    【解决方案1】:

    您可以使用视图参数或使用 Flash 范围。视图参数实际上是一个 GET 参数,您可以在请求要重定向到的页面时传递该参数。对于您的情况,您应该使用附加的参数重定向到它。

    返回附加参数的导航案例:

    //Will be reflected in browser's address bar as /context/myDestinationView.xhtml?displayTargetPopUp=true
    return "myDestinationView?displayTargetPopUp=true&faces-redirect=true&includeViewParams=true";
    

    从目标视图中捕捉它:

    <f:viewParam name="displayTargetPopUp" value="#{displayTargetPopUp}" />
    

    如果您想避免在 GET 请求中包含它,另一种方法是使用 flash 作用域,该作用域应该在 Mojarra 2.1.27 和 2.2.5 版本中得到修复。 Flash 范围值旨在支持重定向,而请求值则不支持。

    另请参阅:

    【讨论】:

      【解决方案2】:

      您应该在ExternalContext 上调用getRequestMap() 而不是getRequestParameterMap()(只读)。

      例如:

      FacesContext.getCurrentInstance()
                  .getExternalContext()
                  .getRequestMap()
                  .put(CmwNavigationControllerBean.PARAM_DISPLAY_TARGET_POPUP, "true");
      

      【讨论】:

      • 我试过这样,但似乎在放置后立即为空,检查如return FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(CmwNavigationControllerBean.PARAM_DISPLAY_TARGET_POPUP);
      猜你喜欢
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      相关资源
      最近更新 更多