SpringMVC-基础

SpringMVC基础

1. MVC

MVC : 模型(Dao, Service) 视图(jsp) 控制器(Servlet)

MVC框架要做哪些事情

  1. 将url映射到java类或java类的方法 .
  2. 封装用户提交的数据 .
  3. 处理请求--调用相关的业务处理--封装响应数据 .
  4. 将响应的数据进行渲染 . jsp / html 等表示层数据 .

职责分析:

  • Controller:控制器
  1. 取得表单数据
  2. 调用业务逻辑
  3. 转向指定的页面
  • Model:模型
  1. 业务逻辑
  2. 保存数据的状态
  • View:视图
  1. 显示页面

2. SpringMVC

1. Spring MVC的特点

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

2. SpringMVC执行流程的分析

1. 图解

img

2. 简单表述

  1. 用户发送请求至前端控制器DispatcherServlet
  2. DispatcherServlet收到请求调用处理器映射器HandlerMapping。
  3. 处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherSevlet
  4. DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
  5. 执行处理器Handler(Controller,也叫页面控制器)。
  6. Handler执行完成返回ModelAndView
  7. HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器
  9. ViewReslover解析后返回具体View
  10. DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
  11. DispatcherServlet响应用户。

3. 组件说明

  1. DispatcherServlet:前端控制器。用户请求到达前端控制器,它就相当于mvc模式中的CDispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性,系统扩展性提高。由框架实现
  2. HandlerMapping:处理器映射器。HandlerMapping负责根据用户请求的url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,根据一定的规则去查找,例如:xml配置方式,实现接口方式,注解方式等。由框架实现
  3. Handler:处理器。Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
  4. HandlAdapter:处理器适配器。通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。由框架实现。
  5. ModelAndView是springmvc的封装对象,将model和view封装在一起。
  6. ViewResolver:视图解析器。ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
  7. View: 是springmvc的封装对象,是一个接口, springmvc框架提供了很多的View视图类型,包括:jspview,pdfview,jstlView、freemarkerView、pdfView等。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

4. 结合代码说明

  1. 在web.xml中先配置DispatcherServlet, 并绑定Spring的配置文件

    <?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">
    
        <!--配置DispatcherServlet: 这个是SpringMVC的核心: 请求分发器(前端控制器)-->
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--DispatcherServlet要绑定Spring的配置文件!-->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc-servlet.xml</param-value>
            </init-param>
            <!--启动级别: 1-->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <!--
        在SpringMVC中,    /   和   /*
        /: 不会匹配jsp页面
        /*: 匹配所有的请求, 包括jsp页面 ==> 之后要配置后缀为.jsp, 如果匹配jsp的话会在jsp中跳转jsp而出错(继续走DispatcherServlet),
        jsp页面应该是完整的返回给用户的页面!
        -->
        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    </web-app>
    
  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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!--处理器映射器(HandlerMapper)-->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
        <!--处理器适配器(HandlerAdapter)-->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
        <!--视图解析器(ViewResolver)-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
            <!--前缀-->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!--后缀-->
            <property name="suffix" value=".jsp"/>
        </bean>
    
    </beans>
    
  3. 配置完成后, 写执行处理器即Controller中的业务代码

    注意, Controller中操作的对象为ModelAndView

    package com.wang.controller;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class TestController implements Controller {
        @Override
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
    
            ModelAndView modelAndView = new ModelAndView();
    
            //业务代码
            String result = "测试SpringMVC!";
            modelAndView.addObject("msg", result);
    
            //视图跳转
            modelAndView.setViewName("test");
    
            return modelAndView;
        }
    }
    
  4. 最后, 通过DispatcherServlet响应给用户, 这里由于处理映射器采用BeanName的方式, 要加上url的bean id以及其对应的Controller

    <?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">
    
        <!--处理器映射器(HandlerMapper)-->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
        <!--处理器适配器(HandlerAdapter)-->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
        <!--视图解析器(ViewResolver)-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
            <!--前缀-->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!--后缀-->
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <!--BeanNameUrlHandlerMapping: 根据bean的名字转发, 因此要配置bean的名字!-->
        <bean id="/test" class="com.wang.controller.TestController"/>
    
    </beans>
    

3. 使用注解开发SpringMVC

1. 将包导入项目结构中

选择项目结构, 在Artifact中的对应的项目下新建lib目录, 导入所有的包!

2. 配置webxml文件

<?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">

    <!--配置DispatcherServlet: 这个是SpringMVC的核心: 请求分发器(前端控制器)-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--DispatcherServlet要绑定Spring的配置文件!-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--启动级别: 1-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--
    在SpringMVC中,    /   和   /*
    /: 不会匹配jsp页面
    /*: 匹配所有的请求, 包括jsp页面 ==> 之后要配置后缀为.jsp, 如果匹配jsp的话会在jsp中跳转jsp而出错(继续走DispatcherServlet),
    jsp页面应该是完整的返回给用户的页面!
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

3. 配置springmvc-servlet.xml

<?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: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
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--自动扫描包, 让指定包下的注解生效, 由IOC容器统一管理-->
    <context:component-scan base-package="com.wang.controller"/>
    
    <!--让SpringMVC不处理静态资源-->
    <mvc:default-servlet-handler/>
    
    <!--
    支持MVC注解驱动
        在Spring中一般使用@RequestMapping注解来完成映射关系
        想要使@RequestMapping注解生效
        必须向上下文中注册DefaultAnnotationHandlerMapping
        和一个AnnotationMethodHandlerAdapter实例
        这两个实例分别在类级别和方法级别处理
        而annotation-driven配置帮助我们自动完成上述两个实例的注入
    -->
    <mvc:annotation-driven/>

    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

4. 编写controller中的业务代码

  • 类上写@Controller
  • 方法上写@RequestMapping("跳转的地址"), 并向方法传入model
package com.wang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
//在类上写, 与方法有父子关系
//@RequestMapping("/HelloController")
public class HelloController {

    //真实访问地址: 项目名/HelloController/hello(此处为类上加了Mapping)
    @RequestMapping("hello")
    public String hello(Model model) {
        //封装数据, 向模型中添加属性msg与值, 可以在JSP页面中取出并渲染
        model.addAttribute("msg", "Hello, SpringMVCAnnotation!");
        //WEB-INF/jsp/hello.jsp
        return "hello";     //会被视图解析器处理
    }

}

5. 前端JSP

<%--
  Created by IntelliJ IDEA.
  User: Wang
  Date: 2020/9/8
  Time: 11:32
  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>

<h1>${msg}</h1>

</body>
</html>

6. 总结

使用SpringMVC必须配置的三大件:

  • 处理器映射器
  • 处理器适配器
  • 视图解析器

在使用注解开发中, 我们通常只需要手动配置视图解析器InternalResourceViewResolver, 而处理器映射器和处理器适配器只需要开启注解驱动即可mvc:annotation-driven

原文地址:https://www.cnblogs.com/wang-sky/p/13632160.html