2012-11-13 5 views
5

Ich verwende Kacheln in Struts2 Anwendung. Beim Definieren des Basislayouts habe ich ein Attribut "scriptFile" definiert.Wie überprüft man das Vorhandensein von Kacheln Attribut vor dem Einfügen in die Seite

<definition name="baseLayout" template="/application/base-layout.jsp" > 
    ... 
</definition> 

<definition name="custom.tiles" extends="baseLayout"> 
    <put-attribute name="scriptFile" value="js/custom-script.js"></put-attribute> 
</definition> 

Wenn Entwickler „SKRIPT_DATEI“ in Kacheln Definitionsdatei bietet „tiles.xml“, sollte diese Skriptdatei folgende Zeile enthalten sein mit

<script language="javascript" src="<tiles:insertAttribute name="scriptFile"></tiles:insertAttribute>"></script> 

Aber wenn SKRIPT_DATEI Attribut nicht definiert ist, diese Zeile muss übersprungen werden.

Wie kann ich das Vorhandensein des Attributs "scriptFile" in Kacheln prüfen? Gibt es einen besseren Weg, dieses Ding zu machen?

+0

Welche Version von Kacheln verwenden Sie? Woher kommt das scriptFile-Attribut? Ist es etwas, das zur Laufzeit dynamisch ist?Wenn dies nur Kacheldefinitionen sind, sollten Sie mehrere "Kopf" -Templates erstellen und die entsprechende Kopfzeile einfügen. Wenn Sie einen Kopf verwenden, für den Sie eine Skriptdatei benötigen, müssen Sie eine Skriptdatei bereitstellen. Wenn eine struts2-Aktion eine ID erfordert, um ihre Aufgabe zu erledigen, können Sie nicht sehr gut eine ID senden und erwarten, dass sie funktioniert (dasselbe gilt für Kacheln). Wenn dies dynamischer Inhalt ist, gibt es andere Möglichkeiten. – Quaternion

+0

Version = Kacheln 2.0.6. Das Attribut stammt aus der Datei "tiles.xml" und ist nicht dynamisch. Layout besteht aus Seitenüberschrift, Menü, Inhalt und Fußzeile. Nur Inhalte werden für jede Seite geändert. Wenn der Inhalt JavaScript benötigt, stellt der Entwickler diese JS-Datei bereit und definiert sie in der Datei "tiles.xml". Diese Javascript-Datei wird dann in den Seitenkopf eingefügt. –

Antwort

0

Verwenden Sie einfach ignore Attribut

<script language="javascript" src="<tiles:insertAttribute name='scriptFile' ignore='true'/>"></script> 

und tun scriptFile nicht in Ihrer Definition setzen.

aktualisieren

Wie wäre es getAsString-Tag in das Layout verwenden, dann

<tiles:getAsString name="jscript" ignore="true" /> 

und in der Definition die ganze setzen entkam Script-Tag.

<put-attribute name="jscript" value="&lt;script src='js/custom-script.js' type='text/javascript'>&lt;/script>" /> 
+0

ignore Attribut überspringt einfach den Wert des Attributs, wenn es nicht vorhanden ist. In diesem Fall wird das umgebende Zeichen '. –

+0

Aktualisiert meine Antwort. –

+0

Es funktioniert vielleicht, aber ich denke, es ist keine gute Idee, komplette Tag als String jedes Mal bereitzustellen, anstatt nur den Dateinamen zu definieren. Wenn der Dateiname angegeben wird, sollte das umgebende Skript-Tag von der Vorlage platziert werden, um den Aufwand und die Fehlerwahrscheinlichkeit zu reduzieren. –

3

Ich versuchte

<t:useAttribute name="scriptFile" id="script" classname="java.util.List" ignore="true"/> 
<% 
    if(script != null) { 
     ... include script 
    } 
%> 

JSTL auch hier verwendet werden können.

+0

http://mail-archives.apache.org/mod_mbox/struts-user/200304.mbox/%[email protected]%3E –

1

Ich konnte ein ähnliches Problem lösen, indem Sie das defaultValue Attribut verwenden. Auf diese Weise erhalten Sie keine Ausnahme, wenn das Attribut nicht existiert. In diesem Fall, wenn die Seite brauchen keine zusätzlichen JavaScript enthalten dann die Vorlage Kacheln nur einen leeren String

JSP

<tiles:insertDefinition name="portalTemplate"> 

    <tiles:putAttribute name="body"> 
     <h1>Body</h1> 
    </tiles:putAttribute> 

    <tiles:putAttribute name="js"> 
     <script src="script.js"></script> 
    </tiles:putAttribute> 
</tiles:insertDefinition> 

Fliesen Vorlage JSP

<html> 
<body> 
    <tiles:insertAttribute name="body"/> 
    <script src="/public/libs/jquery/jquery-2.1.1.min.js"></script> 

    <!-- Include extra JS after JQuery --> 
    <tiles:insertAttribute name="js" defaultValue=""/> 
</body> 
</html> 
0
hinzufügen

Ich habe den folgenden Code verwendet, um dieses Problem zu lösen (nur nach den Informationen, die ich von Tags bekommen habe description: ignorieren - Wenn dieses Attribut auf True festgelegt ist, und das Attribut angegeben durch den Namen existiert nicht, einfach zurück, ohne etwas zu schreiben. Der Standardwert ist false, wodurch eine Laufzeitausnahmebedingung ausgelöst wird.):

<tiles:importAttribute name="stylesheets" ignore="${true}"/> 

P.S. Seien Sie vorsichtig, verwenden Sie $ {true} intead nur des "wahren" Wertes.

Verwandte Themen