java - 在 spring 应用程序中使用多个调度程序 servlet

标签 java spring spring-mvc

在我的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;
    }

}

我想将其他调度程序 servlet 添加到我的应用程序中。我的第一个想法是将以下代码添加到上面的类中:

在 WebAppInitializer.java 中

像这样的新 block ,在适当的地方更改名称:

// 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) 首先,我的方法是添加新的调度程序 servlet 的正确方法吗?

2) 其次,如果问题 1 的答案是"is",我应该在 WebAppInitializer 中更改哪些名称?

3) 在我的 Controller 中,我如何确定我的请求应该发送给哪个调度程序 servlet?我的 Controller 使用如下方法调用 View :

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

最佳答案

您可以拥有任意数量的 DispatcherServlets。基本上你需要做的是复制配置并给 servlet 一个不同的名称(否则它会覆盖以前的名称),并为其提供一些单独的配置类(或 xml 文件)。

您的 Controller 不应该关心它们在哪个 DispatcherServlet 中运行,您也不应该包含代码来检测它(如果您添加另一个,另一个您将需要不断修改您的 Controller 来修复它) .

然而,虽然您通常可以拥有多个 servlet,但并不需要多个 servlet,您可以使用 DispatcherServlet 的单个实例来处理它。

关于java - 在 spring 应用程序中使用多个调度程序 servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23049736/

相关文章:

java - 如何使用选项对话框显示随机文本并询问用户是否希望将文本保存到文件中

java - 使用 Mockito 进行泛型方法的 ClassCastException

java - 为什么我的 Android Studio 应用无法在 Android 设备上运行?

java - 如何执行 Spring LDAP 和 JPA 事务

java - Spring Boot JSP 错误 : NoClassDefFoundError

java - 为什么 AES 产生不同的结果,为什么 DES 不产生

Spring 调度程序不起作用

java - @CreatedBy 如何在 Spring Data JPA 中工作?

java - 我的 Spring MVC 配置有什么问题?

spring-mvc - LDAP - 上下文源的 AD 用户名密码配置