使用<ui:composition template =“”>时,<f:viewparam>无法正常工作

时间:2015-05-07 15:57:41

标签: jsf templates facelets composition viewparams

我想创建一个包含请求参数和requestScoped 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 个答案:

答案 0 :(得分:3)

使用模板时,<ui:composition><ui:define>之外的任何内容都被忽略。这包括<f:metadata>

将其移至<ui:define>的{​​{1}}内。

E.g。

<ui:composition>

另见:

对于具体问题

无关,您最好将<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

另见: