妈妈呀,那怎么搞,我好像有点懵逼了呢!
![[ Coding七十二绝技 ] 如何利用Java异常快速分析源码](https://cdn.nlark.com/yuque/0/2019/jpeg/285432/1576210633875-c92c878c-6d37-4b35-afe5-85eb882eea28.jpeg#align=left&display=inline&height=250&name=e18d20c94006dfe0-9eef65073f0f6be0-335c5fd1b4bae44534eef19e66fb248b.jpg&originHeight=250&originWidth=492&size=28254&status=done&style=none&width=492)
先看张草图
![[ Coding七十二绝技 ] 如何利用Java异常快速分析源码](https://cdn.nlark.com/yuque/0/2019/png/285432/1576211079645-f5c642ab-33ee-4281-b400-c74a0799319f.png#align=left&display=inline&height=397&name=web%E8%AF%B7%E6%B1%82%E8%8D%89%E5%9B%BE.png&originHeight=397&originWidth=843&size=29258&status=done&style=none&width=843)
不管是nio bio 又或是aio,服务端最终执行请求,必然会分配一个线程去做。
既然分析的是springmvc处理过程,也就是说从浏览器到tomcat这段我们是不用管的,我们只需要分析服务端线程调用springmvc方法后执行的这一段就可以了。
爸爸呀,服务端执行这个在tomcat里面呀,我怎么找。
![[ Coding七十二绝技 ] 如何利用Java异常快速分析源码](https://cdn.nlark.com/yuque/0/2019/gif/285432/1576211222838-435eb9bc-a811-4773-a2b1-f4f8aea4a753.gif#align=left&display=inline&height=264&name=%E7%88%B8%E7%88%B8%E5%8E%BB%E5%93%AA%E4%BA%86.gif&originHeight=264&originWidth=247&size=12082&status=done&style=none&width=247)
确实这么找,不好找。
上面说了先找到起点和终点,没说两个都要找到呀,既然起点在tomcat里不好找,那终点能找到吗?
我想想,终点难道是controller里的方法吗?
答对了,请求所抵达的终点就是controller里面声明的方法。
好的终点找到了,如何报错,一时脑袋懵逼,哎,还是不习惯主动写个异常,一时不知道代码怎么写。
好吧,那我们就用两行代码来主动造个异常,异常水平的高低不要求,能出错的异常就是好异常。嗯?好像是个病句,不重要。
@RequestMapping("/hello")public String hello(String name){
String nullObject = null;
nullObject.toString();
return "hello : " + name;
}
OK,写完了,执行时第四行必报空指针错误,启动测试一下呗。
当当当当,看看,异常栈又来了,这次看着异常是否亲切了些。
![[ Coding七十二绝技 ] 如何利用Java异常快速分析源码](https://cdn.nlark.com/yuque/0/2019/png/285432/1576211794199-70b8f192-5435-4f77-bc33-06583bc3cc56.png#align=left&display=inline&height=515&name=image.png&originHeight=515&originWidth=1169&size=158739&status=done&style=none&width=1169)
来分析一波,上面的草图中可以看到,线程中肯定会调用springmvc的代码,tomcat的一些处理我们可以忽略,直接从异常栈中找org,springframework包开头的类信息。可以看到FrameworkServlet类是由tomcat进入springmvc框架的第一个类。调用它的是HttpServlet,再顺着网上看,就可以看到DispatcherServlet,在未使用springboot之前,我们使用springmvc框架还需要在web.xml中添加配置
<servlet><servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

