0

我有一个 facelet 模板,其中包含一个菜单以及以下代码中未包含的其他内容:

<h:head>
   ..............................
</h:head>
<h:body>
    <ui:include src="/menu.xhtml" />
   ..............................       
   ..............................
<h:body>

我在 30 左右的所有页面都使用此模板:

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

</ui:composition>

很少有页面需要使用模板中除菜单之外的所有内容。有没有办法从这些页面中指定不显示菜单。

我正在寻找一种方法,比如传递一个 facelet 参数或其他东西。我想到了以下选项,但我试图避免它们:

  1. 创建另一个与现有模板完全相同但没有菜单的模板并在这些页面中使用它
  2. 从模板中取出菜单并在需要的页面上使用,但这意味着将菜单添加到大约 25 页,我想将菜单保留在模板中。
4

1 回答 1

0

对我来说,一个可行的解决方案是一个 bean,它为文件列表提供一个布尔值,在模板中你使用它来切换包含:

<c:choose>
    <c:when test="#{toogleMenu.withMenu}" >
       <ui:include src="/menu.xhtml" />
    </c:when>
    <c:otherwise>
       ...
    </c:otherwise>
</c:choose>

bean 是这样的,也许您可​​以使用 .properties 或 DB 来代替没有菜单的文件的枚举。

@Named(value = "toogleMenu")
@ViewScoped
public class ToogleMenuBean implements Serializable {
   ...
   private static final String[] EXCLUDE_FILES = { "nomenu.xhtml", ... };

   public String getCurrentURL() {
     FacesContext context = FacesContext.getCurrentInstance();
     HttpServletRequest req = (HttpServletRequest) context.getExternalContext().getRequest();
     return req.getRequestURL().toString();
  }              

   public String getCurrentFile() {
     String url = getCurrentURL();
     return url.substring(url.lastIndexOf("/")+1);
   }

  public List<String>getExcludes() {
    List<String> excludes = new LinkedList<>();
    excludes.addAll(Arrays.asList(ToogleMenuBean.EXCLUDE_FILES));
    return excludes;
  }

  public boolean isWithMenu() {
    boolean ret = ! getExcludes().contains(getCurrentFile());
    return ret;
  }
}

感谢这里关于 getCurrentUrl 的想法:
How do I get request url in jsf managed bean without the requested servlet?

我使用这个想法来为固定的文件列表切换额外的调试信息等。

于 2014-07-18T09:27:53.537 回答