2010-07-20 4 views
4

Je suis nouveau à Spring MVC 3 et je comprends les concepts de base. Je suis capable de faire des choses simples comme créer des contrôleurs et des services et des vues. Cependant, je n'ai pas fait d'incursion dans un territoire plus avancé. Par conséquent, je m'excuse si cette question semble stupide (ou impossible).Intercepter la vue/réponse dans Spring MVC 3

Je me demande s'il existe un moyen d'intercepter la vue et/ou la réponse et de la modifier avant qu'elle ne soit envoyée au client? J'imagine que c'est ainsi que Spring effectue la liaison de données pour former des éléments sur le chemin du client. Ce que je voudrais faire est inspecter les annotations sur les éléments dans une classe de domaine et modifier la vue en fonction de ces annotations. Cela impliquera d'injecter du nouveau code (HTML ou Javascript) dans la réponse.

MISE À JOUR

Comme je l'ai pensé à cela un peu plus, je réalise que le rendu final est fait par le JSP. Donc, je suppose que la question est de savoir s'il existe un moyen d'intercepter le modèle avant qu'il ne se déplace vers la page et de comprendre les annotations sur le bean que les données sont liées.

Existe-t-il un moyen de le faire?

Répondre

7

La classe que vous cherchez probablement est org.springframework.web.servlet.HandlerInterceptor Vous pouvez mettre en œuvre la méthode postHandle sur cette interface et, comme la signature implique, ont accès à la fois la demande et la réponse, ainsi que la carte des objets de modèle que votre contrôleur a créé. (et le contrôleur lui-même, c'est ce que le paramètre Object handler est.)

Vous les 'activez' en les ajoutant au mappage du gestionnaire dans votre servlet Dispatcher.

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
     <list> 
      <bean class="a.package.MyHandlerInterceptor"/> 
     </list> 
    </property> 
</bean> 

Par ailleurs, la liaison est réellement fait à l'intérieur du HandlerAdapter qui localise les méthodes et les contrôleurs invoque, ce n'est pas un intercepteur.

Editer: Pour répondre à votre modification, oui c'est ici que vous avez une chance d'attraper l'objet modèle et de travailler dessus, après que le contrôleur soit terminé, mais avant qu'il ne passe au rendu JSP. Ainsi, vous pouvez faire quelque chose comme ajouter myCustomScript au ModelMap et lancer ${myCustomScript} dans le <head> de votre jsp, obtenir un objet support de la ModelMap et l'examiner, etc etc

+0

Merci! C'était ce que je cherchais. –

4

Oui, un certain nombre de façons réellement:

  • printemps mvc intercepteurs (recherche pour eux dans le mvc docs) - vous pouvez définir les méthodes preHandle/postHandle et appliquer l'intercepteur à un certain nombre de contrôleurs
  • spring aop - définir un aspect à exécuter avant/après les méthodes d'un contrôleur donné
  • Filtres de servlet - c'est l'option la moins souhaitable, car il n'est pas intégré au ressort - vous ne pouvez pas injecter de dépendances.