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>

メニュー以外のテンプレートのすべてを使用する必要があるページはほとんどありません。それらのページからメニューを表示しないように指定する方法はありますか。

フェイスレットパラメーターなどを渡すなど、フェイスレットで方法を探しています。次のオプションを考えましたが、それらを避けようとしています。

  1. 既存のものとまったく同じであるがメニューがない別のテンプレートを作成し、それらのページで使用します
  2. テンプレートからメニューを取り出し、必要なページで使用しますが、それは約 25 ページにメニューを追加することを意味します。メニューをテンプレートに保持したいと思います。
4

1 に答える 1

0

これに対する私にとっての実用的な解決策の1つは、ファイルのリストのブール値を提供するBeanであり、インクルードを切り替えるためにこれを使用しているテンプレートで:

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

Bean はこのようなものです。おそらく、メニューのないファイルで enum の代わりに .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 のアイデアをありがとう:
要求されたサーブレットなしで jsf マネージド Bean で要求 URL を取得するにはどうすればよいですか?

このアイデアを使用して、ファイルの固定リストの追加のデバッグ情報などを切り替えます。

于 2014-07-18T09:27:53.537 に答える