2011-11-07 16 views
7

Tengo una serie de métodos de control repartidos en varias clases. Todos los métodos toman un objeto Model y todos mis métodos completan algunas propiedades compartidas en el modelo (controlan principalmente la barra de navegación). ¿Hay alguna manera de conectar un método 'base' en Spring? Quiero un método que pueda poblar mis propiedades compartidas y luego ir al método del controlador específico (o revertir para el caso). ¿Alguien sabe cómo hacer eso?Spring Framework MVC Base Controller Método

Respuesta

3

Suena como un HandlerIntercepto r podría ser un buen enfoque.

Es un poco AOP como - puede definir una clase que tiene un método PreHandle o PostHandle, y configurar las solicitudes en las que se ejecutará. En su caso, es probable que desee un PostHandle, ya que eso le dará acceso al ModelAndView, para que pueda completarlo con los elementos compartidos.

+0

Muchas gracias! – Nik

2

Hay varios puntos de extensión en la primavera y el Spring MVC se puede tomar:

  • HandlerInterceptor - una forma sencilla para interceptar cada método de control
  • Spring AOP - antes/después de consejos que cumplan todos los controladores
  • WebArgumentResolver - ¿quizás puede personalizar de algún modo los argumentos de resolución y procesarlos antes de llamar al controlador?
1

Si la lógica que está implementando es una preocupación transversal que generalmente no está acoplada a vistas particulares, sugiero usar un interceptor en lugar de crear jerarquías funcionales de controlador. Las jerarquías de controladores pueden dificultar el manejo en lo que respecta a elementos como mapeo de excepciones y administración/ciclo de vida de datos de sesión. Además, el nivel de vista es donde es más probable que necesite cambiar las cosas a lo largo del tiempo para cambiar las demandas de los clientes, por lo que una jerarquía funcional a prueba de futuro no va a suceder.

org.springframework.web.servlet.HandlerInterceptor tiene un método 'postHandle' que le da acceso a la solicitud, el controlador que manejó la solicitud y el ModelMap. Eso deberia ser todo lo que necesitas. Si necesita algún control del controlador, siempre puede agregar metadatos a él, indicando, por ejemplo, qué clase de encabezado usará (en el futuro, cuando tenga que cambiar eso, se trata de una cadena en un xml o anotación, . en lugar de cambiar de clase lo que se hereda de y todo lo que conlleva)

encenderlos como esto:

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