一、springmvc概述

Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。

官方文档:https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/web.html#spring-web

Spring MVC的特点:

  1. 轻量级,简单易学
  2. 高效 , 基于请求响应的MVC框架
  3. 与Spring兼容性好,无缝结合
  4. 约定优于配置
  5. 功能强大:RESTful、数据验证、格式化、本地化、主题等
  6. 简洁灵活

Spring的web框架围绕DispatcherServlet [ 调度Servlet ] 设计。

DispatcherServlet的作用是将请求分发到不同的处理器。

二、执行原理

SpringMVC - 图1

图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提供的技术,不需要开发者实现,虚
线表示需要开发者实现。

简要分析执行流程

  1. DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,
    DispatcherServlet接收请求并拦截请求。
    我们假设请求的url为 : http://localhost:8080/SpringMVC/hello

如上url拆分成三部分:

http://localhost:8080服务器域名
SpringMVC部署在服务器上的web站点
hello表示控制器
通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。

  1. HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据
    请求url查找Handler。
  2. HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器
    为:hello。
  3. HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
  4. HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
  5. Handler让具体的Controller执行。
  6. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
  7. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
  8. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
  9. 视图解析器将解析的逻辑视图名传给DispatcherServlet。
  10. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
  11. 最终视图呈现给用户。

三、第一个SprignMVC小程序

配置版

1.添加依赖

pom.xml

  1. <properties>
  2. <java.version>11</java.version>
  3. <maven.compiler.source>${java.version}</maven.compiler.source>
  4. <maven.compiler.target>${java.version}</maven.compiler.target>
  5. </properties>
  6. <dependencies>
  7. <dependency>
  8. <groupId>org.springframework</groupId>
  9. <artifactId>spring-webmvc</artifactId>
  10. <version>5.3.1</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>javax.servlet.jsp</groupId>
  14. <artifactId>jsp-api</artifactId>
  15. <version>2.1</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>javax.servlet</groupId>
  19. <artifactId>servlet-api</artifactId>
  20. <version>2.5</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>javax.servlet</groupId>
  24. <artifactId>jstl</artifactId>
  25. <version>1.2</version>
  26. </dependency>
  27. </dependencies>

