Struts2 bringt eine Vielzahl an vorgefertigten Tags mit, die einen Großteil der Anforderungen an eine Webanwendung abdecken. Im Folgenden soll etwas auf einige dieser Tags eingegangen werden.
Generell unterscheidet man bei Struts2 zwischen „generischen Tags“ und „Benutzerinterface Tags“ (UI Tags). Die generischen Tags sind z.B. für Datenverarbeitung und Kontrollfluss zuständig (z. B. Property- oder if- Tag) während die UI-Tags in aller Regel dem Benutzer Eingabemöglichkeit zur Verfügung stellen. Ein wichtiger Unterschied ist hier auch, dass UI-Tags mittels Themes und Templates modifiziert werde können.
Die Attribute der Tags werden teilweise automatisch als OGNL-Ausdruck ausgewertet, teilweise als String. Möchte man die Auswertung als Ausdruck erzwingen kann man den Wert in %{myValue} einschließen. Benutzt man %{} für Attribute, die sowieso einen OGNL Ausdruck erwarten und auswerten, so wird die Escape-Sequenz automatisch ignoriert. D.h. ist man sich nicht sicher, ob ein Attribut evaluiert wird, man möchte aber z.B. auf Action-Properties zugreifen, kann man ohne Probleme das Attribut in %{} einschließen.
Als Beispiel das if-Tag:
<s:if test="%{showItem1}"> <s:property name="%{item1}"> </s:if><s:elseif test="showItem2"> <s:property name="item2"> </s:elseif> |
Beide test-Attribute werden als OGNL-Ausdruck ausgewertet, bei dem ersten wird das %{} ignoriert.
Möchte man in einem Attribut, das Ausgewertet wird, allerdings nicht auf ein Objekt auf dem Stack setzen, sondern auf einen String, muss man ihn explizit mit Anführungszeichen als String deklarieren.
Dies kann z.B. bei der Benutzung des URL-Tags sinnvoll sein:
Möchte man einen Link auf eine andere Action erstellen, bietet sich hierfür die Benutzung des URL-Tags an. Möchte man z.B. auf eine Action in dem selben Namespace verweisen, so ist es nicht nötig diesen Anzugeben und es reicht, den Namen einer Action zu benennen. Außerdem sorgt der URL-Tag automatisch dafür, dass – sofern gewünscht - auf ältere Parameter mit übergeben werden.
<s:url action="nextAction" includeParams="get"> <s:param name="param1" value="object1"/> <s:param name="param2" value="%{'hello'}"/> <s:param name="param3">world</s:param> </s:url> |
Im obigen Beispiel wird param1 als Objekt interpretiert und getObject1() aufgerufen, die beiden anderen Parameter werden mit Strings belegt.
Möchte man HTML-Tags und Struts2-Tags miteinander verschachteln, so muss man die richtige Verwendung der einfachen und doppelten Anführungszeichen beachten, um nicht aus Versehen das Attribut des übergeordneten Tags zu früh zu schließen:
Falsch:
<a href="<s:url action="nextAction" includeParams="get"/>">next</a> |
Richtig:
<a href="<s:url action='nextAction' includeParams='get'/>">next</a> |
Spätestens bei URLs mit Parametern wie oben, verbietet es sich aus Gründen der Lesbarkeit, den URL-Tag in dem A-Tag direkt zu schreiben. Um dies zu vermeiden, gibt es zum Beispiel die Möglichkeit die URL mittels das id-Attributs (ab Struts 2.1 var-Attribut) an einen Alias zu binden. Diese kann dann mittels Property-Tag aufgerufen werden.
<s:url id= "nextURL" action="nextAction" includeParams="get"> <s:param name="param1" value="object1"/> <s:param name="param2" value="%{'hello'}"/> <s:param name="param3">world</s:param> </s:url> <a href="<s:property name='nextURL'/>">next</a> |
Zu beachten bei der Verwendung der einfachen Anführungszeichen ist, dass einzelne Zeichen in einfachen Anführungszeichen als Character gelten und nicht als String. Beispiel:
private letter = "A"; public String getLetter(){ return letter; } |
<s:if test="letter.equals('A')"> A wie Anton </s:if> |
Dies funktioniert nicht. Möglich wären:
<s:if test='letter.equals("A")'> A wie Anton </s:if> |
oder
<s:if test="letter.equals(\"A\")"> A wie Anton </s:if> |