Lavorare con più dispatcher servlets in una primavera di applicazione

Nella mia applicazione spring, ho la seguente configurazione classi per la primavera ambiente:

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;
    }

}

Voglio aggiungere altri dispatcher servlet per la mia applicazione. La mia prima idea era culo il seguente codice per le classi di cui sopra:

In WebAppInitializer.java

Un nuovo blocco come questo, cambiando i nomi nel posto giusto:

//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("/");

E aggiungere una nuova classe come DispatcherConfig.java con il nome scelto nel codice sopra.

Le mie domande sono:

1) Prima di tutto, il mio approccio è il modo giusto per aggiungere un nuovo dispatcher servlet?

2) in Secondo luogo, se la risposta per la domanda 1 è ‘sì’, i cui nomi mi dovrebbe cambiare nel WebAppInitializer?

3) Nel mio controller(s), come ho sinalize per cui dispatcher servlet mia richiesta di andare? Il mio controller uso di metodi come la seguente per la chiamata di vista:

@RequestMapping(value="view_mapping")
public method() {
    ModelAndView mav = new ModelAndView()
    mav.setViewName("view_name");
    return mav;
}
  • E quasi sempre non dovrebbe avere più di servlet e, invece, dovrebbe aggiungere tutti i mapping di cui avete bisogno per una sola. Perché pensi di avere bisogno di più?

 

3 Replies
  1. 12

    Si può avere come molti DispatcherServlets come si desidera. Fondamentalmente ciò che dovete fare è duplicare la configurazione e dare la servlet un nome diverso (altrimenti andrà a sovrascrivere il precedente), e avere un po di configurazione separato classi (o file xml) per esso.

    Il tuo controller non cura in cui DispatcherServlet essi non eseguire né si deve includere il codice per rilevare che (che cosa succede se si aggiunge un altro, e un altro si avrebbe bisogno di tenere modificare il tuo controller di correzione).

    Tuttavia, mentre si può avere più servlets, in generale, non c’è molto bisogno per più di servlet e si può gestire con una singola istanza del DispatcherServlet.

  2. 1

    Se si utilizza primavera 3.2 o superiore si può andare con sotto il codice.

    Fare diverse di classe per tutte le dispacher servlet con l’override di getServletName() metodo, per evitare la stesso nome conflitti.

    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";
             }
        }
    • Non sono la radice config classi di comuni per tutti i dispatcher servlet? Cosa che di fatto implica nel tuo esempio?
    • per la creazione di web app di inizializzatori di ogni web app inizializzatore di classe deve implementare l’ WebApplicationInitializer interfaccia, piuttosto che estendere il AbstractAnnotationConfigDispatcherServletInitializer classe
  3. 0

    Possiamo avere di più Dispatcher Servlets, come possiamo avere 2(o più) DispatcherServlet con 2( o più) servlets nome.Così il D1 e D2 potrebbe mappa per diverso percorso URL.Esempio:-

    <!-- configured by WEB-INF/mac-servlet.xml -->
    <servlet>
        <servlet-name>mac</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <!-- configured by WEB-INF/windows-servlet.xml -->
    <servlet>
            <servlet-name>windows</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
    </servlet>

    Percorso URL potrebbe essere mappati come :-

    <servlet-mapping>
    <servlet-name>mac</servlet-name>
    <url-pattern>/mac/*</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>windows</servlet-name>
         <url-pattern>/windows/*</url-pattern>
    </servlet-mapping>

Lascia un commento