如何在页面加载时处理支持 bean 中的 GET 查询字符串 URL 参数?

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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 和换肤支持的组件库。

另见:

What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for? Communication in JSF 2.0 - Processing GET request parameters @ManagedProperty with request parameter not set in a @Named bean

【讨论】:

我曾经将 PostConstruct 用于此类事情(以及数据库访问)。我刚刚发现的问题是,在 requestscoped bean 上,该方法将在与所述 bean 无关的 ajax req 上被调用。 viewAction 并非如此。对于任何想知道为什么的人:***.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 中出现许多不必要的样板代码。另请参阅已接受答案中的“另请参阅”链接。

以上是关于如何在页面加载时处理支持 bean 中的 GET 查询字符串 URL 参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JSF 页面加载之前在支持 bean 中启动特殊的 init 事件?

如何在与有条件呈现的内容相关联的页面加载时不初始化 bean

JSF 如何从支持 bean 重定向到支持 bean 中动态构建的 URL?

JSF。在每个页面加载时调用支持 bean 方法[重复]

单击按钮时如何重新加载页面?

如何在支持 bean 中处理漂亮的“查询参数”?