Работа с несколькими сервлетами диспетчера в приложении spring

в моем приложении spring у меня есть следующие классы конфигурации для среды spring:

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

}

Я хочу добавить сервлет диспетчера других в мое приложение. Моя первая идея заключалась в следующем коде для классов выше:

In WebAppInitializer.java

новый блок, как это, изменяя имена в соответствующих местах:

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

и добавьте новый класс, такой как DispatcherConfig.java, с именем, выбранным в коде выше.

мои вопросы:

1) Прежде всего, мой подход-это правильный способ добавить новый сервлет диспетчера?

2) Во-вторых, если ответ на вопрос 1 "Да", какие имена я должен изменить в WebAppInitializer?

3) В моем контроллере(контроллерах), как я синализирую, для какого диспетчерского сервлета должна идти моя заявка? Мои контроллеры используют следующие методы для вызова представления:

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

2 ответов


вы можете иметь столько DispatcherServlets Как вы хотите. В основном вам нужно дублировать конфигурацию и дать сервлету другое имя (иначе он перезапишет предыдущий) и иметь для него отдельные классы конфигурации (или xml-файлы).

ваши контроллеры не должны заботиться о том, в котором DispatcherServlet они не запускаются, если вы не включаете код для обнаружения этого (что, если вы добавите другой, а другой вам нужно будет продолжать изменять ваши контроллеры, чтобы исправить что.)

однако, хотя вы можете иметь несколько сервлетов в целом, нет необходимости в нескольких сервлетах, и вы можете обрабатывать его с помощью одного экземпляра DispatcherServlet.


Если вы используете весну 3.2 или выше, вы можете пойти с кодом ниже.

создать другой класс для всех dispacher servlet с переопределением getServletName() метод, чтобы избежать конфликтов с тем же именем.

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