<f:viewParam>在使用<ui:composition template>时无效

3

我希望创建一个包含请求参数和请求范围bean的主从屏幕,但是视图参数未被填充。

调用重定向的链接:

<h:form>
        <p:dataTable var="visit" value="#{visitBean.findAllVisits()}">
            <p:column headerText="mdh">
                <p:commandLink action="#{visitDetailBean.seeVisitDetails(visit)}">
                    <h:graphicImage library="images" name="details.png"/>
                </p:commandLink>
            </p:column>
            ....

它背后的方法:

public String seeVisitDetails(Visit visit) throws IOException {
   return "/pages/mdh-details.xhtml?visitId=" + visit.getId()+ ";faces-redirect=true";
}

详细的xhtml页面:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:f="http://java.sun.com/jsf/core">

<f:metadata>
  <f:viewParam name="visitId" value="#{visitDetailBean.currentVisitId}" />
</f:metadata>

<ui:composition template="/templates/masterLayout.xhtml">
  <ui:define name="content">
    <h:outputText value="#{visitDetailBean.currentVisit.name}"/>
    test
  </ui:define>
</ui:composition>

并最后是细节Bean:
private long currentVisitId;

public void setCurrentVisitId(long currentVisitId) {
    this.currentVisitId = currentVisitId;
}

public long getCurrentVisitId() {
    return currentVisitId;
}

public Visit getCurrentVisit() {
    return visitService.findVisit(currentVisitId);
}

currentVisitId 总是 0.. 我实际上无法找到它。

1个回答

3
使用模板引擎时,<ui:composition><ui:define>之外的任何内容都会被忽略,包括<f:metadata>
将其移动到<ui:composition><ui:define>内部。
例如:
<ui:composition template="/templates/masterLayout.xhtml">
  <ui:define name="metadata">
    <f:metadata>
      <f:viewParam ... />
    </f:metadata>
  </ui:define>

  <ui:define name="content">
    ...
  </ui:define>
</ui:composition>

参考资料:


与具体问题无关,您最好将masterLayout.xhtml放在/ WEB-INF文件夹中以防止直接访问。

<ui:composition template="/WEB-INF/templates/masterLayout.xhtml">

请参见:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接