我有一个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>
除菜单外,很少有页面需要使用模板中的所有内容。有没有办法从这些页面指定不显示菜单。
我正在寻找facelets中的方法,比如传递facelet param或者其他东西。我想到了以下选项,但我试图避免它们:
答案 0 :(得分:0)
对我来说,一个为此工作的解决方案是一个bean,它为文件列表提供布尔值,并在模板中使用它来切换include:
<c:choose>
<c:when test="#{toogleMenu.withMenu}" >
<ui:include src="/menu.xhtml" />
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose>
bean就是这样的,也许你可以使用.properties或DB而不是enum来处理没有菜单的文件。
@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?
我使用这个想法为固定的文件列表切换额外的调试信息等。