# <fmt:message> außerhalb von JSP



## shadow (28. Aug 2007)

Hallo,

ich versuche mich jetzt schon seit einer halben Ewigkeit an einem Problem, das sicher ganz einfach zu lösen ist. Ich komm nur einfach nicht drauf:

In meinen JSP-Seiten benutze ich <fmt:message> für die Internationalisierung. Meine Anwendung hat aber auch ein paar Servlets, in denen ich auch Internationalisierung benötige. Nun fände ich es äußerst schick, wenn ich hier auf die selben Ressourcen zurück greifen könnte. Aus diesem Grund hab ich mal hinter die Kulissen von <fmt:message> geschaut, ist ja alles Open Source  :wink:  ...

Ergebnis: Man benötigt ein "LocalizationContext"-Objekt. Leider weiß ich nicht, wo ich das herbekommen soll... Wenn man noch tiefer im Source gräbt, sieht man: Man könnte man sich so ein "LocalizationContext"-Objekt besorgen, wenn man ein "PageContext"-Objekt hätte. Hat man aber nicht, da man nicht in einer JSP ist, sondern "nur" in einem Servlet. Ich dachte jetzt schon daran, das "PageContext"-Objekt irgendwo zwischen zu speichern, evtl. in der Session. Aber so ein Gebastel mach ich eigentlich immer ungern. Es müsste eine elegantere Lösung geben.

Idee?


Danke!
Stefan.


----------



## Kim Stebel (28. Aug 2007)

Probier's mal mit

```
PageContext pc = JspFactory.getDefaultFactory().getPageContext(this, req, resp, null, true, 4096, true);
```

Hab ich aber nicht getestet und wird normalerweise nur von JSPs aufgerufen.


----------



## shadow (28. Aug 2007)

Hey! So funktioniert es.
Ich hatte es auch schon so probiert, leider offensichtlich nicht ganz richtig, und zwar statt 4096 hab ich PageContext.DEFAULT_BUFFER genommen. Da kam aber statt einem PageContext-Objekt "null" zurück. Wie bist du auf die Zahl gekommen, Schuss ins Blaue?

Dann noch eine Frage: Ist das jetzt elegant? Einen PageContext zu erzeugen, obwohl "eigentlich" gar keine Page da ist? Bin da immer etwas eigen... ich sollte mich freuen, dass es so klappt 

Danke!


----------



## Kim Stebel (28. Aug 2007)

Das war wirklich nur ein Schuss ins blaue...4kb ist ja nicht so unüblich als Puffergröße. 
Elegant? Naja kommt drauf an wie groß deine Anwendung ist und ob du sie später leicht warten können willst. Ab einer bestimmten Größe würde ich eine MVC-Architektur verwenden und alle Views als JSPs realisieren.


----------



## shadow (29. Aug 2007)

Es ist bereits eine MVC-Anwendung und alle Views sind als JSP realisiert. An einer Stelle will ich jedoch im Controller beispielsweise eine E-Mail verschicken oder eine Text-Datei erzeugen etc...  E-Mail und Text-Datei sollen natürlich in der jeweiligen Sprache sein, doch da stellte sich dann das Problem von oben...

Gibts vielleicht generell noch einen anderen Lösungs-Ansatz?


----------



## Rydl (30. Aug 2007)

du willst auf .properties innerhalb einer java-klasse zugreifen? nichts leichter als das, wenn du ResourceBundles benutzt.
(http://java.sun.com/javase/6/docs/api/java/util/ResourceBundle.html) dafür benötigst du nur die richtige Locale information -> http://java.sun.com/javase/6/docs/api/java/util/Locale.html und das bekommst du aus dem request mit getLocale() wenn ich mich nicht irre!

hab jetzt nur quer gelesen, aber ich glaub das könnte dir helfen...


----------



## fehlerfinder (4. Sep 2007)

shadow hat gesagt.:
			
		

> statt 4096 hab ich PageContext.DEFAULT_BUFFER genommen. Da kam aber statt einem PageContext-Objekt "null" zurück


Bist du sicher, dass du PageContext.DEFAULT_BUFFER verwendet hast? Wenn du - wie gemeinhin leider üblich javax.servlet.jsp.* importiert und dann ein DEFAULT_BUFFER referenziert hast, kommt das aus javax.servlet.jsp.JspWriter (nicht javax.servlet.jsp.PageContext) und kennzeichnet dort einfach nur, ob ein default buffer verwendet werden soll, nicht aber dessen Größe.

Links:
1. http://java.sun.com/javaee/5/docs/api/javax/servlet/jsp/JspWriter.html#DEFAULT_BUFFER
2. http://java.sun.com/javaee/5/docs/a...ml#javax.servlet.jsp.JspWriter.DEFAULT_BUFFER

Dein Puffer hatte also die Größe '-1' - da passt halt nicht so arg viel rein ;-)


----------



## shadow (8. Sep 2007)

@rydl:

Dass das so geht wusste ich. Mein Vorhaben zielte allerdings darauf ab, genau die gleiche Logik zum ermitteln der Locale zu verwenden, wie <fmt:message/> aus der JSTL. Diese Taglib lässt nämlich noch bestimmte Konfigurationen zu, die ich dann nicht mitbekommen würde, wenn ich die properties komplett selbst lese...

@fehlerfinder:

Danke für das Raussuchen der Links. Tatsächlich habe ich habe JspWriter.DEFAULT_BUFFER verwendet. In PageContext finde ich nämlich gar kein DEFAULT_BUFFER. Ich bin nach folgendem Code gegangen:

http://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/jsp/PageContext.html

Jetzt bin ich durcheinander....


----------

