8
votes

Quel est le moyen le plus propre aux haricots de printemps automatique dans un JSP?

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];


1 commentaires

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.


5 Réponses :


9
votes

Vous pouvez utiliser le ressort ContextexposinghtttttServletQuest :

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.

Cela nécessiterait que votre code de contrôleur envelopperait l'original httpservletQuest dans un contextexposinghttttptservlerequest , puis transmetteur que à la JSP. Il peut soit exposer des haricots nommés spécifiques, soit chaque haricot dans le contexte.

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.


4 commentaires

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 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



7
votes

1 commentaires

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 ...



4
votes

Je doute qu'il existe un moyen propre d'injecter des dépendances dans un JSP.

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.

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.


0 commentaires

6
votes

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); %>


0 commentaires