2012-04-11 20 views
1

Ich entwickle mein eigenes Projekt mit Spring-Mvc und Spring-Webflow. Nachdem ich einige Artikel über Spring Webflow und Ajax gelesen hatte, verstand ich die bessere Option ist die Verwendung von Apache Tiles zum Rendern der Ansicht.Migration von Sitemesh zu Apache Tiles

In Sitemesh habe ich einen Tag Call-Head() verwendet. Dieses Tag, das in der Vorlage verwendet wird, ermöglicht das Rendern des gesamten head-Attributs einer Seite, die auf dem resultierenden HTML gerendert wird.

Gibt es eine Möglichkeit, dies in Apache Tiles zu erreichen? Von meinen Lesungen nehme ich an, dass ich Folgendes tun muss:

Zwei JPS, eine mit dem Körper der Seite und eine andere mit der Kopfdefinition. Hier ist ein Beispiel mit der Vorlage, einer Seite und der Kacheldefinition zum besseren Verständnis.

die Fliesen Definition

<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> 

die Vorlage:

<%@ 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> 

eine Unternehmensseite

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

der Kopf Unternehmensseite

<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> 

manchmal der Kopf vielleicht komplexer.

Das resultierende HTML ist in Ordnung. Aber ich mag es nicht, zwei JPs für etwas zu definieren, das einfach sein sollte.

Ich mache etwas falsch?

Gibt es einen besseren Weg, dies zu tun?

Antwort

2

Was Sie haben, ist korrekt. Das Dekorationsmuster, das Sitemesh verwendet, kann dies ansprechen, während die Komposition, die Tiles verwendet, dies nicht kann. Ich würde jedoch nicht sagen, dass es eine große Sorge ist.

Zusammensetzung ist die konzeptionell einfachere Strategie und es ist weniger ressourcenintensiv. Es ist gut, dass Sie Fliesen lernen, die beiden Systeme sind nicht exklusiv und können kostenlos sein.

Bei Tiles geht es darum, Ihre Seiten in Kacheln zu zerlegen. Was Sie haben, ist so gut, wie Fliesen es derzeit erlaubt. Du hast herausgefunden, dass im Kopf ein Skript ist, das wieder auftritt und so eine Kachel daraus gemacht hat. Es ist zwar nicht so einfach wie das, was Sie vorschlagen, aber wenn Sie alle Site-Funktionen in eine einzige Skript-Datei einfügen, dauert das Laden sehr kurz, aber nach dem Cachen entfällt der Overhead.

Wenn Sicherheit ein Problem ist (dh Sie haben unterschiedliche Sicherheitsstufen in Ihrer Anwendung und möchten nicht verraten, was ein High-Level-Benutzer überhaupt kann, indem Sie ihre JS offen legen), könnten Sie die Kacheln-Attribute EL verwenden um zu definieren, welche Kacheln eingefügt werden sollen. Verwenden Sie dazu die Kacheln Version 2.2.2 und verwenden Sie den Kachel-Listener "org.apache.tiles.extras.complete.CompleteAutoloadTilesListener". Dies ermöglicht die Verwendung von Platzhaltern, EL, OGNL und MVEL die Fliesen Definitionen. Im Folgenden wird gezeigt, wie wldcards die Größe Ihrer Definitionen erheblich reduzieren kann:

Ihre zweite Definition "Firma.Bearbeiten“, wenn Sie mehrere Unternehmen haben, mit mehreren Verben dann die folgende Definition könnte man stattdessen schreiben:

<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> 

Jetzt können Sie einfach Unternehmen nach Unternehmen erstellen unter/WEB-INF/view/zusammen mit editHeader, viewHeader, etc .

Wenn Sie auf 2.2.2 aktualisieren und den „org.apache.tiles.extras.complete.CompleteAutoloadTilesListener“ wegen der vielen Möglichkeiten, die Ausdrücke zu interpretieren Sie schreiben müssen verwenden:

<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> 

Wenn Sie beschlossen haben, alles zu tun e JS für eine bestimmte Sicherheitsstufe in eine Kachel erhalten Sie die entsprechende Kachel von möglicherweise sagen:

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

OGNL die Standardsprache Struts2 Ausdrucks, in Ihrem Fall, dass Sie den entsprechenden EL oder MVEL verwenden würden.

+0

Danke sehr sehr. Nützliche Informationen. –