2011-11-07 20 views
7

Ho un numero di metodi di controller distribuiti su un numero di classi. Ogni metodo prende un oggetto Model e tutti i miei metodi popolano alcune proprietà condivise nel modello (controlla principalmente la barra di navigazione). C'è un modo per me di collegare un metodo "base" a Spring? Voglio un metodo che può popolare le mie proprietà condivise e poi andare nel metodo specifico del controller (o invertito per quella materia). Qualcuno sa come farlo?Spring Framework MVC Base Controller Method

risposta

3

Suoni come un HandlerIntercepto r potrebbe essere un buon approccio.

È un po 'come AOP: è possibile definire una classe che ha un metodo PreHandle o PostHandle e configurare quali richieste verranno eseguite. Nel tuo caso probabilmente vuoi un PostHandle, dato che ti darà accesso a ModelAndView, in modo da poterlo popolare con gli elementi condivisi.

+0

Grazie mille! – Nik

2

Ci sono diversi punti di estensione in primavera e Spring MVC si può prendere:

  • HandlerInterceptor - un modo semplice per intercettare ogni metodo del gestore
  • Spring AOP - prima/dopo consiglio corrispondenti tutti i controller
  • WebArgumentResolver - forse puoi in qualche modo personalizzare la risoluzione degli argomenti ed elaborarli prima di chiamare il controller?
1

Se la logica che si sta implementando è una preoccupazione trasversale che non è generalmente accoppiata a viste particolari, suggerirei di utilizzare un intercettore piuttosto che creare gerarchie funzionali di controller. Le gerarchie dei controller possono rendere difficile trattare quando si tratta di cose come la mappatura delle eccezioni e la gestione dei dati di sessione/ciclo di vita. Inoltre, il livello di visualizzazione è quello in cui è più probabile che sia necessario modificare le cose nel tempo per cambiare le richieste dei clienti, quindi una gerarchia funzionale a prova di futuro non accadrà.

org.springframework.web.servlet.HandlerInterceptor dispone di un metodo "postHandle" che consente di accedere alla richiesta, al controller che ha gestito la richiesta e alla ModelMap. Questo dovrebbe essere tutto ciò di cui hai bisogno. Se hai bisogno di un controllo dal controller, puoi sempre aggiungere metadati ad esso indicando, ad esempio, quale classe di intestazione usa (in futuro, quando devi cambiarla, è una stringa in un xml o annotazione, . invece di cambiare quale classe si eredita da e tutto ciò che comporta)

che vengono accesi in questo modo:

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