1

spring-mvc と spring-webflow を使用して独自のプロジェクトを開発しています。Spring Webflow と ajax に関するいくつかの記事を読んだ後、ビューのレンダリングに Apache Tiles を使用する方が良いオプションであることがわかりました。

Sitemesh では、タグ コール ヘッド () を使用しました。テンプレートで使用されるそのタグにより、結果の HTML でレンダリングされるページの head 属性全体をレンダリングできます。

Apache Tiles でこれを達成する方法はありますか? 私の読書から、私は次のことをしなければならないと思います:

2 つの jps。1 つはページの body を含み、もう 1 つは head 定義を含みます。理解を深めるために、テンプレート、ページ、およびタイル定義の例を次に示します。

タイルの定義

<tiles-definitions>
  <definition name="base" template="/WEB-INF/view/templates/tileslayout.jsp">
    <put-attribute name="title" value="Held - main page"/>
    <put-attribute name="body" value=""/>
    <put-attribute name="head" value=""/>
  </definition>

  <definition name="company.edit" extends="base">
    <put-attribute name="head" value="/WEB-INF/view/company/editHeader.jsp"></put-attribute>
    <put-attribute name="body" value="/WEB-INF/view/company/edit.jsp"></put-attribute>
  </definition>

</tiles-definitions>

テンプレート:

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> 
<html>
<head>
 -- css and scripts --
 <tiles:insertAttribute name="head"  ignore="true"/>
<!--  <decorator:head /> -->
</head>

<body>

--- menu definition ---

<div class="container-fluid">
    <tiles:insertAttribute name="body"/>
<!--   <decorator:body/> -->
</div>
<hr/>      
<footer>
    -----
</footer>

</body>
</html>

会社のページ

<div class="container">
-- the page html code
</div>

本社ページ

<meta name="menu" content="company" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style>
.error {
    color: red;
}
</style>
<script type="text/javascript">
    $(document).ready(function() {
        $('#name').focus();
    });
</script>

頭がもっと複​​雑な場合もあります。

結果のhtmlは問題ありません。しかし、単純であるべき何かのために 2 つの jps を定義するのは好きではありません。

私は何か間違ったことをしていますか?

これを行うより良い方法はありますか?

4

1 に答える 1

2

あなたが持っているものは正しいです。Sitemeshが使用するデコレーションパターンはこれに対処できますが、Tilesが使用するコンポジションは対処できません。しかし、それはそれほど心配ではないと思います。

構成は概念的に単純な戦略であり、リソースをあまり消費しません。タイルを学習しているのは良いことです。2つのシステムは排他的ではなく、補完的である可能性があります。

タイルとは、ページをタイルに分解することです。あなたが持っているものは、現在タイルが許す限り良いものです。あなたは頭の中にスクリプトが再発するのを見つけたので、それのタイルを作りました。提案していることを実行するほど最小限ではありませんが、すべてのサイト機能を単一のスクリプトファイルに入れると、ロードに短時間かかりますが、ロードした後は、キャッシュによるオーバーヘッドは発生しません。

セキュリティが問題である場合(つまり、アプリケーションにさまざまなセキュリティレベルがあり、高レベルのユーザーがJSを公開することでできることを提供したくない場合)、タイル属性でELを使用してどのタイルを定義することができます。これを行うには、タイルバージョン2.2.2を使用し、タイルリスナー "org.apache.tiles.extras.complete.CompleteAutoloadTilesListener"を使用します。これにより、タイル定義内でワイルドカード、EL、OGNL、およびMVELを使用できるようになります。以下に、wldcardが定義のサイズを大幅に削減する方法を示します。

2番目の定義「company.edit」には、複数の動詞を持つ複数の会社がある場合、代わりに次の定義を記述できます。

<definition name="*.*" extends="base">
  <put-attribute name="head" value="/WEB-INF/view/{1}/{2}Header.jsp"></put-attribute>
  <put-attribute name="body" value="/WEB-INF/view/{1}/{2}.jsp"></put-attribute>
</definition>

これで、editHeader、viewHeaderなどとともに、/ WEB-INF /view/の下に会社を次々と作成できます。

2.2.2にアップグレードして、「org.apache.tiles.extras.complete.CompleteAutoloadTilesListener」を使用する場合は、式を解釈する方法が複数あるため、次のように記述します。

<definition name="WILDCARD:*.*" extends="base">
  <put-attribute name="head" value="/WEB-INF/view/{1}/{2}Header.jsp"></put-attribute>
  <put-attribute name="body" value="/WEB-INF/view/{1}/{2}.jsp"></put-attribute>
</definition>

特定のセキュリティレベルのすべてのJSをタイルに配置することにした場合は、次のように言って適切なタイルを取得します。

<put-attribute name="head" value="/WEB-INF/view/{1}/OGNL:'session.securityLevel'+'.jsp'"></put-attribute>

OGNLはデフォルトのStruts2式言語です。この場合、適切なELまたはMVELを使用します。

于 2012-04-18T04:01:26.430 に答える