我已经“暂时”创建了一个简单而基本的spring Web应用程序。我习惯将部署描述符作为简单的web.xml文件,然后将应用程序上下文作为xml文件。
不过,现在我想尝试仅使用Java文件创建整个Spring Web应用程序。因此,我创建了WebApplicationInitializer而不是常规部署描述符,并且创建了使用@Configuration批注的应用程序上下文。
部署描述符
package dk.chakula.config; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration.Dynamic; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; /** * * @author martin * @since 12-1-2012 * @version 1.0 */ public class Initializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { registerDispatcherServlet(servletContext); } private void registerDispatcherServlet(final ServletContext servletContext) { WebApplicationContext dispatcherContext = createContext(ChakulaWebConfigurationContext.class); DispatcherServlet dispatcherServlet = new DispatcherServlet(dispatcherContext); Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/"); } private WebApplicationContext createContext(final Class<?>... annotatedClasses) { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(annotatedClasses); return context; } } //End of class Initializer
应用环境
package dk.chakula.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.view.UrlBasedViewResolver; import org.springframework.web.servlet.view.tiles2.TilesConfigurer; import org.springframework.web.servlet.view.tiles2.TilesView; /** * * @author martin * @since 12-01-2013 * @version 1.0 */ @Configuration @EnableWebMvc @ComponentScan("dk.chakula.web") public class ChakulaWebConfigurationContext { @Bean public TilesConfigurer setupTilesConfigurer() { TilesConfigurer configurer = new TilesConfigurer(); String[] definitions = {"/layout/layout.xml"}; configurer.setDefinitions(definitions); return configurer; } @Bean public UrlBasedViewResolver setupTilesViewResolver() { UrlBasedViewResolver viewResolver = new UrlBasedViewResolver(); viewResolver.setViewClass(TilesView.class); return viewResolver; } } //End of class ChakulaWebConfigurationContext
我的问题是我似乎找不到“隔离”到包含图像,CSS JavaScript等资源文件夹的映射的方法。当我的应用程序上下文在Java中时。
在普通的XML应用程序上下文中,我使用了这个标签来隔离到/ resources /的映射。
<mvc:resources mapping="/resources/**" location="/resources/" />
我该怎么做,以便我的Web应用程序可以使用我的图像,CSS等。
为了能够在Spring MVC应用程序中提供静态资源,您需要两个XML标签:<mvc:resources/>和<mvc:default- servlet-handler/>。在基于Java的Spring配置中,相同的是:
<mvc:resources/>
<mvc:default- servlet-handler/>
@Configuration @EnableWebMvc public class WebMvcConfig extends WebMvcConfigurerAdapter { // equivalents for <mvc:resources/> tags @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926); registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926); registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926); } // equivalent for <mvc:default-servlet-handler/> tag @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } // ... other stuff ... }
请注意,由于使用了@EnableWebMvc注释,因此无需直接扩展WebMvcConfigurationSupport,而只需扩展WebMvcConfigurerAdapter。有关详细信息,请参见JavaDoc for @EnableWebMvc。
@EnableWebMvc
WebMvcConfigurationSupport
WebMvcConfigurerAdapter