如何从链接/非面孔请求调用 JSF 支持 bean 方法

Posted

技术标签:

【中文标题】如何从链接/非面孔请求调用 JSF 支持 bean 方法【英文标题】:How to invoke JSF backing bean method from link/non-faces-request 【发布时间】:2012-11-18 22:36:09 【问题描述】:

用例是直接从超链接(非面孔请求)调用 JSF 2.x 支持 Bean 上的方法。最好的方法是什么?

我想做这样的事情:

链接:

http://localhost/show.xhtml?id=30&backingbeanname=loaddata&method=load

支持 Bean:

@Named (value = "loaddata")
public class DataLoader 

     public void load(int id) ... 

【问题讨论】:

【参考方案1】:

在目标视图中使用<f:viewParam> 将GET 参数设置为bean 属性,并使用<f:event type="preRenderView"> 对它们调用操作。

show.xhtml:

<f:metadata>
    <f:viewParam name="id" value="#bean.id" required="true" />
    <f:event type="preRenderView" listener="#bean.load" />
</f:metadata>
<h:message for="id" />

在托管 bean 中:

private Integer id;
private Data data;

public void load() 
    data = service.find(id);

请注意,在上面的示例中,URL http://localhost/show.xhtml?id=30 就足够了。您始终可以将更多参数设置为 bean 属性,并拥有一个代表所有内容的“上帝”bean,但这毕竟可能很笨拙。

还请注意,您可以将Converter 附加到&lt;f:viewParam&gt;(就像您在&lt;h:inputText&gt; 中所做的那样)。 load() 方法很可能完全是多余的。

<f:metadata>
    <f:viewParam name="id" value="#bean.data" 
        converter="dataConverter" converterMessage="Bad request. Unknown data."
        required="true" requiredMessage="Bad request. Please use a link from within the system." />
</f:metadata>
<h:message for="id" />

另见:

Communication in JSF 2 - Processing GET request parameters What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?

【讨论】:

虽然BalusC的解决方案调用了bean上的方法,但是并没有触发jsf导航。过了一会儿,我发现这个解决方案完全涵盖了我的用例:[link]docs.jboss.org/seam/3/latest/reference/en-US/html_single/… @user1866929:你没有说你需要导航。为此,请查看以下答案:***.com/questions/13530651/… 请注意,JSF 2.2 将附带类似的 &lt;f:viewAction&gt;

以上是关于如何从链接/非面孔请求调用 JSF 支持 bean 方法的主要内容,如果未能解决你的问题,请参考以下文章

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

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

如何在 JSF 中正确使用组件绑定? (会话范围 bean 中的请求范围组件)

在 JSF 2.0 中动态创建输入字段并将其链接到支持 bean

使用 URL 参数的 JSF 托管 Bean 方法调用

会话范围和 jsf 重定向