对于h:commandLink,使用f:attribute为commandButton而不是f:param

时间:2011-03-07 15:13:06

标签: jsf button parameters hyperlink command

我想根据点击的按钮添加特定页面。

到目前为止h:commandButton,我无法使用f:param,因此看起来我应该使用f:attribute代码。

如果是f:param,我会像这样编码:

<h:commandLink action="connectedFilein">
    <f:param name="fileId" value="#{fileRecord.fileId}"/>
<h:commandLink>

<c:if test="#{requestParameters.fileId!=null}">
    <ui:include src="fileOut.xhtml" id="searchOutResults"/>
</c:if>

f:attribuite案例是什么?

感谢

1 个答案:

答案 0 :(得分:15)

我假设您使用的是JSF 1.x,否则这个问题没有意义。遗留JSF 1.x中确实不支持<f:param>中的<h:commandButton>,但自JSF 2.0起支持它。

<f:attribute>可与actionListener结合使用。

<h:commandButton action="connectedFilein" actionListener="#{bean.listener}">
    <f:attribute name="fileId" value="#{fileRecord.fileId}" />
</h:commandButton>

public void listener(ActionEvent event) {
    this.fileId = (Long) event.getComponent().getAttributes().get("fileId");
}

(假设它是Long类型,这是ID的经典之作)


然而,最好使用JSF 1.2引入<f:setPropertyActionListener>

<h:commandButton action="connectedFilein">
    <f:setPropertyActionListener target="#{bean.fileId}" value="#{fileRecord.fileId}" />
</h:commandButton>

或者,当您已经运行支持Servlet 3.0 / EL 2.2的容器(Tomcat 7,Glassfish 3等)并且您的web.xml被声明为符合Servlet 3.0时,您可以将其作为方法参数传递。

<h:commandButton action="#{bean.show(fileRecord.fileId)}" />

public String show(Long fileId) {
    this.fileId = fileId;
    return "connectedFilein";
}

与具体问题无关,我强烈建议尽可能使用JSF / Facelets标签而不是JSTL

<ui:fragment rendered="#{bean.fileId != null}">
    <ui:include src="fileOut.xhtml" id="searchOutResults"/>
</ui:fragment>

(使用JSP代替Facelets时,A <h:panelGroup>也是可行的,也是最好的方法)