SpringMVC

谁说我不能喝 提交于 2020-01-18 04:40:31

简介

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等。

简单使用

注意:以下步骤及编写的内容不全,只为说明框架相关的步骤,内容作为参考,请勿直接CV,实际内容以自己项目中为准(例如XML的版本、Spring的版本等)

1.导入相关依赖

<!-- Spring的版本 -->
<properties>
        <spring.version>4.3.20.RELEASE</spring.version>
</properties>
<!-- SpringMVC的依赖 -->
<dependencies> 
    <dependency>
        <!-- 属于SpringFrameWork项目 -->
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <!-- 与properties中的Spring的版本一致 -->
        <version>${spring.version}</version>
    </dependency>
</dependencies>

2.配置web.xml,目的是为了让Tomcat实例化SpringMVC的入口

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


<!-- 编码处理过滤器 -->
   <filter>
      <filter-name>encodingFilter</filter-name>
      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
         <param-name>encoding</param-name>
         <param-value>utf-8</param-value>
      </init-param>
      <init-param>
         <param-name>forceEncoding</param-name>
         <param-value>true</param-value>
      </init-param>
    </filter>
    <filter-mapping>
       <filter-name>encodingFilter</filter-name>
       <url-pattern>*.do</url-pattern>
    </filter-mapping>

 <!-- 配置SpringMVC入口servlet -->
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!-- 初始化字段 使得SpringMVC可以找到配置文件 -->
            <param-name>contextConfigLocation</param-name>
            <!-- 通过classpath下的springMVC.xml文件配置SpringMVC相关配置 -->
            <param-value>classpath:springMVC.xml</param-value>
        </init-param>
        <!-- 让Tomcat在启动后就加载这个servlet -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- 配置servlet-mapping -->
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <!-- 让所有请求都先进入这个servlet -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

3.配置springMVC.xml,在SpringMVC的入口servlet加载后会通过这个配置文件内的内容进行相应配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd ">

    <!-- 开启自动包扫描,将bean交给Spring来管理 -->
    <context:component-scan base-package="com.springmvc"/>

    <!-- 将视图解析器交给Spring做管理,初始化两个字段分别为视图文件位置以及视图文件后缀名 -->
    <bean id="internalResourceViewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀,我们的视图文件应该放到/WEB-INF/views/目录下,这里我们需要在WEB-INF下面创建view文件夹 -->
        <property name="prefix" value="/WEB-INF/views/" />
        <!-- 设置后缀为.jsp -->
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- 开启SpringMVC框架对注解的支持 -->
    <mvc:annotation-driven />
</beans>

4.编写首页测试类

@Controller//标识这是一个控制器,实例对象将由Spring管理
public class IndexController {
 
    @RequestMapping("/hello")//将"/hello"这个uri映射到hello这个方法
    public String hello() {
        return "index";//最终将相应index.jsp的内容
    }
}

流程

名词解释

SpringMVC是基于组件的,以下每一个器其实就是一个组件

配置了 <mvc:annotation-driven />后,会自动加载处理器映射器HandlerMapping和处理器适配器HandlerAdapter

(1) 前端控制器DispatcherServlet
  作用:核心流程控制,接收请求,响应结果,相当于转发器,中央处理器。有了DispatcherServlet减少了其它组件之间的耦合度。
(2) 处理器映射器HandlerMapping
  作用:根据请求的url查找Handler,即根据url找到具体需要执行的那个方法。

       默认:org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
(3) 处理器适配器HandlerAdapter
  作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler。

       默认:org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
(4) 处理器Handler(需要程序员开发)
  注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
(5) 视图解析器ViewResolver。
  作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)

       默认:org.springframework.web.servlet.view.InternalResourceViewResolver
(6) 视图View(需要程序员开发jsp)。
  注意:View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)

执行流程

1.Tomcat启动时加载、实例org.springframework.web.servlet.DispatcherServlet类,并指定其中contextConfigLocation字段,使其可以找到SpringMVC相关配置的配置文件

2.DispatcherServlet对象读取springMVC.xml,并进行配置文件中指定的配置,例如将视图解析器交给Spring管理

3.用户发送请求,DispatcherServlet对象先接收到请求

4.DispatcherServlet对象请求HandlerMapping做handler映射查找handler(可以根据xml配置、注解进行查找)

5.HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象,以及多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略

6.DispatcherServlet对象请求处理器适配器HandlerAdapter执行handler

7.处理器适配器HandlerAdapter将会根据适配的结果去执行Handler

8.HandlerAdapter调用handler处理器(平常叫做controller)执行controller方法

9.handler处理器返回给HandlerAdapter一个ModelAndView对象(ModelAndView是springmvc框架的一个底层对象,包括 Model和view)

10.HandlerAdapter将ModelAndView对象返回给DispatcherServlet对象

11.DispatcherServlet对象请求ViewResolver(视图解析器)去进行视图解析 (根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可

12.ViewResolver向DispatcherServlet返回View

13.DispatcherServlet进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)

14.DispatcherServlet响应结果

参考资料:https://www.cnblogs.com/myitnews/p/11565941.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!