2012-04-11 26 views
1

私は自分のプロジェクトをspring-mvcとspring-webflowを使って開発しています。春のWebflowやAjaxに関する記事を読んだ後、私はApache Tilesを使ってビューをレンダリングする方が良いということを理解しました。SitemeshからApache Tilesへの移行

Sitemeshでは、私はtag call head()を使用しました。テンプレート内で使用されているタグは、結果として得られるHTML上でレンダリングされたページのhead属性全体をレンダリングすることを可能にします。

Apache Tilesでこれを実現する方法はありますか?

二JPS、ページの本体と1と頭の定義を持つ別:私の測定値から、私は次のことをしなければならないと推定します。ここでは、テンプレート、ページ、タイルの定義を理解しやすくするための例を示します。

タイル定義

<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はOKです。しかし、私は単純なもののために2つのJPSを定義するのは好きではありません。

私は何か間違っていますか?

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

答えて

2

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

構成は、概念的には単純な戦略であり、それはより少ない資源集約的です。 2つのシステムが排他的ではなく、無料であることができるタイルズを学んでいるのは良いことです。

タイルは、あなたのページをタイルに分解することです。あなたが持っているものは現在タイルが許す限り良いものです。あなたは頭の中にスクリプトがあり、それが再現していることを発見したので、そのタイルを作りました。あなたが提案していることを行うのと同じくらい最小限ではありませんが、サイトのすべての機能を1つのスクリプトファイルに入れておくと、読み込むのに少し時間がかかりますが、キャッシングによってオーバーヘッドは発生しません。

セキュリティが問題である場合(つまり、アプリケーションに異なるセキュリティレベルがあり、高レベルのユーザーが自分のJSを公開しても何のことも分からないようにしたい場合)、タイル属性にELこれを行うには、タイル2.2.2を使用し、タイルリスナー "org.apache.tiles.extras.complete.CompleteAutoloadTilesListener"を使用します。これにより、ワイルドカードEL、OGNL、およびMVELの使用を許可します。タイルdefintions。

あなたの2番目の定義「の会社:以下はwldcardsが大幅にあなたの定義のサイズを小さくする方法を示します。編集」あなたは複数の動詞で、複数の会社を持っているならば、あなたは代わりに以下の定義を書くことができます:

<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 /ビュー/の下に会社の後に会社を作成することができます。

あなたが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> 

もしあなたがすべてのことを決めることにしたらE JSは、タイルに特定のセキュリティレベルのためにあなたは、おそらく言って、適切なタイルを取得:

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

OGNLは、あなたのケースでは、適切なELやMVELを使用すると思い、デフォルトStruts2の表現言語です。

+0

ありがとう非常にありがとうございます。有用な情報。 –

関連する問題