2014-04-13 6 views
5

W mojej aplikacji wiosny, mam następujące klasy konfiguracyjne dla środowiska wiosny:Praca z wieloma dyspozytorski serwletów w aplikacji wiosny

WebAppInitializer.java

@Order(value=1) 
public class WebAppInitializer implements WebApplicationInitializer { 

    @SuppressWarnings("resource") 
    @Override 
    public void onStartup(ServletContext container) { 
     // Create the 'root' Spring application context 
     AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); 
     rootContext.register(WebAppConfig.class); 

     // Manage the lifecycle of the root application context 
     //container.addListener(new ContextLoaderListener(rootContext)); 

     // Create the dispatcher servlet's Spring application context 
     AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext(); 
     dispatcherContext.register(DispatcherConfig.class); 

     // Register and map the dispatcher servlet 
     ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext)); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/"); 
    } 

} 

WebAppConfig.java

@EnableWebMvc 
@EnableTransactionManagement(mode=AdviceMode.PROXY, proxyTargetClass=true) 
@ComponentScan(value="spring.webapp.lojavirtual") 
@Configuration 
public class WebAppConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/bootstrap/**").addResourceLocations("/bootstrap/").setCachePeriod(31556926); 
     registry.addResourceHandler("/extras/**").addResourceLocations("/extras/").setCachePeriod(31556926); 
     registry.addResourceHandler("/jquery/**").addResourceLocations("/jquery/").setCachePeriod(31556926); 
    } 

    @Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

} 

DispatcherConfig.java

@Controller 
@Import(WebAppConfig.class) 
public class DispatcherConfig { 

    @Bean 
    public ViewResolver jspResolver() { 
     InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
     viewResolver.setPrefix("/WEB-INF/jsp/"); 
     viewResolver.setSuffix(".jsp"); 
     return viewResolver; 
    } 

} 

Chcę dodać inne dyspozytora serwletu do mojego wniosku. Mój pierwszy pomysł był osioł następujący kod do klas wyżej:

W WebAppInitializer.java

nowy blok w ten sposób, zmiana nazwy w odpowiednich miejscach:

// Create the dispatcher servlet's Spring application context 
     AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext(); 
     dispatcherContext.register(DispatcherConfig.class); 

     // Register and map the dispatcher servlet 
     ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext)); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/"); 

i dodaj nowa klasa, taka jak DispatcherConfig.java, z nazwą wybraną w powyższym kodzie.

Moje pytania są następujące:

1) Przede wszystkim, moje podejście jest właściwym sposobem na dodanie nowego dyspozytora serwletu?

2) Po drugie, jeśli odpowiedź na pytanie 1 brzmi "tak", jakie nazwy powinienem zmienić w WebAppInitializer?

3) W moim kontrolerze (ach), w jaki sposób mogę zaaplikować, dla którego serwletu dyspozytora moje zamówienie powinno zostać wysłane? Moi kontrolerzy stosowanie metod jak na poniższym dla wywołania widoku:

@RequestMapping(value="view_mapping") 
public method() { 
    ModelAndView mav = new ModelAndView() 
    mav.setViewName("view_name"); 
    return mav; 
} 
+0

Prawie zawsze nie powinieneś mieć wielu serwletów, a zamiast tego musisz dodać wszystkie mapowania do jednej. Dlaczego uważasz, że potrzebujesz więcej? – chrylis

Odpowiedz

9

Możesz mieć tyle DispatcherServlets jak chcesz. Zasadniczo musisz zduplikować konfigurację i nadać serwletowi inną nazwę (inaczej nadpisze poprzednią) i mieć dla niej oddzielne klasy konfiguracji (lub pliki xml).

Twoje kontrolery nie powinny się przejmować tym, które DispatcherServlet nie będą działały, jeśli nie podasz kodu, który to wykryje (a co jeśli dodasz inny, a drugi będziesz musiał modyfikować kontrolery, aby to naprawić).

Mimo że można generalnie mieć wiele serwletów, nie ma zbyt wielu potrzebnych serwletów i można sobie z nimi poradzić z pojedynczą instancją modelu DispatcherServlet.

+0

proszę, czy możesz mi powiedzieć, co jest zaletą korzystania z wielu serwerów dispatcherServlets? –

+0

Nie w komentarzu ... Zadaj pytanie do tego ... –

+0

w porządku. Właściwie, ludzie zgłaszają się tutaj w przypadku tego rodzaju pytań. Nadal będę próbować. –

1

Jeśli używasz sprężyny 3.2 lub nowszej, możesz użyć poniższego kodu.

Utwórz inną klasę dla wszystkich dispacher servlet z nadpisującą metodą getServletName(), aby uniknąć konfliktów o tej samej nazwie.

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

     @Override 
     protected Class<?>[] getRootConfigClasses() { 
      // TODO Auto-generated method stub 
      return new Class<?>[] { RootConfig.class }; 
     } 

     @Override 
     protected Class<?>[] getServletConfigClasses() { 
      // TODO Auto-generated method stub 
      return new Class<?>[] { WebConfig.class }; 
     } 

     @Override 
     protected String[] getServletMappings() { 
      // TODO Auto-generated method stub 
      return new String[] { "/config1/*" }; 
     } 
    } 




public class WebAppInitializer2 extends AbstractAnnotationConfigDispatcherServletInitializer { 


     @Override 
     protected Class<?>[] getRootConfigClasses() { 
      // TODO Auto-generated method stub 
      return new Class<?>[] { RootConfig.class }; 
     } 

     @Override 
     protected Class<?>[] getServletConfigClasses() { 
      // TODO Auto-generated method stub 
      return new Class<?>[] { WebConfig2.class }; 
     } 

     @Override 
     protected String[] getServletMappings() { 
      // TODO Auto-generated method stub 
      return new String[] { "/config2/*" }; 
     } 

      @Override 
      protected String getServletName() { 
       // TODO Auto-generated method stub 
      return "config2"; 
     } 
    } 
+3

Czyż wspólne klasy konfiguracyjne nie są wspólne dla wszystkich serwletów dyspozytorskich? Co ten fakt implikuje w twoim przykładzie? – croraf

+0

do tworzenia kilku inicjalizatorów aplikacji WWW, każda inicjalizator aplikacji WWW powinien implementować interfejs 'WebApplicationInitializer' zamiast rozszerzać klasę' AbstractAnnotationConfigDispatcherServletInitializer' – jcflorezr