如何在页面加载时处理支持 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>
如有必要,您可以使用 <f:viewAction>
(仅限 JSF 2.2+)或 <f:event type="preRenderView">
调用 bean 操作。
<f:metadata>
<f:viewParam name="companyId" value="#bean.companyId" />
<f:viewAction action="#bean.onload" />
</f:metadata>
使用<f:viewAction>
时,您甚至可以返回导航结果。
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/… 如果我使用有一个实用程序库 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