【问题标题】:How do I process GET query string URL parameters in backing bean on page load?如何在页面加载时处理支持 bean 中的 GET 查询字符串 URL 参数?
【发布时间】:2012-05-30 06:23:11
【问题描述】:

我已经阅读了如何使用 JSF 发送参数,但是如果用户在访问他们的登录页面时在 URL 中键入他们的companyId 怎么办?例如,

http://my.company.url/productName/login.faces?companyId=acme.

我们现在这样做的方式是,有一些 scriptlet 代码从请求中获取值,然后在会话中设置它。该参数从登录页面开始改变他们的外观和感觉,因此每个客户都可以有不同的登录页面视图。在我切换到 JSF 之前,我们一直在使用 extjs。

有没有办法使用 JSF 2 或 PrimeFaces 来做到这一点?

【问题讨论】:

    标签: jsf jsf-2 query-string managed-bean http-request-parameters


    【解决方案1】:

    如果要获取完整的查询参数字符串,可以使用request.getQueryString()

    【讨论】:

      【解决方案2】:

      是的,您可以使用 <f:viewParam> 将请求参数设置为托管 bean 属性。

      <f:metadata>
          <f:viewParam name="companyId" value="#{bean.companyId}" />
      </f:metadata>
      

      如有必要,您可以使用 &lt;f:viewAction&gt;(仅限 JSF 2.2+)或 &lt;f:event type="preRenderView"&gt; 调用 bean 操作。

      <f:metadata>
          <f:viewParam name="companyId" value="#{bean.companyId}" />
          <f:viewAction action="#{bean.onload}" />
      </f:metadata>
      

      使用&lt;f:viewAction&gt; 时,您甚至可以返回导航结果。

      public String onload() {
          // ...
      
          return "somepage";
      }
      

      如果还没有使用 JSF 2.2,您可以使用 ExternalContext#redirect()。另请参阅How to perform navigation in preRenderView listener method

      请注意,这并不特定于 PrimeFaces。它只是标准 JSF 的一部分。 PrimeFaces 只是一个提供增强的 ajax 和换肤支持的组件库。

      另见:

      【讨论】:

      • 我曾经将 PostConstruct 用于此类事情(以及数据库访问)。我刚刚发现的问题是,在 requestscoped bean 上,该方法将在与所述 bean 无关的 ajax req 上被调用。 viewAction 并非如此。对于任何想知道为什么的人:stackoverflow.com/questions/24490152/…
      • 如果我使用,ManagedBean中是否不需要context.getExternalContext().getRequestParameterMap()“……你甚至可以返回一个导航结果。”是重定向吗?
      【解决方案3】:

      有一个实用程序库 OmniFaces 可以开箱即用。

      @Inject @Param
      private String key;
      
      @Inject @Param
      private Long id;
      

      【讨论】:

        【解决方案4】:

        url参数也可以当作请求参数,所以你也可以通过

        FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()
        

        【讨论】:

        • 它们请求参数。但是,您提出的方式允许较少细粒度的转换/验证,这可能会导致支持 bean 中出现许多不必要的样板代码。另请参阅已接受答案中的“另请参阅”链接。
        猜你喜欢
        • 2012-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-23
        相关资源
        最近更新 更多