一 背景

最近在做工程实践,想实现这么一个效果:

  • 前端url请求地址:localhost:8080/idevtools/search
  • 后端返回一个静态页面HTML:search.html

按照网上说的,进行了一些配置,然后运行项目,出现了错误:javax.servlet.ServletException: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.StackOverflowError;

二 原因

去网上各种查阅资料,都没找到与该问题相关的文章(这也是我发博客的原因),可能是遇到这类问题的人只有少部分。事实上,确实也只有“机缘巧合”的人会遇到这个问题。

  • Controller中处理/idevtools/search请求的方法被递归调用了;
  • Controller中searchHtml()方法返回的字符串"search"(对应search.html文件)经过视图解析器处理(请求转发)后刚好又变成了url:/idevtools/search,所以searchHtml()又一次被调用;

三 重现

1.在webapp/目录下存2个html文件:isearch.html,view.html,目录如下:

2.配置spring-mvc.xml,视图解析器:

<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/"/><property name="suffix" value=".html"/>
</bean>

3.编写HtmlController,如下:

/*** 静态页面请求处理Controller* @author southday* @date 2019/3/4*/
@Controller
public class HtmlController {@GetMapping("/search")public String searchHtml() {System.out.println("search html");return "isearch";}@GetMapping("/view")public String viewHtml() {System.out.println("view html");return "view";}
}

注意看这两个请求的处理:

  • /search,返回的是isearch,对应的是isearch.html
  • /view,返回的是view,对应的是view.html

当你运行项目,发送请求时,只有/search可以成功返回html页面,/view则会报异常(StackOverflowError)。具体原因我没去深入了解,但觉得是:

  • 视图解析器中根据Controller返回的字符串“view”,优先匹配了请求/idevtools/view,所以HtmlController中的viewHtml()方法会被递归调用,导致StackOverflowError;
  • 而返回"isearch"时,没有匹配到相应的请求,进而匹配了静态页面"isearch.html",因此能正常返回html页面;

转载请说明出处!have a good time :-)

转载于:https://www.cnblogs.com/southday/p/10472727.html

SSM 返回静态页面HTML Controller 被递归调用引起的StackOverflowError相关推荐

  1. python3_函数_形参调用方式 / 不定长参数 / 函数返回值 / 变量作用域 / 匿名函数 / 递归调用 / 函数式编程 / 高阶函数 / gobal和nonlocal关键字 / 内置函数

    1.形参的调用方式 1. 位置参数调用 2. 关键词参数调用 原则: 关键词参数调用不能写在位置参数调用的前边 def test1(name, age):print("name:" ...

  2. springboot返回html页面原理,SpringBoot返回html页面

    一般Controller返回数据或页面,今天谈一下返回页面的场景. 一.不使用template 1. controller中定义对应的访问路由及返回的页面(使用Controller,不要使用RestC ...

  3. 静态Web服务器-返回固定页面数据

    1. 开发自己的静态Web服务器 实现步骤: 编写一个TCP服务端程序 获取浏览器发送的http请求报文数据 读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器. HTTP响应报文数据 ...

  4. 【函数的定义、调用(嵌套调用、递归调用)、声明、函数的分类(有无返回值、有无参数)、变量(自动变量与静态变量、局部变量与全局变量、只读变量)】(学习笔记7--函数)

    第一篇博文,打卡新星计划第三季3.4~4.4,希望能有质的飞跃,顶峰相见 一.自定义函数 1.函数的定义 函数在使用前也需要定义,定义的格式如下: 数据类型 函数名([数据类型 参数1],[数据类型 ...

  5. express如何返回一个html文档,node.js express 返回一个静态页面

    首先我们要有一个静态页面 .html 文件. 然后,我们初始化一个express 项目. 首先新建一个目录,进入它,如果没有下载express的话,使用命名下载npm install express ...

  6. SpringMVC:返回HTML页面

    [问题] 在webapp的WEB-INF下放入一个html,通过控制层Controller返回html报错(404).但是返回jsp页面却不会报错. [原因]静态的html访问不到,但是动态的jsp可 ...

  7. JSP中把动态页面转换为静态页面

    原文:http://www.gpxz.com/diannao/biancheng/261225.html 要自动生成静态页面,用Filter截获jsp请求并先进行预处理,自动生成Html,是个不错的主 ...

  8. SpringBoot--访问静态页面

    原文网址:SpringBoot--访问静态页面_IT利刃出鞘的博客-CSDN博客 简介 位置与优先级 位置 spring boot的静态资源: static目录:css.js.图片等 template ...

  9. Day210.服务端渲染技术NUXT、整合前台主页面、名师、课程静态页面、首页整合banner数据后端部分【创建banner微服务、接口、banner后台前端实现】 -谷粒学院

    谷粒学院 服务端渲染技术NUXT 一.服务端渲染技术NUXT 1.什么是服务端渲染 服务端渲染又称SSR (Server Side Render)是在服务端完成页面的内容,而不是在客户端通过AJAX获 ...

最新文章

  1. C++ 对象的内存布局(上)
  2. RESTful API -备
  3. 读取串口数据_自定义串口通信的相关问题整理
  4. Zygote启动分析
  5. ubuntu12.04升级后找不到共享目录
  6. django手机访问_Django对接支付宝电脑网站、App支付步骤详解!这个框架是真强!...
  7. 终于可以摆脱 Pipenv 这坑货了
  8. 115配额怎么增加_笔电、平板接口少怎么办,ORICO八合一多功能扩展坞助你一臂之力...
  9. [Python+Anaconda] 查看Python、Anaconda下python、CUDA、函数库的版本
  10. mapreduce程序调用各个类的功能
  11. Linux下如何修改ini文件,如何修改Boot.ini文件,重新引导Linux!
  12. 信息安全管理体系--建立
  13. iptv直播服务器维护,IPTV机顶盒的智能化配置和维护方案介绍【详解】
  14. Dism++更新扫描时提示“系统找不到指定文件”
  15. Iphone开发(九)理解subView,手动实现多个视图切换
  16. 掌握 Dojo 工具包
  17. 用 Python 实现朋友圈中的九宫格图片 看这一篇就够了
  18. java爬虫正则表达式_Java爬虫预热之正则表达式 - 菜鸟头头
  19. VHDL实现矩阵键盘检测
  20. 多周期时间序列分解算法——MSTL原理

热门文章

  1. 【原创】数据库中时间字段的值读取到DataSet中后,毫秒部分丢失。
  2. C#实现(递归和非递归)快速排序和简单排序
  3. Java8新特性:接口的默认方法与接口的静态方法
  4. MySQL引擎:MyIsam和Innodb的区别
  5. matlab绘制离散数据图
  6. python错误代码40035_Python 创建XML
  7. ant vue 树形菜单横向显示_Vue--组件Ant- 树形结构菜单
  8. 交换器无法根据自身类型和路由键找到符合条件队列时,有哪些处理?
  9. 什么是热Key问题,如何解决热key问题
  10. hashmap的五种便利方式