【问题标题】:Get Request and Session Parameters and Attributes from JSF pages从 JSF 页面获取请求和会话参数和属性
【发布时间】:2010-10-07 17:14:53
【问题描述】:

我正在使用带有 facelets 的 JSF,我需要在 JSF 页面中获取请求和会话参数。在 JSP 页面中,我得到了这样的参数:"${requestScope.paramName}""${sessionScope.paramName}"。但是现在使用 JSF 后只有 bean,除了 bean 属性之外,你无法获取任何值。

注意:我需要的会话属性是使用 acegi security 自动填充的,因此我无法访问它们。

那么现在该怎么办?

【问题讨论】:

    标签: session jsf request facelets


    【解决方案1】:

    您可以使用表达式获取请求参数id

    <h:outputText value="#{param['id']}" />
    
    • param - 此请求的请求参数的不可变 Map,由 参数名称。仅包含每个参数名称的第一个值。
    • sessionScope - 此请求的会话属性映射,由 属性名称。

    JSF 1.0 specification 的第 5.3.1.2 节定义了必须由变量解析器解析的对象。

    【讨论】:

      【解决方案2】:

      您也可以使用 bean(建议使用请求范围)并通过 FacesContext 直接访问上下文。

      您可以使用以下代码获取 HttpServletRequest 和 HttpServletResposne 对象:

      HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
      HttpServletResponse res = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
      

      之后,您可以通过getParameter(paramName) 访问各个参数或通过getParameterMap() req 对象访问完整地图

      我建议使用请求范围 bean 的原因是您可以在初始化期间使用它们(最坏的情况是构造函数。大多数框架都会在 bean 初始化时为您提供一些地方来编写代码)并且它们会在您的请求到来时完成在。

      不过,这有点小题大做。 ;) 你可能想看看是否有一个 JSF Acegi 模块可以让你访问你需要的变量。

      【讨论】:

      【解决方案3】:

      你可以使用

      &lt;h:outputText value="#{param['id']}" /&gt;

      &lt;h:outputText value="#{request.getParameter('id')}" /&gt;

      但是,如果您想将参数传递给您的支持 bean,则使用 f:viewParam 可能是您想要的。 “视图参数是查询字符串参数和模型值之间的映射。”

      &lt;f:viewParam name="id" value="#{blog.entryId}"/&gt;

      这会将 GET 参数的 id 参数设置为 blog bean 的 entryId 字段。详情请见http://java.dzone.com/articles/bookmarkability-jsf-2

      【讨论】:

        【解决方案4】:

        你可以这样:

        #{requestScope["paramName"]} ,#{sessionScope["paramName"]}
        

        因为requestScopesessionScope 是一个地图对象。

        【讨论】:

          【解决方案5】:

          您也可以使用像 OcpSoft 的 PrettyFaces 这样的工具将动态参数值直接注入 JSF Beans。

          【讨论】:

            【解决方案6】:

            假设您已经将对象作为属性放在托管 bean 中 FacesContext 的当前实例的会话映射上,您可以通过以下方式从 JSF 页面获取它:

            <h:outputText value="#{sessionScope['yourObject'] }" />
            

            如果您的对象有属性,请通过以下方式获取:

            <h:ouputText value="#{sessionScope['yourObject'].anyProperty }" />
            

            【讨论】:

            【解决方案7】:

            您确定无法从 JSF 页面访问请求/会话范围变量吗?

            这就是我在登录页面中使用 Spring Security 所做的:

            <h:outputText
                rendered="#{param.loginFailed == 1 and SPRING_SECURITY_LAST_EXCEPTION != null}">
                <span class="msg-error">#{SPRING_SECURITY_LAST_EXCEPTION.message}</span>
            </h:outputText>
            

            【讨论】:

              【解决方案8】:

              在 bean 中你可以使用 session.getAttribute("attributeName");

              【讨论】:

                猜你喜欢
                • 2014-10-07
                • 2019-09-03
                • 2012-06-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-06-10
                • 2011-03-22
                • 2011-09-02
                相关资源
                最近更新 更多