Ho un menu basato sui dati (memorizzato nella cache) ed è un componente globale. Voglio essere in grado di iniettare le voci del menu per ogni richiesta poiché ogni pagina lo userà. Qual è il posto migliore per metterlo? Sto usando l'annotazione basata su Spring3. La soluzione migliore che posso immaginare è l'utilizzo di OncePerRequestFilter e l'aggiunta di esso o la sottoclassificazione del controller, ma non sono sicuro di come farlo con l'annotazione @Controller.Quali sono le migliori pratiche in merito all'impostazione degli attributi del modello globale in Spring MVC?
risposta
posso pensare a due semplici opzioni:
Ogni classe @Controller
espone i dati come un metodo annotato con @ModelAttribute
, per esempio
@ModelAttribute
public MyData getMyData() {
...
}
Questo non è davvero bello se si hanno più controller, però. Inoltre, questo ha il fastidioso effetto collaterale della codifica dello myData
sull'URL per ogni reindirizzamento
Suggerisco invece di implementare uno HandlerInterceptor
e di esporre i dati ad ogni richiesta in questo modo. Non è possibile utilizzare alcuna annotazione-lovin, ma è meglio separato dalla logica aziendale in questo modo. Questo è simile alla tua idea OncePerRequestFilter
, ma a più Spring-y.
È possibile implementarlo come HandlerInterceptor
.
Consulta anche:
Ho appena trovato una risposta per la stessa domanda. Fa parte del mio post:
Hai solo bisogno di impostare il modello di esporre attributi variabili su false sul RedirectView.
Starting Spring 3.2, è possibile utilizzare @ControllerAdvice anziché utilizzare @ExceptionHandler, @InitBinder e @ModelAttribute in ciascun controller. Saranno applicati a tutti i bean @Controller.
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.context.request.WebRequest;
@ControllerAdvice
public class GlobalBindingInitializer {
@InitBinder
public void registerCustomEditors(WebDataBinder binder, WebRequest request) {
binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}
}
Se tu avessi iniziato con la Primavera Roo Codice generato, o limitare le annotazioni scanditi dal componente-scan utilizzando include-filtro, quindi aggiungere il filtro richiesto in webmvc-config.xml
<!-- The controllers are autodetected POJOs labeled with the @Controller annotation. -->
<context:component-scan base-package="com.sensei.encore.maininterface" use-default-filters="false">
<context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
<!-- ADD THE BELOW LINE -->
<context:include-filter expression="org.springframework.web.bind.annotation.ControllerAdvice" type="annotation"/>
</context:component-scan>
Potrebbe anche essere utile link su '@ ControllerAdvice' in' Spring 4': http://blog.codeleak.pl/2013/11/controlleradvice- miglioramenti-in-spring.html – Andremoniy
Se è necessario aggiungere alcune variabili globali che ogni vista può risolvere queste variabili, perché non definire in una proprietà o mappa? Quindi utilizzare la molla DI, fare riferimento al bean resolver di visualizzazione. è molto utile, come veriable statico, ad es. resUrl.
<property name="viewResolvers">
<list>
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="attributes" ref="env" />
<property name="exposeContextBeansAsAttributes" value="false" />
<property name="prefix" value="${webmvc.view.prefix}" />
<property name="suffix" value="${webmvc.view.suffix}" />
</bean>
</list>
</property>
- 1. Quali sono le migliori pratiche MEF?
- 2. Quali sono le migliori pratiche per l'interazione client-server?
- 3. Quali sono le migliori pratiche per la convalida degli indirizzi e-mail in Swift?
- 4. Quali sono le migliori pratiche per i depositi Kiln?
- 5. Quali sono le migliori pratiche di gestione della memoria Java?
- 6. Quali sono le migliori pratiche per velocizzare l'esecuzione dell'applicazione lucida?
- 7. CSS3 - Quali sono le migliori pratiche sulle prestazioni?
- 8. Quali sono le migliori pratiche per utilizzare AngularJS con Django
- 9. Le migliori pratiche per il modello DAO?
- 10. Quali sono le migliori pratiche per crittografare le password memorizzate in MySql usando PhP?
- 11. Quali sono le migliori pratiche per il rendering dei report di Excel in Java?
- 12. Quali sono le migliori pratiche sulla formattazione di sql in linea utilizzando ADO.NET in C#
- 13. MVC e le migliori pratiche di associazioni di cacao domanda
- 14. Le migliori pratiche per visualizzare le risorse nidificate in Rails?
- 15. Migliori pratiche del database
- 16. Quali sono le migliori pratiche di riutilizzo del codice tra diversi progetti Ruby?
- 17. Quali sono le migliori pratiche per mantenere uno schema di database Mysql in modo multipiattaforma?
- 18. Quali sono le migliori pratiche per l'I/O dei file in C?
- 19. Quali sono le migliori pratiche sulla gestione delle connessioni di database in .NET?
- 20. Quali sono le migliori pratiche di utilizzo di ngIncludere con la sintassi ControllerAs?
- 21. Quali sono le migliori pratiche per l'aggiunta dinamica di javascript in una pagina asp.net?
- 22. Quali sono le migliori pratiche per la conversione di tipo sicuro in C#?
- 23. Quali sono le migliori pratiche per l'archiviazione dei dati di sessione PHP in un database?
- 24. Quali sono le migliori pratiche per ridurre la dimensione delle librerie statiche in ogg-c?
- 25. Quali sono le migliori pratiche sulla comunicazione con le viste Contenitore
- 26. Quali sono le migliori pratiche per creare una classe di repository con il codice EF4 prima?
- 27. Design del modulo ExtJS (JavaScript) Migliori pratiche del modello
- 28. Le migliori pratiche per l'aggiornamento degli argomenti di un frammento?
- 29. Quali sono le applicazioni pratiche del collegamento debole?
- 30. Migliori pratiche e anti-pattern di Guice
+1 per menzionare l'effetto collaterale di ModelAttribute. Vorrei che qualcuno me lo avesse detto prima :(Grazie per la direzione: –