Spring Boot集成JSP路径映射及Maven运行命令差异问题咨询
问题解答
1. 视图解析器映射逻辑及target目录无文件仍可渲染的原因
InternalResourceViewResolver 拼接完前缀后缀得到完整路径 /WEB-INF/views/index.jsp 后,是通过ServletContext.getResource()方法读取资源,而非直接读取target目录的文件。
你用mvn spring-boot:run启动项目时,Spring Boot默认会将src/main/webapp作为Servlet上下文的资源目录直接加载,不需要提前把该目录下的文件拷贝到target目录就能读取源文件,同时JSP是由内置的Tomcat容器在运行时动态编译的,所以就算target中没有WEB-INF目录,也能正常渲染src/main/webapp/WEB-INF/views/index.jsp的内容。
2. 两个Maven命令的差异
mvn spring-boot:run是Spring Boot Maven插件提供的启动目标,仅会触发编译类的生命周期阶段,默认仅将src/main/resources下的文件拷贝到target/classes目录,不会处理src/main/webapp下的内容,因此不会生成WEB-INF目录。mvn clean package spring-boot:run额外执行了package打包阶段:如果你的pom.xml中打包类型设置为war,Maven的war插件会在打包阶段将src/main/webapp下的所有内容拷贝到target的war解压目录或者war包内部,自然就会生成WEB-INF目录;如果是jar包类型,需要额外配置Maven插件才会将webapp目录打入jar包的META-INF/resources下。
3. 优先返回WEB-INF下JSP的原因
你访问的/indexA路径已经匹配到了IndexController的接口,控制器直接返回了视图名index,会直接走你配置的InternalResourceViewResolver视图解析逻辑,不会进入静态资源匹配流程。
而/resources和/static下的index.jsp属于静态资源,只有当请求路径没有匹配到任何控制器接口时,Spring才会到静态资源路径下搜索对应文件,因此控制器的视图解析优先级远高于静态资源匹配,最终返回的是WEB-INF下的JSP内容。
内容的提问来源于stack exchange,提问作者sak18
相关产品推荐
相关产品推荐

