# Wert hinter JSP-Tag nach Java-String in Skriptlet



## ruutaiokwu (10. Mrz 2009)

hallo zusammen,

bin gerade an einer jsp-page von einer webapplikation, welche unter struts läuft. nun wird mit dem tag


```
<html:errors property="text">
```

eine fehlermeldung ausgegeben, wenn ein bestimmtes textfeld nicht ausgefüllt wird. das problem ist, dass dort zeichen, welche entitäten erfordern (z.b. umlaute), "original" sind - dies geht aber nicht, da die page nicht utf-8-codiert wird.

alle (fehler)meldungen sind in einer resourcendatei gespeichert. und dort will ich AUF KEINEN FALL irgendwelche html-entities haben. (z.b. fehlermeldung à la "Sie m&uuml;ssen das Feld xy ausfüllen.")

meine frage: wie wandle ich dieses tag, welches im browser KEIN element ist, sondern nur einen wert, in einen "normalen" String um, damit ich diesem in einem skriptlet in einen konformen, entitätsbehafteten wert konvertieren kann?

ich stelle mir das sinngemäss so vor:


```
String lInputString = <html:errors property="text">;        // Wird wohl kaum stimmen...!

<%

HTMLEntities lHTMLEntities = new HTMLEntities();
String lOutputString = lHTMLEntities.htmlentities(lInputString);
out.println(lOutputString);

%>
```

besten dank in voraus!


grüsse,
jan


----------



## HLX (11. Mrz 2009)

jmar83 hat gesagt.:


> ```
> String lInputString = <html:errors property="text">;        // Wird wohl kaum stimmen...!
> 
> <%
> ...


Nein, das geht wirklich nicht. Mir fallen auf Anhieb erstmal 2 Möglichkeiten ein:

1. Du überschreibst das ErrorsTag mit einem eigenen benutzerdefinierten Tag. Hier müsstest du leider die komplette doStartTag()-Methode überschreiben, d.h. sie vollständig reimplementieren und die von dir oben beschriebene Konverertierung an geeigneter Stelle einbauen. Leider ist die Methode groß und delegiert nur an Singletons, so dass hierbei tatsächlich nur eine reimplementierung der Methode möglich ist.

2. Du überschreibst die Klasse 'ActionMessage' mit einer eigenen Message-Klasse. Hier fügst du die Konvertierung in die Methode 'getValues()' ein. Das ist m.E. die einfachste Variante. Sähe in etwa so aus:

```
public class ConvertableMessage extends ActionMessage {

    @override
    public Object[] getValues() {
          if(this.values != null) {
                Object[] result = new Object[values.length];
                for(int i = 0; i < values.length; i++) {
                    Object converted = lHTMLEntities.htmlentities(values[i]);
                    result[i] = converted;
                }
                return result;
           }
           return null;
     }
}
```


----------



## ruutaiokwu (11. Mrz 2009)

hallo HLX,

besten dank für deine antwort - doch leider funktioniert der unter punkt 2 beschriebene weg nicht.

die funktion getValues() der Klasse ActionMessage beinhaltet nicht die werte, welche im MessageResources.properties-file sind. vielmehr ist diese funktion für irgendwelche platzhalter (?) gedacht.

wenn ich die Klasse überschreibe, kann ich gerade so gut die getValues()-funktion folgendermassen gestalten:

[HIGHLIGHT="Java"]public Object[] getValues()
{
      return null;
}[/HIGHLIGHT]

...und alles funktioniert noch immer gleich wie vorher!


das wäre fast zu schön gewesen, so einfach :-(

vorschlag 1 werde ich auch noch ausprobieren!


gruss, jan


----------



## HLX (11. Mrz 2009)

Stimmt, mein Fehler. Die ActionMessages werden anhand des Schlüssels aus dem Resource-Bundle bezogen. Die values haben nur eine untergeordnete Bedeutung. Damit ist das Überschreiben der ActionMessages doch komplizierter als ich angenommen habe. Dann bleibt leider nur Weg 1 übrig - der sollte allerdings funktionieren.


----------



## ruutaiokwu (11. Mrz 2009)

...so, jetzt habe ich ne eigene tag-library erstellt, und zwar habe ich den "errors"-tag-eintrag aus der datei "struts-html" dorthin kopiert und angepasst. (z.b. tag-class etc.)

die tag-class für mein neues errors-tag heisst dann "MyErrorsTag" (extends ErrorsTag...)

bei allen funktionen, ausser doStartTag() rufe ich einfach die entsprechende funktion der superklasse ErrorsTag auf. (wie gehabt)

der inhalt der doStartTag()-funktion habe ich vom original kopiert & angepasst:

überall wo der string message zugewiesen wird von

message = xyz;   // Was auch immer

nach

message = HTMLEntities.htmlentities(xzy);


klappt soweit gut, super sache. besten dank!


grüsse,
jan


----------