2.配置web.xml 注册DispatcherServlet
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5. version="4.0">
  6. <servlet>
  7. <servlet-name>springmvc</servlet-name>
  8. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  9. <init-param>
  10. <param-name>contextConfigLocation</param-name>
  11. <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
  12. <param-value>classpath:springmvc-servlet.xml</param-value>
  13. </init-param>
  14. <!--启动级别-1-->
  15. <load-on-startup>1</load-on-startup>
  16. </servlet>
  17. <!--/ 匹配所有的请求;(不包括.jsp)-->
  18. <!--/* 匹配所有的请求;(包括.jsp)-->
  19. <servlet-mapping>
  20. <servlet-name>springmvc</servlet-name>
  21. <url-pattern>/</url-pattern>
  22. </servlet-mapping>
  23. </web-app>

3.编写SpringMVC 的 配置文件
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. </beans>
  • 添加 处理映射器

    1. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
  • 添加 处理适配器

    1. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
  • 添加 视图解析器

    1. <!--视图解析器:DispatcherServlet给他的ModelAndView-->
    2. <bean
    3. class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    4. id="InternalResourceViewResolver">
    5. <!--前缀-->
    6. <property name="prefix" value="/WEB-INF/jsp/"/>
    7. <!--后缀-->
    8. <property name="suffix" value=".jsp"/>
    9. </bean>

4.编写操作业务Controller

要么实现Controller接口,要么增加注解;需要返回一个ModelAndView,装数据,封视图;

  1. package cn.chen.controller;
  2. import org.springframework.web.servlet.ModelAndView;
  3. import org.springframework.web.servlet.mvc.Controller;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class HelloController implements Controller {
  7. @Override
  8. public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
  9. ModelAndView mv = new ModelAndView();
  10. // 封装对象给ModelAndView
  11. mv.addObject("msg","Hello SpringMVC");
  12. // 封装要跳转的页面
  13. mv.setViewName("test");
  14. return mv;
  15. }
  16. }

5.注册bean

把controll类交给springIOC容器

  1. <bean id="/hello" class="cn.chen.controller.HelloController"/>

运行测试:输入网址:http://localhost:8080/SpringMVC/hello

SpringMVC - 图2

注解版(精髓 重点)

1.添加依赖
  1. <dependencies>
  2. <dependency>
  3. <groupId>junit</groupId>
  4. <artifactId>junit</artifactId>
  5. <version>4.11</version>
  6. <scope>test</scope>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.springframework</groupId>
  10. <artifactId>spring-webmvc</artifactId>
  11. <version>5.3.1</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>javax.servlet</groupId>
  15. <artifactId>servlet-api</artifactId>
  16. <version>2.5</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>javax.servlet.jsp</groupId>
  20. <artifactId>jsp-api</artifactId>
  21. <version>2.1</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>javax.servlet</groupId>
  25. <artifactId>jstl</artifactId>
  26. <version>1.2</version>
  27. </dependency>

可能出现资源过滤的问题:

加入如下配置:

  1. <build>
  2. <resources>
  3. <resource>
  4. <directory>src/main/java</directory>
  5. <includes>
  6. <include>**/*.properties</include>
  7. <include>**/*.xml</include>
  8. </includes>
  9. <filtering>false</filtering>
  10. </resource>
  11. <resource>
  12. <directory>src/main/resources</directory>
  13. <includes>
  14. <include>**/*.properties</include>
  15. <include>**/*.xml</include>
  16. </includes>
  17. <filtering>false</filtering>
  18. </resource>
  19. </resources>
  20. </build>

2.配置 web.xml 注册DispatcherServlet

springmvc-servlet.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
  7. <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
  8. <context:component-scan base-package="com.chen.controller"/>
  9. <!-- 让Spring MVC不处理静态资源 -->
  10. <mvc:default-servlet-handler/>
  11. <!--
  12. 支持mvc注解驱动
  13. 在spring中一般采用@RequestMapping注解来完成映射关系
  14. 要想使@RequestMapping注解生效
  15. 必须向上下文中注册DefaultAnnotationHandlerMapping
  16. 和一个AnnotationMethodHandlerAdapter实例
  17. 这两个实例分别在类级别和方法级别处理。
  18. 而annotation-driven配置帮助我们自动完成上述两个实例的注入。
  19. -->
  20. <mvc:annotation-driven/>
  21. <!-- 视图解析器-->
  22. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
  23. <property name="prefix" value="/WEB-INF/jsp/"/>
  24. <property name="suffix" value=".jsp"/>
  25. </bean>
  26. </beans>

3.编写Controller层
  1. package com.chen.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.ui.Model;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. @Controller
  6. @RequestMapping("/Hello")
  7. public class HelloController {
  8. @RequestMapping("/h1")
  9. //真实访问地址 : 项目名/Hello/h1
  10. public String Hello(Model model){
  11. model.addAttribute("msg","Hello SpringMVC!!!");
  12. return "hello";
  13. }
  14. }

注意点:

  • @Controller是为了让Spring IOC容器初始化时自动扫描到
  • @RequestMapping是为了映射请求路径,这里因为类与方法上都有映射所以访问时应该
    是/Hello/h1;
  • 方法中声明Model类型的参数是为了把Action中的数据带到视图中
  • 方法返回的结果是视图的名称hello,加上配置文件中的前后缀变成WEB-INF/jsp/hello.jsp

4.创建视图层
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>hello</title>
  5. </head>
  6. <body>
  7. ${msg}
  8. </body>
  9. </html>

5.配置Tomcat运行项目

注意一定要检查打包之后的项目有没有导包,否则会出现404

SpringMVC - 图3

运行结果:

SpringMVC - 图4

成功!

小结:

步骤: 1.添加依赖 2.配置web.xml,注册DispatcherServlet 3.配置springmvc-servlet.xml 添加自动导包的支持 4.编写controller类 关联视图层 5.编写视图层 与controller进行对应

使用springMVC必须配置的三大件:
处理器映射器、处理器适配器视图解析器
通常,我们只需要手动配置视图解析器,而处理器映射器和处理器适配器只需要开启注解驱动即可,而省去了大段的xml配置