黑马程序员的瑞吉外卖:springboot项目访问html页面,发现端口不一致的解决方案(在使用SpringMvc)
错误内容:明明已经设置静态资源映射,但是还是端口不一致。
@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* 设置静态资源映射
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
log.info("开始进行静态资源映射...");
registry.addResourceHandler("/static/backend/**").addResourceLocations("classpath:/backend/");
registry.addResourceHandler("/static/front/**").addResourceLocations("classpath:/front/");
}
}
在IDEA中用浏览器单独打开html页面后,发现页面的端口号为63342,与接口所写的8080端口不一致,因此无法连接网页,会报404异常。因为tomcat访问接口的时候默认端口号为8080,而idea运行页面的时候默认为63342。即在默认的静态资源过滤策略不能满足开发需求的情况下,可以去自定义静态资源过滤策略。即文件放在static目录下时,可通过8080端口访问到html页面。
1.直接在浏览器中输入http://localhost:8080/你要访问的html页面的名称。
2.如果方法一不行,则在config文件下实现一个WebMvcConfigure接口,(自定义静态资源过滤效率).
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyConfig implements WebMvcConfigurer {
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//扫描static下的所有html页面
registry.addResourceHandler("classpath:/static/*.html");
//扫描static下的所有资源
registry.addResourceHandler("/static/**");
}
}
设置完毕后,在浏览器中输入http://localhost:8080/+你要访问的html页面的名称 即可访问
以上为百度搜出来的解决方法,试了行不通。
后面再仔细看我原来的代码,发现路径里多了一个static,欲哭无泪TT。但是删了以后还是不行。
看到的弹幕:
“还是访问不到的可以在主程序加个componentscan注解指明扫描的路径”
“不生效的注意项目结构 配置类要在启动类同包或者子包下”
“如果出错,可以试试protected class WebMvcConfig implements WebMvcConfigurer,实现方法改为public”
“访问不到的,可能是@Configuration没加”
“感谢各位大哥 重启一下 可以了”
重启了一下之后,
解决一下端口占用
结果还是不行,所以我将端口号改为8081.
可以是可以了,但是当我打开我的目标页面login.html的时候,我发现。。。端口号变成8080了。
我只能说6,我都怀疑是操作太多,网络没反应过来。。。。把所有占用8080端口的进程全部delete,重启idea。
还是不行。就是一整个离谱住了。。。。。。。。。。。。。。。。明天早上再看看。
现在的问题就在于,我的tomcat不能配置8080端口,然后我的静态资源们,默认使用8080端口。
我打开了我之前使用8080启动的端口,发现它们也不行了,所以应该这个是我电脑本身的问题吧?
在网上search了一圈,发现8080端口被占用是很正常的问题,那我这时候就给它换一个端口号就好了。那么现在的问题就是我的静态资源应该如何成功完成映射?
首先将我的端口改为8081,然后通过postman发送请求到我的服务端。结果发现显示:
莫非是我的controller也写错了。
现在真的是错得找不到东南西北了。开始重新思考问题,前端页面打开一个端口,后端页面打开一个端口,而我的tomcat启动服务时的端口和后端是相同的,也就是说我的前端没有真正地映射过去。于是查看设置静态资源的文件。好像也没错。
再运行一次看看,并且在浏览器手动输入网址。
上网查找解决方法。
历尽千辛万苦,终于找到了一个解决方法。感谢CSDN博主Turing.
按照这个文件修改了我的config文件之后,在浏览器输入“localhost:8081/backend/page/login/login.html”终于实现了正常的端口访问,并且可以正常地与我所写的controller交互。
总结:
最后的解决方法“在config--WebMvcConfig中不要继承WebMvcConfigurationSupport,而是实现WebMvcConfigurer接口”,且不要在idea中直接点击浏览器图标打开对应的html页面,要自己在浏览器输入url。在本次debug过程中,更加清楚地明白了,springboot项目启动过程中,只扫描引导类同包或子包下的程序,而在resources目录下的静态资源文件(没放到),需要被映射,才能被扫描到。每次run之前,先clean后install。
分析问题的思路:
明确问题“我的tomcat不能配置8080端口,然后我的静态资源们,默认使用8080端口。”
这其中,首先解决前者,不能配置8080端口,究竟是我的设备的问题,还是我的程序的问题。通过重启idea、重启设备、在命令行窗口中kill占用端口8080进程,发现都不起作用,项目还是不能run。所以我给它换一个端口,换成8081,发现程序可以正常run了。并且在互联网上search了一下之后,发现端口8080被占用是一个蛮正常的事情。
所以我开始着手解决后者,为什么我的静态资源默认使用8080端口呢?那原因肯定是设置的映射配置不对。所以我首先通过浏览器访问理想中正确的url,得到了“Writeable Page Error”。再去搜索这个问题的解决方法,最后在茫茫篇海中发现了我的主要问题是:
“继承WebMvcConfigurationSupport后导致静态资源无法访问”。
然后再去修改对应的代码。
至于原因:搜索关键字“继承WebMvcConfigurationSupport类会导致自动配置失效”。