一 背景

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

  • 前端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 :-)

SSM 返回静态页面HTML Controller 被递归调用引起的StackOverflowError的更多相关文章

  1. SpringMVC与SpringBoot返回静态页面遇到的问题

    1.SpringMVC静态页面响应 package com.sv.controller; import org.springframework.stereotype.Controller; impor ...

  2. ssm中从页面到controller和数据库出现乱码问题的解决

    1.确保项目编码为utf8,点击项目右键,点击properties 2.确保数据库编码为utf8,以MySQL为例,可到mysql目录下,my.ini文件中修改后,重启mysql服务 重启mysql服 ...

  3. SpringBoot返回html页面

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

  4. Django之使用celery和NGINX生成静态页面实现性能优化

    性能优化原理: 当我们要给client浏览器返回一个页面时,我们需要去数据库查询数据并将数据和基本页面模板渲染形成页面返回给客户端,但如果每一个用户访问时都去查询一次首页的的数据时,当日访问量很大时那 ...

  5. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  6. 你好,C++(27)在一个函数内部调用它自己本身 5.1.5 函数的递归调用

    5.1.5 函数的递归调用 在函数调用中,通常我们都是在一个函数中调用另外一个函数,以此来完成其中的某部分功能.例如,我们在main()主函数中调用PowerSum()函数来计算两个数的平方和,而在P ...

  7. 关于controller返回的页面js文件和css文件404问题的正式解决

    谨用此博客记录一下这条卡了两个星期的bug…… 还是之前的问题,通过get方法,后台@Controller返回页面然后弹窗.但是不知道为什么一直所有js文件和css文件都报404…… (之前的博客记录 ...

  8. 上手spring boot项目(一)之如何在controller类中返回到页面

    题记:在学习了springboot和thymeleaf之后,想完成一个项目练练手,于是使用springboot+mybatis和thymeleaf完成一个博客系统,在完成的过程中出现的一些问题,将这些 ...

  9. 解析好的静态页面.shtml浏览器无法解析.需要apache解析后再返回给浏览器

    解析好的静态页面.shtml浏览器无法解析.需要apache解析后再返回给浏览器 让Apache支持SHTML(SSI)的配置方法 http.conf放开addtype text/html .shtm ...

随机推荐

  1. ACL与OSPF综合实验

    OSPF与ACL 综合实验   拓扑图如下: 分析: 配置基本配置: R1: R2: R3: 2.配置OSPF: R1: R2: R3: IT: 设置IT的ip 并划分到ospf2区域 3.配置ACL ...

  2. Go标准库之Log

      文章引用自 Go语言标准库log介绍 无论是软件开发的调试阶段还是软件上线之后的运行阶段,日志一直都是非常重要的一个环节,我们也应该养成在程序中记录日志的好习惯. log Go语言内置的log包实 ...

  3. 卫哲VS投行女,秋后算账是阿里的企业文化吗?

    编辑 | 于斌 出品 | 于见(mpyujian) 提到马云,大家都会想到淘宝,阿里,也都期待阿里巴巴的马云爸爸能够给我们免单,从而省去我们每天为钱烦恼的后顾之忧.虽然今天要吃的瓜是有关阿里的,但是并 ...

  4. iOS 开发之基于JWT的Token认证机制及解析

    在移动端和服务端通信中,一般有两种认证方式:token 和 session. 1.session/cookie 认证机制: 在服务端创建一个Session对象,同时在客户端的浏览器端创建一个Cooki ...

  5. 【兆易创新RISC-V开发板评测】01.干货分享

    背景介绍:2019年12月19日在面板包偶然发可以免费申请测评GD32VF103开发板,欣喜万分:在这之前各大技术论坛说是已经有国产兆易创新的RISCV指令集的MCU发布的事情,一时间摩拳擦掌想购入一 ...

  6. Linux - 查看文件、文件夹、磁盘大小命令

    1. ls -lsh 2. du -sh du == disk usage (磁盘使用量,占用的磁盘空间) 一个文件占用的磁盘空间和一个文件的大小是两码事情.占用空间取决于文件系统的块(block)的 ...

  7. 源代码管理工具(2)——SVN(2)——第一次用SVN遇到的问题

    今天因为项目的需要第一次使用了svn来托管项目,第一使用svn遇到了几个问题. 这个安装的过程很简单,不再赘述.在安装完成之后,相信肯定有一部分第一次用这个的人直接到开始处打开这个软件,这时候就会弹出 ...

  8. 利用graphviz软件和pycallgraph库自动生成Python代码函数调用关系图

    参考博文:https://blog.csdn.net/qq_36408085/article/details/82952846 https://blog.csdn.net/fondax/article ...

  9. DMVPN基础配置

    DMVPN基础拓扑: 配置步骤:    1. 基本IP地址配置实现网络可达    2. 配置GRE多点隧道(mGRE)和NHRP(下一跳解析协议)    3. 配置EIGRP路由协议    4. 配置 ...

  10. vue.js ③

    1.组件使用的细节点 H5编码中的规范是tr必须在tbody里所以不能直接套用<row></row>的写法,<ul>标签下支持<li>,select标签 ...