1.配置web.xml文件时,controller应当在<servlet-mapping>中的<url-pattern></url-pattern>被匹配,而jsp文件则不应当被匹配。
2.先看下DispatcherServlet类的执行过程:
-
收到一个 HTTP 请求后,DispatcherServlet 根据 HandlerMapping 来选择并且调用适当的控制器。
-
控制器接受请求,并基于使用的 GET 或 POST 方法来调用适当的 service 方法。Service 方法将设置基于定义的业务逻辑的模型数据,并返回视图名称到 DispatcherServlet 中。
-
DispatcherServlet 会从 ViewResolver 获取帮助,为请求检取定义视图。
- 一旦确定视图,DispatcherServlet 将把模型数据传递给视图,最后呈现在浏览器中。
3.由上面步骤可知,DispatcherServlet收到请求后,会去根据<url-pattern></url-pattern>中的匹配模式判断是否拦截:
1)若不拦截则直接进行视图渲染处理(即直接执行对应的jsp文件并返回);
2)若拦截该请求,则会去WEB-INF路径下解析所有的[name]-servlet.xml,根据RequestMapping判断用哪个controller进行处理,处理完成后controller会告诉DispatcherServlet用处理好的模型(model)去渲染哪个视图,DispatcherServlet找到视图(.jsp文件)并渲染完成后,返回给客户端,执行结束;
这里是关键!!注意:如果在“controller告诉DispatcherServlet用处理好的模型去渲染哪个视图”这一步,相应的视图(比如hello.jsp)会被<url-pattern></url-pattern>中的规则拦截,则会导致500错误,如果此时直接在url里访问该jsp,则会导致404错误!!
举个例子:若我们有一个/hello的controller和一个hello.jsp文件,要想成功执行HelloController并用模型渲染hello.jsp,则拦截配置为<url-pattern>/hello</url-pattern>或<url-pattern>/</url-pattern>都可以,但是<url-pattern>/hello.jsp</url-pattern>和<url-pattern>/*</url-pattern>都是会报404错误的;
4.在这里大家看下/*和/的区别:https://blog.csdn.net/THMAIL/article/details/90580506
5.说几个典型错误:
1)为什么<url-pattern>*.jsp</url-pattern>会404,而不是直接返回某.jsp文件?
答:因为jsp后缀的文件被DispatcherServlet类拦截,被拦截的访问会被DispatcherServlet类找相应的controller进行处理,但是DispatcherServlet类又没在RequestMapping中找到相应的Controller,于是就返回404;如果想返回某.jsp文件,则正确的配置应为<url-pattern>/</url-pattern>,或者其他任何不会匹配到.jsp文件的url-pattern!!
2)为什么<url-pattern>/</url-pattern>可以直接在url访问controller和.jsp文件(比如hello和hello.jsp),而<url-pattern>/*</url-pattern>不行?
答:应为<url-pattern>/</url-pattern>不会匹配到.jsp文件,因此可以直接执行某jsp文件或拦截某controller并执行;
而<url-pattern>/*</url-pattern>会匹配到,因此就会发生我在3中所说的controler返回的待渲染的jsp文件被当请求给拦截,并去匹配controller;
6.总结下个人理解的处理流程图: