Was ist der sauberste Weg, Spring Beans in einer JSP automatisch zu starten?

8

Wir fügen gerade einer alten Webanwendung, die nur JSP ohne ein Framework für die Front verwendet, einige neue Funktionen hinzu. Wir haben kürzlich Spring hinzugefügt, und wir möchten unsere Beans in unserer modifizierten JSP automatisch ansteuern, während wir nicht alles neu schreiben, um SpringMVC, Struts2 oder Tapestry5 zu verwenden.

Wir benutzen Autowiring nach Typ, daher führt das dazu, dass man in der JSP einen solchen Code bekommt, während man vorher den Webanwendungskontext (als "wap") erhält:

%Vor%

Wir möchten keinen solchen Code verwenden, sondern injizieren unsere Beans automatisch automatisch in unsere JSPs, wie wir es in einer Business-Bean mit @Autowired Annotation tun würden.

Tatsächlich suchen wir nach den saubersten Methoden, um unsere Bohnen in unsere JSPs zu injizieren. Was benutzt du?

    
temsa 26.01.2010, 11:48
quelle

4 Antworten

9

Sie können Spring ContextExposingHttpServletRequest :

  

HttpServletRequest Dekorator das   macht alle Frühlingsbohnen in einem gegebenen   WebApplicationContext zugänglich als   Attribute anfordern, durch faul   Überprüfen, sobald ein Attribut abgerufen wird   zugegriffen.

Dies würde erfordern, dass Ihr Controller-Code das ursprüngliche HttpServletRequest in einem ContextExposingHttpServletRequest einpackt und dann das an die JSP weiterleitet. Es kann entweder bestimmte benannte Beans oder jede Bean im Kontext anzeigen.

Natürlich verschiebt dies das Problem nur von Ihren JSPs zu Ihrem Controller-Code, aber das ist vielleicht ein besser handhabbares Problem.

    
skaffman 26.01.2010 11:54
quelle
7

Sie können @Autowired nicht direkt verwenden, da sowohl Ihre jsps als auch Servlets vom Servlet-Conainer instanziiert werden. Sie sind also nicht Teil des Frühlingskontexts und daher werden ihre Abhängigkeiten nicht injiziert.

Sie können:

  1. verschiebe den gesamten Code in reine Servlets statt in jsps - lasse nur die Präsentation in den jsps.
  2. Verwenden Sie @Configurable auf Ihren Servlets (und fügen Sie einen Java-Agent hinzu, wie in den verknüpften Dokumenten beschrieben)

Eine andere Möglichkeit besteht darin, den Servlet-Teil des aktuellen Kontextes manuell zu machen. Dies ist sowohl in jsps als auch in Servlets möglich:

%Vor%

Dadurch werden die mit @Autowired annotierten Abhängigkeiten aufgelöst.

Nun bin ich nicht sicher, ob Servlet-Container nur eine Instanz einer Servlet-Klasse benötigen. Wenn nicht, sollten Sie den obigen Code in eine Getter-Methode für die Abhängigkeit einfügen ( getDao() ) und wenn die @Autowired -Eigenschaft null ist (dh eine andere Instanz der Servlet-Klasse wird vom Container verwendet) - Führen Sie die obige Operation aus.

Denken Sie daran, ein Web-Framework (eines der aufgeführten) zu verwenden. Logik in jsps ist völlig falsch, schwer zu unterstützen, schwer zu lesen, etc.

    
Bozho 26.01.2010 12:34
quelle
5

Was ist mit überschreiben jspInit () -Methode und Hinzufügen von Autowiring-Unterstützung:

%Vor%     
Dmytro Plekhotkin 05.04.2013 15:23
quelle
4

Ich bezweifle, dass es eine saubere Möglichkeit gibt, Abhängigkeiten in eine JSP zu injizieren.

Ich denke, dass die saubere Lösung wäre, Ihren Code zu refaktorisieren, um die Geschäftslogik aus den JSPs zu entfernen, entweder mit SpringMVC oder einer der Alternativen, die Sie zitiert haben.

Beginnen Sie mit einem oder mehreren minimalistischen Controllern, die die Anforderung einfach an die JSPs mit den injizierten Beans als Attribute übergeben; @ Skaffmans Antwort gibt einen Weg, dies zu tun, oder Sie könnten es selektiver tun. Dann migrieren Sie schrittweise Code aus den JSPs und in die Controller.

    
Stephen C 26.01.2010 12:35
quelle

Tags und Links