SpringMVC学习笔记

170 阅读3分钟

一、SpringMVC概述

1.1 WEB开发的演进

1.1.1 Model1

Model1是早期的WEB架构,JSP接受客户端请求,负责逻辑展示,少量JavaBean负责数据库访问。

缺点:JSP职责不单一,View与Controller角色混杂在一起,代码耦合度高、可复用性低

1.1.2 MVC架构

什么是MVC?

MVC是一种软件设计架构。

主要作用是——降低了视图与业务逻辑间的耦合

MVC架构:

  • Controller:负责接受客户端请求,并且转发到业务逻辑!由servlet充当
  • Model:负责具体的业务逻辑,数据库访问(行为+数据),但是现在一般将数据与行为分离开来——Servcice层 and Dao层。由JavaBean与业务类来承担
  • View:展示层。页面展示,例如jsp

优点:耦合性更低,利于组件的重用

在工程项目中,往往会对Model进行更加精细化的划分:

  • Service:业务逻辑层
  • Dao:数据库操作层

1.2 SpringMVC是什么?有什么作用?

SpringMVC是Spring中构建WEB应用的全功能MVC模块。

SpringMVC为何是主流?因为复用Spring的Ioc、Aop等技术,更加强大!

1.3 SpringMVC与Structs2的区别

相同点

  • 都是构建WEB应用的MVC框架
  • 底层都是基于Servlet

不同点

  • SpringMVC是基于方法设计的。Structs2是基于类,每次都会创建一个动作类,执行速度比SpringMVC更慢些
  • SpringMVC是Spring的一个模块,能够与Spring无缝整合(无缝融合了Ioc、Aop),体系更加强大。

二、SpringMVC原理

2.1 SpringMVC的工作流程

  1. 客户端请求发送到前端控制器(DispatcherServlet)
  2. DispatcherServlet请求处理器映射器(HandlerMappering)通过XML注解去查找对应处理器(Controller),并且返回给DispatcherServlet
  3. DispatcherServlet调用HandlerAdapter处理配适器,来调用具体的处理器(Controller)
  4. Controller调用具体业务逻辑,执行完毕之后,返回ModelAndView【程序员编程部分,设置返回的Model与View即可】
  5. 返回的ModelAndView通过DispatcherServlet传递给ViewReslover视图解析器
  6. ViewReslover视图解析器解析后返回具体的View
  7. DispatcherServlet根据View渲染视图,并且返回响应给用户!

其中需要程序员开发的仅有:ControllerView 与具体 Model(逻辑+数据)。

2.2 SpringMVC重要组件

DispatcherServlet

核心组件,整个工作流程的控制中心,相当于是一个转发器。

  • 负责客户端请求的接收,(View渲染),响应
  • Controller调用的转发
  • View解析的转发

HandlerMapping

通过XML、注解等查找对应的Controller

HandlAdapter

通过配适器模式去调用具体的Controller

ViewResolver

视图解析器,从ModelAndView中解析出具体的View

三、SpringMVC 实战

3.1 SpringMVC常用注解

3.2 SpringMVC Demo

web.xml

注册DispatcherServlet

<?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
http://xmlns.jcp.org/xml/ns/javaee "
         version="4.0">

    <!--1.注册DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
        <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>

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

</web-app>

springmvc-servlet.xml

SpringMVC配置文件

<?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">
       
    <!--处理映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--处理器配适器-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!--视图解析器:DispatcherServlet给他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
    
    <!--配置Controller-->
    <bean id="/hello" class="MyController"/>
</beans>

MyController

具体的Controller

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

/**
 * @author irvin
 * @date 2020/06/05
 */
public class MyController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
        throws Exception {
        ModelAndView modelAndView=new ModelAndView();
        //调用具体逻辑
        String res= method.invoke();
        //设置返回的model 与 view
        modelAndView.addObject("msg",res);
        modelAndView.setViewName("hello");
        return modelAndView;
    }
}

hello.jsp

前端界面