使用WebMvcConfigurationSupport无法访问html页面原因分析
2020-01-14 23:12
337 查看
近日在使用
Spring 3.0+ 无
web.xml搭建 Spring MVC原型项目时,当使用
spring 5.0版本以上时,会发现
WebMvcConfigurerAdapter已经过时,此时将继承
WebMvcConfigurerAdapter修改为继承
WebMvcConfigurationSupport后,启动项目将无法访问
html页面。配置代码如下:
package com.demo3.springmvc.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.*; import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration @EnableWebMvc @ComponentScan("com.demo3.springmvc") public class MvcConfig extends WebMvcConfigurationSupport { @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/classes/views/"); viewResolver.setSuffix(".html"); return viewResolver; } /** * 访问静态文件 */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/"); } /** * 建立url与视图映射 */ @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("/index"); } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }
通过以上代码是无法访问html的,然后又将
WebMvcConfigurationSupport改为
WebMvcConfigurer(因为
WebMvcConfigurerAdapter是实现
WebMvcConfigurer接口),此时程序可以访问html页面。
后来通过观察
spring api文档后发现:
This is the main class providing the configuration behind the MVC Java config. It is typically imported by adding
@EnableWebMvcto an application@Configurationclass. An alternative more advanced option is to extend directly from this class and override methods as necessary, remembering to add@Configurationto the subclass and@Beanto overridden@Beanmethods. For more details see the javadoc of@EnableWebMvc.
使用谷歌翻译(没办法,都怪当初英语没好好学,现在只能使用翻译软件了/哭 )后的大致意思如下:
这是提供MVC Java配置背后配置的主要类。 通常是通过将@EnableWebMvc添加到应用程序@Configuration类中来导入的。 另一种更高级的选择是直接从此类扩展并根据需要重写方法,记住将@Configuration添加到子类中,并记住将@Bean添加到重写的@Bean方法中。 有关更多详细信息,请参见@EnableWebMvc的javadoc。
也就是说,在进行 MVC 配置时,可以使用两种方法:
- 直接在配置类上添加
@EnableWebMvc
并实现WebMvcConfigurer
接口,如:package com.demo3.springmvc.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.web.servlet.config.annotation.*; import org.springframework.web.servlet.view.InternalResourceViewResolver; @EnableWebMvc @ComponentScan("com.demo3.springmvc") public class MvcConfig implements WebMvcConfigurer { @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/classes/views/"); viewResolver.setSuffix(".html"); return viewResolver; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/"); } @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("/index"); } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }
- 直接继承
WebMvcConfigurationSupport
并添加@Configuration
注解package com.demo3.springmvc.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.web.servlet.config.annotation.*; import org.springframework.web.servlet.view.InternalResourceViewResolver; @ComponentScan("com.demo3.springmvc") public class MvcConfig extends WebMvcConfigurationSupport { @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/classes/views/"); viewResolver.setSuffix(".html"); return viewResolver; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/"); } @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }
注意: 由于上例使用到了
@ComponentScan
,所以就没再使用@Configuration
注解
参考资料:
- 《Java EE 开发的颠覆者:Spring Boot实战》 – 汪云飞 编著
- WebMvcConfigurationSupport class api 文档: https://docs.spring.io/spring-framework/docs/5.1.5.RELEASE/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.html
- The type WebMvcConfigurerAdapter is deprecated: https://stackoverflow.com/questions/47552835/the-type-webmvcconfigureradapter-is-deprecated
- Spring mvc请求处理流程详解(一)之视图解析: https://www.geek-share.com/detail/2689770824.html
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 使用UrlRewritingNet重写url以.html的伪静态页面后,真实的.html无法访问的解决方法
- 全面分析:内部无法使用映射的公网来访问内部服务器的原因
- 案例分析:内部无法使用映射的公网来访问内部服务器的原因
- 关于使用SOCKET发送数据时“目标积极积极拒绝,无法连接”错误的原因分析
- 百度云管家使用QQ第三方登录时提示“由于网络原因无法载入页面 请点击刷新后重试”
- Javascript访问html页面的控件的方法详细分析
- 在IIS中访问APS页面时提示:“最可能的原因使用的托管的处理程序,但是未安装或未完整安装asp.net“
- 使用js实现多个html页面访问同一个常量
- WebMvcConfigurerAdapter过期,WebMvcConfigurationSupport访问不到静态资源
- c#中修改xml文件报文件正由另一进程使用,因此该进程无法访问该文件的可能原因
- 网站[高并发]下使用[静态方法]会造成页面无法访问
- 火狐无法访问本机IIS部署的网站,弹出:此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求 的解决办法
- 解决!百度云管家使用QQ第三方登录时提示“由于网络原因无法载入页面 请点击刷新后重试”
- 使用idea过程中,修改html/jsp等页面不能生效的原因(eclipse也会遇到)
- Https请求的页面中无法使用http访问
- 用户从手机的浏览器访问www.baidu.com,看到的可能跟桌面PC电脑,是不太一样的网页效果,会更适合移动设备使用。请简要分析一下,实现这种网页区分显示的原因及技术原理。
- [转] 同一页面无法多次使用XmlHttp发起Ajax请求的真实原因
- “在使用Samba进行建立Wisamba无法访问,你可能没有权限使用网络”的一种问题原因及解决
- 访问WEB-INF下使用frameset标签页面出错的原因
- Red Hat Enterprise Linux AS release 4 下SSH无法使用无密码登陆的原因分析