2

Springの勉強を始めたばかりで、Webアプリを作ろうとしています。フッター、ヘッダー、サイドバーなどの一般的な UI 要素がいくつかあり、動的ブロック、つまりウィジェットも追加したいと考えています。含めるウィジェットは、JSP テンプレートではなく、Java コードで選択する必要があります。

そして、それが私が立ち往生しているところです。すべてのコントローラーは独自のビューを返しますmain.jsp。これには、いくつかの静的ブロックと動的ブロックが含まれます。

 <jsp:include page="head.jsp" />  
     <c:forEach items="${viewList}" var="viewName">
                 <jsp:include page="${viewName}.jsp" />    
    </c:forEach>
...

コントローラーでは、ウィジェットとして使用されるビュー リストとオブジェクトをモデルに渡します。

 ...
 views.add(moduleOne.getViewName());
 views.add(moduleTwo.getViewName());
 model.addAllAttributes(moduleOne.getAttr());  
 model.addAllAttributes(moduleTwo.getAttr());  
 model.addAttribute(IModule.VIEW_LIST, views); // passing all views that will be included into main.jsp
 ...
 return "main";

しかし、jsp:include pageモデルパラメータを使用するとインクルードに渡されないため、機能しません。また%@include file=、その場合、変数を使用できず、コンパイル時に渡すビューを知る必要があるため、できません。

もちろん、解決策がない場合は、可能なすべてのウィジェット ビューをハードコーディングしてmain.jsp、それらを切り替える必要があります。

   switch($i) {
    case 1: 
          include file=widget1.jsp;
          break;
    case 2: 
        include file=widget2.jsp;
        break;
      ...                    
    }

これは明らかに柔軟ではありません。

したがって、質問は次のとおりです。

  1. %@include file=使用せずにモデルを渡してビューを含め、ウィジェットを機能させる問題を解決する方法はあります か?
  2. そのようなウィジェット構造を実装するためのより良い方法はありますか?

ありがとうございました!

4

1 に答える 1

0

モデル属性を使用して、含めるファイルをいつでも決定できます

model.addAttribte("fileToInclude",IncludeFile.HEADER);

その後

<c:choose>
<c:when test="${fileToInclude == 'HEADER'}">
<%@include file="header.jsp"%>
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>

しかし、はるかに優れたクリーンな方法があります。SiteMesh のようなデコレータを使用すると、ビューにさまざまなデコレータを適用できます。Sitemesh を試してみてください

于 2013-10-13T16:39:55.420 に答える