2

Ich benutze Spring MVC 4 und ich baue eine Website mit einer Vorlage, die mehrere gemeinsame Komponenten über Seiten erfordert, wie Login-Status, Warenkorbstatus, etc. Ein Beispiel für Controller-Funktion würde dies:Spring MVC Elternschablone Modellkomponente

@RequestMapping(path = {"/"}, method=RequestMethod.GET)  
    public ModelAndView index() { 
     ModelAndView mav = new ModelAndView("index"); 
     mav.addObject("listProducts", products); 
     mav.addObject("listCategories", menuCategoriasUtils.obtainCategories()); 
     return mav; 
    } 

Was wäre ein guter Weg/Muster, diese Elemente zu füttern, die an die Steuerung nicht gehören wir zur Zeit anrufen, so nicht wiederholt über und über unabhängige Operationen in jedem Verfahren von jeder Controller?

Danke!

Antwort

3

Es gibt verschiedene Ansätze, um allgemeine Daten in Ansichten anzuzeigen. Einer von ihnen verwendet @ModelAttributte Annotation.

Nehmen wir an, Sie haben eine Benutzeranmeldung, die auf jeder Seite angezeigt werden muss. Außerdem haben Sie einen Sicherheitsdienst, von dem Sie Sicherheitsinformationen über die aktuelle Anmeldung erhalten. Sie müssen eine Elternklasse für alle Controller erstellen, die allgemeine Informationen hinzufügen.

public class CommonController{ 

    @Autowired 
    private SecurityService securityService; 

    @ModelAttribute 
    public void addSecurityAttributes(Model model){ 
     User user = securityService.getCurrentUser(); 
     model.addAttribute("currentLogin", user.getLogin()); 

     //... add other attributes you need to show 
    } 

} 

Beachten Sie, dass Sie nicht brauchen, CommonController mit @Controller Anmerkung zu markieren. Weil Sie es nie direkt als Controller verwenden werden. Andere Controller haben von CommonController vererbt werden:

@Controller 
public class ProductController extends CommonController{ 

    //... controller methods 
} 

Jetzt sollten Sie nichts tun currentLogin hinzufügen Attribute zu modellieren. Es wird automatisch jedem Modell hinzugefügt. Und Sie können Benutzer-Login in Ansichten zugreifen:

... 
<body> 
    <span>Current login: ${currentLogin}</span> 
</body> 

Weitere Informationen zur Verwendung von @ModelAttribute Anmerkung Sie here in documentation finden.

+0

Sehr nützliche Antwort. Genau das, wonach ich gesucht habe. – santiageitorx

+0

Danke, das ist die Lösung, nach der ich gesucht habe. Andere Lösungen (meistens mit Interceptors) funktionieren nicht, das tut es. – mxmx