【SpringMVC】


SpringMVC简介

SpringMVC是Spring的一个后续产品,是Spring的一个子项目

基于原生的Servlet,通过了功能强大的DispatcherServlet,对请求和响应进行统一处理

什么是MVC

MVC是一种架构思想,将软件按照模型、视图、控制器来划分

M:Modedl,模型层,指工程中的JavaBean,作用是处理数据

JavaBean分为两类:

· 一类是实体类Bean,专门存储业务数据

· 一类是业务处理Bean,指Service和Dao对象,专门处理业务逻辑和数据库访问

V:View,视图层,指工程中的html和jsp页面,作用是与用户交互,展示数据

C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器

MVC的工作流程

用户通过视图层发送数据请求到服务器,在服务器中请求被Controller接收,Controller调用Model层处理请求,处理完毕将结果返回给Controller,Controller再根据请求处理的结果找到相应的View视图层,对数据进行渲染相应给浏览器。

开发环境

IDE:idea 2019.2

构建工具:maven3.5.4

服务器:tomcat7

Spring版本:5.3.1

创建Maven工程

①添加web模块

②设置打包方式为war

war

③引入依赖

    
        
        
            org.springframework
            spring-webmvc
            5.3.1
        

        
        
            ch.qos.logback
            logback-classic
            1.2.3
        

        
        
            javax.servlet
            javax.servlet-api
            3.1.0
            provided
        

        
        
            org.thymeleaf
            thymeleaf-spring5
            3.0.12.RELEASE
        
    

导入依赖时会同时导入依赖所需要的依赖,如导入spring-webmvc时就导入了Spring所需的aop、beans、context等

scope provided /scope 标签表示服务器已经提供了该依赖,打包时不必再注入

配置web.xml

默认请求方式

    
        SpringMVC
        org.springframework.web.servlet.DispatcherServlet
    
    
        SpringMVC
        /
    

对名为SpringMVC的servlet进行注册,servlet和servlet-mapping的servlet-name的名称必须相同

匹配路径设置为SpringMVC的核心控制器能够处理的请求的请求路径

/表示除了.jsp之外的请求,可以匹配如/login、.html、css方式的请求路径,/*则表示包括.jsp的所有请求

为什么不能匹配jsp?

jsp被认为是一种特殊的servlet,需要服务器指定的servlet进行处理,因此.jsp结尾的请求路径不需要DispatcherServlet处理,否则SpringMVC将.jsp请求当做普通请求处理而不会找到相应的jsp页面

扩展配置方式

Maven要求配置文件都要在resource下,因此通过init-param(初始化前端控制器属性)设置SpringMVC配置文件(contextConfigLocation,上下文配置路径)的位置(value,对应resource的类路径)和名称(name),通过load-on-startup标签设置前端控制器DispatcherServlet的启动时间为服务器启动时(Servlet生命周期默认为第一次访问时才启动)


    
        SpringMVC
        org.springframework.web.servlet.DispatcherServlet
        
        
            contextConfigLocation
            classpath:SpringMVC.xml
        

        1
    

创建SpringMVC.xml配置文件

开启注解扫描

@Controller
public class HelloController {

}

这样控制器就能被IOC识别并注入

配置Thymeleaf视图解析器

    
        
        
        
            
                
                    

                        
                        

                        
                        
                        
                        
                    
                
            
        
    

Order设置视图解析器的优先级

templateEngine为当前模板,其内部Bean表示的是当前解析视图的一种策略。视图名称加上视图前缀和视图后缀就可以得到要跳转的页面。

每当页面发生跳转的时候,视图名称符合当前条件,就会被视图解析器解析,得到相应的页面

对控制器设置请求映射注解 @RequestMapping

将当前的请求和控制器方法创建映射关系,不仅可以通过请求路径,而且可以通过请求方式、请求参数、请求报文等进行匹配

@Controller
public class HelloController {
    @RequestMapping("/")
    public String getIndex() {
        return "index";
    }
}

这里省略了value="/"

WEB-INFO下的页面浏览器是不能够访问的,也不能够通过重定向只能通过转发的方式

不允许多个控制器对同一个上下文地址进行映射

由于引入的日志依赖,控制台输出的日志信息:

13:53:35.733 [http-nio-8080-exec-1] DEBUG org.thymeleaf.TemplateEngine - [THYMELEAF] TEMPLATE ENGINE INITIALIZED
13:53:35.858 [http-nio-8080-exec-1] DEBUG org.springframework.web.servlet.DispatcherServlet - Completed 200 OK
13:53:36.105 [http-nio-8080-exec-4] DEBUG org.springframework.web.servlet.DispatcherServlet - GET "/springMVC/", parameters={}
13:53:36.106 [http-nio-8080-exec-4] DEBUG org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped to com.hikaru.mvc.controller.HelloController#getIndex()
13:53:36.111 [http-nio-8080-exec-4] DEBUG org.springframework.web.servlet.DispatcherServlet - Completed 200 OK

可以看到

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped to com.hikaru.mvc.controller.HelloController#getIndex()

这里发生的映射关系:访问请求Mapped to控制器方法,且与注解表示的方法有关而与方法名无关

通过thymeleaf视图解析器访问指定的页面th:href="@{/target}"th:href="@{/target}"th:href="@{/target}"




    
    Title


首页

target.html

thymeleaf会解析a标签的上下文路径(或者使用 /springMVC/target作为上下文路径 ,但是上下文可以修改耦合性不好,否则普通超链接地址只有浏览器或服务器解析的绝对路径),将请求发送给控制器,经请求映射的控制器方法得到返回值后再加上视图前缀和视图后缀,返回完整的页面地址

@Controller
public class HelloController {
    @RequestMapping("/")
    public String getIndex() {
        return "index";
    }

    @RequestMapping("/target")
    public String toTarget() {
        return "target";
    }
}

总结

浏览器发送请求,若请求符合前段控制器的url-pattern,该请求就会被前端控制器DispatcherServlet处理,前端控制器会读取SpringMVC核心配置文件(resource中的SpringMVC.xml)通过扫描组件找到控制器,将请求地址和控制器方法的@RequestMapping的value值进行匹配,如果匹配成功则说明该控制器方法是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上视图前缀、后缀组成视图的路径,通过ThymeLeaf对视图进行渲染,最终转发到视图对应的页面。