Wie bekommt man den Rahmen ohne request, session, etc?
Habe ich eine Methode in einer Klasse, die nicht alles, was könnte verwendbar sein, um die eigentliche servlet-Kontext. Praktisch, es ist wie
public String getSomething() { ... }
Aber um das Ergebnis zu berechnen, muss ich den eigentlichen thread-spezifische servlet-Strukturen.
Ich denke, irgendwo in der Tiefe in der Anwendung Kontext, einige wie ein thread-specific storage existieren sollte, was konnte erreicht werden durch Aufruf von statischen Methoden der system-Klasse.
Ich bin in einem tomcat6-servlet-container, aber der Frühling ist auch verfügbar, wenn es gebraucht wird.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine offensichtliche Lösung wäre, sich zu übergeben, der den Kontext als parameter, da bist du offensichtlich der code ausgeführt wird, wo der Zusammenhang wird in der Regel zur Verfügung.
Wenn aus irgendeinem Grund Sie glauben, dass dies ist nicht etwas, das man tun kann (würde ich gerne hören, der Grund für diese), eine andere Möglichkeit wäre, erstellen Sie ein servlet-filter, der würde dann erstellen Sie zum Beispiel eine
ThreadLocal<ServletContext>
.ThreadLocal
wirklich nötig sein? AFAIKServletContext
definiert ist nur einmal pro VMHinzufügen
ServletContextListener
zu Ihremweb.xml
. Diese werden aufgerufen, wenn Ihre webapp wird geladen. In dercontextInitialized()
Methode, die Sie speichern können, dieServletContext
in eine statische variable zum Beispiel für die spätere Verwendung. Dann werden Sie in der Lage sein, um Zugriff auf dieServletContext
in einer statischen Weise:Hinzufügen
web-xml
wie diese:Und Sie können es von überall aus zugreifen, wie diese:
Hinweis:
Möchten Sie vielleicht, um es zu speichern als
private
und bieten einegetter
Methode, und überprüfen Sie auch fürnull
Wert, bevor Sie Sie verwenden.Wenn Sie keine Zeiger auf etwas, das nützlich ist, ist die einzige Möglichkeit die ich kenne wäre ein statisches Attribut in eine Klasse, die enthält aktuelle ServletContext. Es ist trivial, mit einem
ServletContextListener
:Dann von überall aus verwenden Sie
Wenn Sie Frühjahr, Sie können auch die
RequestContextHolder
Zugriff auf die aktuelle Anfrage (von dort aus auf alles, was Sie brauchen)Natürlich, wenn auf diese Weise funktioniert in der servlet-Anwendung und nicht im portlet diejenigen, die - Sie verwenden würde PortletRequestAttributes und endlich bekommen PortletRequest
Können Sie autowire-servlet-Kontext, wie unten angegeben