Web开发
web开发要解决的问题:
1.导入静态资源
2.首页
3.jsp,模板引擎Thymeleaf
4.装配扩展SpringMVC
5.增删改查
6.拦截器
7.国际化
1.导入静态资源
代码层面分析:
查看WebMvcAutoConfiguration配置类。
这个类里有WebMvcAutoConfigurationAdapter静态内部类。
@Configuration(
proxyBeanMethods = false
)
@Import({
WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
@EnableConfigurationProperties({
WebMvcProperties.class, ResourceProperties.class, WebProperties.class})
@Order(0)
public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {
private final WebMvcProperties mvcProperties;
private final ListableBeanFactory beanFactory;
private final ObjectProvider<HttpMessageConverters> messageConvertersProvider;
private final ObjectProvider<DispatcherServletPath> dispatcherServletPath;
private final ObjectProvider<ServletRegistrationBean<?>> servletRegistrations;
final WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer;
public WebMvcAutoConfigurationAdapter(WebProperties webProperties, WebMvcProperties mvcProperties, ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider, ObjectProvider<WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider, ObjectProvider<DispatcherServletPath> dispatcherServletPath, ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) {
this.mvcProperties = mvcProperties;
this.beanFactory = beanFactory;
this.messageConvertersProvider = messageConvertersProvider;
this.resourceHandlerRegistrationCustomizer = (WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer)resourceHandlerRegistrationCustomizerProvider.getIfAvailable();
this.dispatcherServletPath = dispatcherServletPath;
this.servletRegistrations = servletRegistrations;
this.mvcProperties.checkConfiguration();
}
在这个类中有加载静态资源的方法addResourceHandlers。
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
} else {
ServletContext servletContext = this.getServletContext();
this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
registration.addResourceLocations(this.resourceProperties.getStaticLocations());
if (servletContext != null) {
registration.addResourceLocations(new Resource[]{
new ServletContextResource(servletContext, "/")});
}
});
}
}
第一种能拿到web资源的方式
什么是webjars?
可以在webjars的官网首页找到许多web端所需要的插件,对应的maven坐标。将它的依赖放到pom文件中即可导入。但是这种方法比较笨【不推荐】
此时就拿到这个文件,并且能够通过浏览器访问到。
第二种方式:
获取静态资源的路径
this.mvcProperties.getStaticPathPattern()
--
再进一步深入,发现staticPathPattern为
this.staticPathPattern = "/**";
-------
private static final String[] CLASSPATH_RESOURCE_LOCATIONS =
new String[]{
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"};
一共有5个位置,支持静态资源位置。
由此可见,这5个目录都能都访问到。
经过试验,
“classpath:/resources/”, 优先级最高
“classpath:/static/”, 优先级第二【默认使用】
“classpath:/public/” 优先级第三
直接在resources下方静态资源并不能够访问到。
第三种方式【不推荐】
在yaml文件中自定义路径。
spring:
mvc:
static-path-pattern: