在我的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中
像这样的新块,在适当的位置更改名称:
// 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的答案为“是”,我应该在WebAppInitializer中更改哪些名称?
3)在我的控制器中,我如何确定我的请求应该去哪个调度程序servlet?我的控制器使用如下方法调用视图:
@RequestMapping(value="view_mapping")
public method() {
ModelAndView mav = new ModelAndView()
mav.setViewName("view_name");
return mav;
}
答案 0 :(得分:11)
您可以拥有任意数量的DispatcherServlets
。基本上你需要做的是复制配置并给servlet一个不同的名称(否则它将覆盖前一个),并为它提供一些单独的配置类(或xml文件)。
您的控制器不应该关心它们运行的DispatcherServlet
它们是否包含用于检测的代码(如果您添加另一个代码,另一个则需要继续修改控制器以修复它)。
然而,虽然通常可以有多个servlet,但是不需要多个servlet,您可以使用DispatcherServlet
的单个实例来处理它。
答案 1 :(得分:1)
如果您使用的是弹簧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";
}
}
答案 2 :(得分:0)
我们可能需要多个Dispatcher Servlet,就像我们可以拥有2个(或更多)具有2个(或更多)servlet名称的DispatcherServlet一样,因此D1和D2可以映射到不同的URL路径。例如:-
<!-- 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>
URL路径可以映射为:-
<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>