DispatcherServlet(前端控制器)访问顺序和url匹配规则
前端控制器访问流程图:
dispatcher代码导入:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
说明:
1:在web.xml里面导入前端控制器,通过< url-pattern >设置匹配规则,如上面设置的*.html,会匹配所有的带有html后缀的url访问。
2:若url匹配成功,交给HandlerMapping处理映射器处理(具体的形式是业务代码中的Controller,通过RequestMapping进一步传递匹配)
3:HandlerAdapter处理器适配器,处理一些功能请求,返回一个ModelAndView对象(包括模型数据、逻辑视图名)
4:ViewResolver视图解析器,先根据ModelAndView中设置的View解析具体视图
5:然后再将Model模型中的数据渲染到View上。
6:若第2步的url未成功匹配,则相当于通过缺省匹配(有关匹配规则,下面会解释),直接由ViewResolver视图解析器负责映射资源文件。映射成功予以返回显示,否则则返回404错误。
ViewResolver(视图解析器)导入:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/admin/" />
<property name="suffix" value=".jsp" />
</bean>
关于url-pattern的四种匹配规则,在此作进一步解释:
1、精确匹配(简单,容易理解)
< url-pattern >中配置的项与url完全精确匹配。
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/user/login.html</url-pattern>
<url-pattern>/user/logout.do</url-pattern>
</servlet-mapping>
当在浏览器中输入如下几种url时,都会被匹配到该servlet
http://localhost:8080/demo/user/login.html
http://localhost:8080/demo/user/logout.do
2、扩展名匹配
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
扩展名为jsp或do的url请求都会匹配,比如下面的url都会被匹配
http://localhost:8080/demo/user/login.jsp
http://localhost:8080/demo/user/logout.out
3、路径匹配
以“/”字符开头,并以“/*”结尾的字符串用于路径匹配
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/user/*</url-pattern>
</servlet-mapping>
路径以/user/开始,后面的路径任意。如下面的url都会被匹配。
http://localhost:8080/demo/user/login.jsp
http://localhost:8080/demo/user/logout.out
4、 缺省匹配
所有在web.xml文件中找不到匹配的< servlet-mapping >元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
缺省匹配会访问viewResolver管理的(视图解析器)静态文件资源。
关于匹配规则,详细可以阅读此篇文章
下一篇: 从“0”到“1”手撸一个热修复框架