浅谈springmvc的DispatcherServlet分析
本文介绍了springmvc的DispatcherServlet,分享给大家,具体如下: 一、程序 (一)web.xml文件中的内容 <!-- springMVC核心配置 --> <servlet> <servlet-name>springmvcServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <!--spingMVC的配置路径 --> <param-value>classpath:springmvc/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvcServlet</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> (二)src/main/resource/springmvc/spring-mvc.xml中的内容 <!-- 扫描controller(controller层注入) --> <context:component-scan base-package="com.z.controller"/> <!-- 对模型视图添加前后缀 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/view/" p:suffix=".jsp"/> (三)src/main/java/com/z/controller/IndexController.java中的内容 package com.z.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class IndexController { @RequestMapping("/index.html") public ModelAndView getIndex(HttpServletRequest request) throws Exception { ModelAndView mav = new ModelAndView("index"); return mav; } } (四)src/main/webapp/WEB-INF/view/index.jsp <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>" rel="external nofollow" > <title>My JSP 'index.jsp' starting page</title> </head> <body> This is my JSP page. <br> </body> </html> (五)运行结果:正常显示index.jsp中的内容 二、DispatchServlet流程 DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。 1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析; 从以上我们可以看出DispatcherServlet主要负责流程的控制。 三、web.xml中servlet的执行顺序 <servlet> <servlet-name>springmvcServlet</servlet-name> (1) <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> (2) </servlet> <servlet-mapping> <servlet-name>springmvcServlet</servlet-name> (3) <url-pattern>*.html</url-pattern> (4) </servlet-mapping> Tomcat服务器首先读取(4)中url-pattern,然后获取(3)中的servlet-name。再读取(1)中的servlet-name,最后查找(2)中的DispatcherServlet类。 所以,读取顺序为(4)-->(3)-->(1)-->(2) 注意,(3)中的servlet-name要和(1)中的servlet-name完全一样。 四、Sevlet的匹配方式和url-pattern的写法 Servlet的匹配顺序 1:精确(Exact)匹配,比如index.html 这样的话,本程序中web.xml的url-pattern有三种写法: (1)精确匹配 <servlet-mapping> <servlet-name>springmvcServlet</servlet-name> <url-pattern>index.html</url-pattern> </servlet-mapping> 表示所有以index.html为结尾的请求可以匹配。比如:http://localhost:8080/项目名/index.html 这种方式有很大的局限性,比如有好多个html请求,比如index.html,login.html,abc.html等,就得添加很多个url-pattern。 (2)扩展名匹配 <servlet-mapping> <servlet-name>springmvcServlet</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> 这种写法,可以匹配所有后缀名为html的请求 (3)默认匹配 <servlet-mapping> <servlet-name>springmvcServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 注意,下面这种写法是错误的 <servlet-mapping> <servlet-name>springmvcServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> 这是因为,找到的jsp文件会再次DispatcherServlet拦截。 以本文中的程序为例,通过controller中的/index.html找到的方法为getIndex(),返回的ModalAndView为/WEB-INF/view/index.jsp,再次被DispatcherServlet拦截后就会在controller中寻找/WEB-INF/view/index.jsp所对应的方法,这个方法是没有的,所以会报错。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |