SpringMVC执行原理
简要分析执行流程
-
DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
我们假设请求的url为 : http://localhost:8080/SpringMVC/hello
如上url拆分成三部分:
SpringMVC部署在服务器上的web站点
hello表示控制器
通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。
-
HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
-
HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。
-
HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
-
HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
-
Handler让具体的Controller执行。
-
Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
-
HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
-
DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
-
视图解析器将解析的逻辑视图名传给DispatcherServlet。
-
DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
-
最终视图呈现给用户
一.案例一:使用xml配置springmvc
-
1.在pom.xml导入依赖:
-
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.0.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies>
2.在web.xml文件中配置DispatchServlet
-
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <!-- 配置DispatcherServlet--> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!-- 绑定springmvc的配置文件--> <!-- contextConfigLocation 名称是死的 只能这样配置 --> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-Servlet.xml</param-value> </init-param> <!-- 设置启动级别 0以下 访问时候 才会启动 0或者0以上 服务器一启动 就启动 --> <load-on-startup>0</load-on-startup> </servlet> <!-- 设置映射 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- 访问路径 / 代表 只匹配所有的请求 但不会匹配jsp页面 /* 匹配所有的请求 包含jsp --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
3.配置springmvc的配置文件
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--配置映射器--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- 配置适配器--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!-- 配置视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- //配置前缀 --> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- 配置后缀--> <property name="suffix" value=".jsp"/> </bean> <!-- 根据bean的名字找--> <bean id="/hello" class="com.huahua.controller.Controller"/> </beans>
4.创建 Controller类
-
package com.huahua.controller; import org.springframework.web.servlet.ModelAndView; import javax.naming.ldap.Control; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //继承Controller public class Controller implements org.springframework.web.servlet.mvc.Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("msg","springmvc"); modelAndView.setViewName("hello");//跳转的页面 由于在配置文件中设置的前缀后缀 所以这里应该跳转 /WEB-INF/jsp/hello.jsp return modelAndView; } }
运行结果
-
springmvc
-
2. 使用注解配置springmvc
-
1 导入依赖都跟xml配置一样
-
2.spring配置文件中的配置
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 自动扫描包 让包下的注解生效 --> <context:component-scan base-package="com.huahua.controller"/> <!--让sringmvc 不处理静态资源--> <mvc:default-servlet-handler/> <!-- 3. 支持mvc注解驱动 在spring中一般采用@RequestMapping注解来完成映射 要想使@RequestMapping注解生效 必须向上文中注册DefaultAnnotationHandlerMapping 和一个AnnotationMethodHandlerAdapter实例 这两个实例分别在类级别和方法级别处理 而annotation-driven配置帮助我们自动完成上诉两个实例的注入 --> <mvc:annotation-driven/> <!-- 视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="suffix" value=".jsp"/> <property name="prefix" value="/WEB-INF/jsp/"/> </bean> </beans>
3.controller类
-
package com.huahua.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; //表明已经被spring容器接管 相当于xml文件中的<bean> @Controller public class Controller02 { //真实访问地址 :项目名/hello //访问路径 在url后面添加 /hello 即可访问 @RequestMapping("/hello") public String hello(Model model){ String result="springmvc02"; model.addAttribute("msg",result); return "hello"; //返回 /WEB-INF/jsp/hello.jsp页面 } }
4.jsp文件 跟xml配置的jsp是同一个页面
-
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2021/3/17 Time: 10:15 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> ${msg} </body> </html>