用例是直接从超链接(Non-Faces-Request)调用JSF 2.x Backing Bean上的方法。这样做的最佳方式是什么?
我想要做这样的事情:
链接:
http://localhost/show.xhtml?id=30&backingbeanname=loaddata&method=load
支持Bean:
@Named (value = "loaddata")
public class DataLoader {
public void load(int id){ ... }
}
答案 0 :(得分:5)
在目标视图中使用<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);
}
请注意,在上面的示例中,网址http://localhost/show.xhtml?id=30
就足够了。你总是可以设置更多的参数作为bean属性,并有一个“上帝”bean代表所有东西,但这毕竟可能是笨拙的。
另请注意,您只需将Converter
附加到<f:viewParam>
(就像您在<h:inputText>
中所做的那样)。 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" />