1.SprIngMVC简介

1.为什么要学SprIng MVC?

  • 轻量级,简单易学
  • 高效,基于请求响应的MVC框架
  • 与Spring兼容性好,无缝结合
  • 约定大于配置
  • 功能强大:Restful,数据验证,格式化,本地化,主题等
  • 简介灵活

2.SpringMVC执行原理

1.MVC执行原理:

1.用户发送一个请求,

2.控制器接收一个请求,这里控制器的作用就是,接收请求,调用业务类,派发页面

3.控制器将请求交给模型层去处理,模型层就是dao,service,entity

4.控制器返回一个处理的结果给控制器。

5.控制器视图渲染给视图层。

6.在响应给用户。

springboot中的mvc工作原理流程图_MVC

2.Spring和SpringMvc的关系:

SpringMVC是一个MVC的开源框架,SpringMVC是Spring的一个后续产品,其实就是Spring在原有基础上,又提供了web应用的MVC模块,可以简单的把SpringMVC理解为是spring的一个模块(类似AOP,IOC这样的模块),网络上经常会说SpringMVC和Spring无缝集成,其实SpringMVC就是Spring的一个子模块,所以根本不需要同spring进行整合。

3.SpringMVC中的组件:

前端控制器(DispatcherServlet):接收请求,响应结果,相当于电脑的CPU。

处理器映射器(HandlerMapping):根据URL去查找处理器

处理器(Handler):(需要程序员去写代码处理逻辑的)

处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,类比笔记本的适配器(适配器模式的应用)

视图解析器(ViewResovler):进行视图解析,多返回的字符串,进行处理,可以解析成对应的页面

4.SpringMvc底层原理

springboot中的mvc工作原理流程图_springmvc_02

Springmvc核心三要素:

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

准备工作:

需要导入的包

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>


        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.4.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

    </dependencies>

1.配置web.xml

<!--注册一个DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--关联一个spring mvc的配置文件,springmvc-servlet.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--设置启动级别-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!--/是匹配所有的请求,不包括.jsp.
    /*是匹配所有的请求包括.jsp
    -->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

这里是/,它不会包含.jsp

如果是/*它会包含.jsp页面,会无限了包含.jsp.jsp最后在过滤中会出现死循环。

1 和服务器一起启动。

2.配置springmvc-servlet.xml

<!--配置一个处理器映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>

   <!--配置一个处理器适配器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>

    <!--配置一个视图解析器,DispatcherServlet给它的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--配置前缀和后缀-->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
     </bean>


    <bean id="/hello" class="com.kuang.controller.HelloController"></bean>

注意这里的的前缀和后缀的配置中,后面的jsp/的后面杠不能丢。

这个表示在我们请求时,只用写一个hello就可以了,它自动配置为/WEB-INF/jsp/hello.jsp

BeanNameUrlHandlerMapping这个映射器就是专门来映射bean id=“/hello”的。还有很多映射器

3.配置HelloController

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 HelloController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
       //新建一个模型和视图
        ModelAndView mv = new ModelAndView();
        //封装对象,放在模型和视图中
        mv.addObject("msg","helloSpringmvc");

        //封装要跳转的视图,防止ModelAndView中。访问的地址就是/WEB-INF/jsp/hello.jsp
        mv.setViewName("hello");


        return mv;
    }
}

这里的Controller是导入的spring的接口包。不是其他的Controller注解

这里主要是给它哦那个模型和视图,给一个对象消息和访问的地址,最后返回就可以。

4.在/WEB-INF/jsp/下建立一个hello.jsp。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>消息</title>
</head>
<body>
${msg}

</body>
</html>

当用户请求/hello时,就可以看到在页面上的hellospringmvc消息。

执行流程:

1.先进入web.xml,找到DispatcherServlet,找到对象的配置文件,springmvc-servlet.xml

2.在springmvc-servlet.xml中,我们找到其处理器映射器,获取一个handler对象,返回。在找到一个处理器适配器HandlerAdapter,执行handler,在控制中执行,返回一个modelandview对象。

3.将MV对象交给视图层解析器去解析,返回一个解析后视图逻辑。这里就是解析前缀和后缀,并将其和hello进行拼接,找到在WEB-INF/jsp/hello.jsp文件,

4.HelloController只负责把消息丢进去,在指定的文件名上发送就可以了,最后返回一个ModerAndView对象给视图层。即第三步。

可能遇到的错误:

如果启动过程中发现有404错误,

  • 先看文件的地址有没有写对,value="/WEB-INF/jsp/"这里一个斜杠都不能少。
  • 在idea中找到project Structure->点击artifacts—>找到对应的war包----点击----看看WEB-INF中有没有出现lib,没有就自己建一个lib,----点击+号,library files—>全选包,然后导入apply应用一下即可。在重启之后就会成功。