Работа с несколькими сервлетами диспетчера в приложении 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";
}
}