Nous ajoutons actuellement de nouvelles fonctionnalités à une ancienne WebApp qui utilisait uniquement JSP sans aucun cadre pour le front. Nous avons ajouté le printemps récemment, et nous aimerions changer nos haricots dans notre JSP modifié, tout en ne réécrivant pas tout pour utiliser SpringMVC, Struts2 ou Tapestry5.
Nous utilisons la mise en forme d'automobile par type, de sorte que cela conduit à obtenir du code comme Ceci dans le JSP, tout en obtenant auparavant le contexte de l'application Web (en tant que "WAP"): P>
MyDao myDao = (MyDao) wap.getBeansOfType(MyDao.class).values().toArray()[0];
5 Réponses :
Vous pouvez utiliser le ressort ContextexposinghtttttServletQuest : P>
décorateur httpservletQuest qui fait tous les haricots de printemps dans une donnée WebapplicationContext accessible comme Demander des attributs, via paresseux Vérification une fois qu'un attribut obtient accessible. p> blockQuote>
Cela nécessiterait que votre code de contrôleur envelopperait l'original
httpservletQuest code> dans un
contextexposinghttttptservlerequest code>, puis transmetteur que em> à la JSP. Il peut soit exposer des haricots nommés spécifiques, soit chaque haricot dans le contexte. P>
Bien sûr, cela passe simplement le problème de votre code JSP à votre code de contrôleur, mais c'est peut-être un problème plus gérable. P>
Selon vous, que pensez-vous de la modifier dans un filtre (plutôt qu'un servlet) sur les JSP qui obtiennent tous les haricots du contexte de printemps et les mettent dans la portée de la demande, nommée par l'interface attendue afin d'avoir une SIMILI GETBYTYPE?
(+1) Belle capture avec le wrapper de la demande. Néanmoins, @autowired code> ne sera pas utilisable de cette façon?
@Bozho: Non, non, mais les haricots peuvent simplement être mentionnés dans le JSP, sans aucun câblage explicite pour cela.
Nous pouvons probablement utiliser statique. springsource.org/spring/docs/2.5.x/api/org/... comme base pour le filtre
Vous ne pouvez pas utiliser Vous pouvez: P> Autre moyen est de rendre la partie de servlet du contexte actuel manuellement. Cela est possible dans les JSP et les servlets: p> Ceci résoudra le maintenant, je Je ne sais pas si les conteneurs de servlet sont nécessaires pour utiliser une seule em> d'une classe de servlet. Sinon, vous feriez mieux de placer le code ci-dessus dans une méthode getter pour la dépendance ( que tout a été dit, vraiment em> envisagez d'utiliser un web Cadre (n'importe lequel de ceux que vous avez énumérés). Avoir la logique en JSPS est complètement fausse, difficile à soutenir, difficile à lire, etc. p> p> @Autowired code> directement car vos JSP et vos servlets sont instanciés par le Conservation Servlet. Donc, ils ne font pas partie du contexte de printemps et, partant, leurs dépendances ne sont pas injectées.
@configurable code> a> sur vos servlets (et ajouter un javaagent, comme décrit dans les docs liés) li>
ol>
@autowired code> dépendances annotées. P>
getdao () code>) et si la propriété
@autowired code> est
null < / code> (c'est-à-dire une autre instance de la classe de servlet est utilisé par le conteneur) - Effectuer l'opération ci-dessus. P>
Je sais définitivement, mais vous ne pouvez pas réécrire un logiciel entier en 5 jours (y compris la scission de la logique frontale et des entreprises), tout en ajoutant de nouvelles fonctionnalités. En fait, nous devrions éviter d'utiliser la DAO là-bas et écrivez, puis s'appuyer uniquement sur l'objet Business, mais il s'agit simplement d'un code déjà écrit que je ne peux pas réécrire dans une telle fois. Convaincre les gestionnaires de convertir l'application en printemps / hibernate / JPA au lieu de singletons fabriqués à la maison et les outils Orm de la société ont déjà été une bonne douleur. Ils ne voient que cela comme un coût ...
Je doute qu'il existe un moyen propre d'injecter des dépendances dans un JSP. P>
Je pense que la solution propre serait de commencer à refactoriser votre code pour obtenir la logique commerciale de la JSPS, à l'aide de SpringMVC ou d'une des alternatives que vous avez citées. p>
Commencez par un ou plusieurs contrôleurs minimalistes qui passent simplement la demande à la JSPS avec les haricots injectés en tant qu'attributs; La réponse de Skaffman donne une façon de le faire, ou vous pourriez le faire plus de manière sélective. Puis migrer progressivement le code hors des JSP et dans les contrôleurs. P>
Qu'en est-il de la méthode de remplacement de JSPINIT () et de l'ajout de la prise en charge de la mise en autobine:
<%@ page import="com.example.ExampleService"%> <%@ page import="org.springframework.beans.factory.annotation.Value"%> <%@ page import="org.springframework.beans.factory.annotation.Autowired"%> <%@ page import="org.springframework.web.context.support.SpringBeanAutowiringSupport"%> <%! public void jspInit() { SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, getServletContext()); } @Value("${example.property}") private String someField; @Autowired private ExampleService exampleService; %> <% final Object data = exampleService.getSomething(someField); %>
Ce n'est pas autonome, mais le printemps peut exposer vos noms de haricots dans le contexte de la demande, il vous suffit de la configurer dans la vue Viewresolver.
de: https://raibledesigns.com/rd/entry/spring_mvc_jstlview_and_exposecontexteansaTtributs p>
La bonne chose à propos de SpringMVC est que vous n'avez pas à avaler toute la pilule. Vous pouvez choisir les parties du printemps que vous souhaitez utiliser. Il serait probablement plus propre de faire ce que Stephen C indiquait et de commencer à refactoring.