Dynamischer Zugriff auf i18n.properties mit OGNL in Struts 2

In Struts 2 ist es, wie in jedem anderen guten MVC-Framework auch, sehr einfach moeglich Texte zu lokalisieren. Darunter versteht man in Fachkreisen das Auslagern von Texten aus den JSP-Seiten in Propertie-Dateien. Das bietet den Vorteil der Internationalisierbarkeit. Englische Texte koennen in der Datei “package_en.properties” abgelegt werden und deutsche Texte in der Datei “package_de.properties”. Je nachdem welches Locale in der HTTP-Session abgelegt ist greift das Framework entweder auf die deutsche Datei oder auf die englische Datei zu.
Eine Propertie-Datei besteht aus Schluesseln und Werten

firstname=Vorname
lastname=Nachnam

Der Zugriff auf die Texte ist in Struts 2 mit dem folgenden Tag moeglich.

<s:text name="firstname"/>

Der Tag wird, sofern der Schluessel “firstname” in einer Propertie-Datei gefunden wird, durch den Wert “Vorname” ersetzt. Wenn der Schluessel in keiner Propertie-Datei gefunden wird, gibt das Framework den Schluessel als Text aus. Also “firstname”.
Struts 2 benutzt OGNL (Object-Graph-Navigation-Language) um auf die Werte einer Action-Klasse aus einer JSP Seite zu zugreifen. Irgendwann bin ich auf die Idee gekommen mit dynamischen Werten auf die Propertie-Dateien zu zugreifen. Mein erster naiver Versuch sah wie folgt aus.

<s:text name="%{dayOfWeek}"/>

Das hat leider nicht funktioniert, die Seite konnte nicht gerendert werden. Nach einigem Forschen in der OGNL Docu bin ich auf die richtige Loesung gekommen.

<s:text name="%{#attr['dayOfWeek']}"/>

Das funktioniert natuerlich nur wenn der Wert auf dem Stack liegt und die entsprechende Action-Klasse einen Getter “getDayOfWeek()” bereitstellt.
In JSF ist so ein dynamischer Zugriff auf Propertie Dateien aus einer JSP oder XHTML-Seite heraus nicht moeglich. In einer JSF Applikation wuerde man in der ManagedBean auf die Propertie-Datei zugreifen und den Wert ueber eine Variable zur Verfuegung stellen. So das die JSP/XHTML-Seite ueber die Variable Zugriff erlangt.
Das Ergebniss waere das selbe. Jedoch finde ich die Loesung mit OGNL viel eleganter.

Sonderzeichenprobleme in Struts 2

Ich hatte in einer Struts 2 Applikation das Problem das Sonderzeichen, wie öäüÖÄÜß, in einem Texteingabefeld durch Fragezeichen ersetzt wurden. Nachdem das Formular abgeschickt wurde, kamen die Texte aus den Eingabefeldern zwar alle in der Action-Klasse an, jedoch waren alle Sonderzeichen durch Fragezeichen ersetzt.
Das Problem ist relative einfache zu beheben. Die JSP-Dateien sollten alle mit folgender Zeile beginnen:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

Desweiteren sollte in den Formularen das Attribut “acceptcharset” auf den Wert “utf-8” gesetzt werden.

<s:form action="submitForm" method="post" acceptcharset="utf-8">
.
.
.
</s:form>

Das hat bei mir das Problem behoben.