妈妈呀,那怎么搞,我好像有点懵逼了呢!
先看张草图
不管是nio bio 又或是aio,服务端最终执行请求,必然会分配一个线程去做。
既然分析的是springmvc处理过程,也就是说从浏览器到tomcat这段我们是不用管的,我们只需要分析服务端线程调用springmvc方法后执行的这一段就可以了。
爸爸呀,服务端执行这个在tomcat里面呀,我怎么找。
确实这么找,不好找。
上面说了先找到起点和终点,没说两个都要找到呀,既然起点在tomcat里不好找,那终点能找到吗?
我想想,终点难道是controller里的方法吗?
答对了,请求所抵达的终点就是controller里面声明的方法。
好的终点找到了,如何报错,一时脑袋懵逼,哎,还是不习惯主动写个异常,一时不知道代码怎么写。
好吧,那我们就用两行代码来主动造个异常,异常水平的高低不要求,能出错的异常就是好异常。嗯?好像是个病句,不重要。
@RequestMapping("/hello")public String hello(String name){
String nullObject = null;
nullObject.toString();
return "hello : " + name;
}
OK,写完了,执行时第四行必报空指针错误,启动测试一下呗。
当当当当,看看,异常栈又来了,这次看着异常是否亲切了些。
来分析一波,上面的草图中可以看到,线程中肯定会调用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>