Spring MVC中ModelAndView传值后页面未正常渲染如何解决
问题根因
HTML中的${resultUrl}、${embedUrl}是模板变量占位符,当前请求没有经过模板引擎解析,后端直接将HTML源文件作为静态资源返回给浏览器。浏览器会将${resultUrl}识别为真实访问路径发起请求,必然出现404或空白页;硬编码URL时路径是真实有效值,所以可以正常访问。
首先确保模板页面不要放在/static、/public、/resources、/META-INF/resources这类Spring默认静态资源目录下,这类目录下的文件会被直接返回,不会执行变量替换逻辑。
方案1:使用Thymeleaf模板引擎(Spring官方推荐)
- 引入Thymeleaf依赖,Spring Boot项目直接引入对应starter即可:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
- Spring Boot默认配置即可使用,将
Response.html放到src/main/resources/templates/目录下(Thymeleaf默认视图路径前缀为classpath:/templates/,后缀为.html)。 - 修改Controller中视图名配置,去掉后缀:
modelAndView.setViewName("Response");
- 修改HTML代码,引入Thymeleaf命名空间,通过
th:属性绑定后端传递的变量:
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> </head> <body> <iframe th:src="${resultUrl}" width="980" height="560" frameBorder="0" class="giphy-embed" allowFullScreen></iframe> <p><a th:href="${embedUrl}">text</a></p> </body> </html>
重启服务后访问即可正常渲染变量值。
方案2:使用JSP视图
如果项目使用JSP作为视图技术,按以下步骤配置:
- 引入JSP相关依赖:内置tomcat jsp支持、jstl标签库。
- 配置视图解析器前缀和后缀,例如前缀设置为
/WEB-INF/jsp/,后缀设置为.jsp,将页面文件重命名为Response.jsp放到对应目录下。 - 修改Controller视图名为
Response,不要带后缀。 - JSP页面默认支持EL表达式,原来写的
${resultUrl}、${embedUrl}可以直接解析,注意不要在page指令中添加isELIgnored="true"配置,否则EL表达式会被禁用。
无模板引擎的兼容方案
如果项目没有引入任何模板引擎,不要使用Model传值后跳转页面的模式,可以将接口改为返回JSON格式的URL数据,前端页面加载时通过AJAX请求接口拿到URL值,再通过JS动态给iframe的src属性、a标签的href属性赋值即可。
内容的提问来源于stack exchange,提问作者Alpharius
相关产品推荐
相关产品推荐

