回顾MVC

MCV是模型(Modle)、控制器(Controller)、视图(View)的简写,是一种软件的设计规范。MVC不是设计模式,而是架构模式,它能够降低试图和业务逻辑之间的双向耦合,是将业务逻辑、数据、显示分离的方法来组织代码。
Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或 JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao)和业务层(行为Service),也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示,控制器做了调度员的工作。
Spring MVC的介绍和配置 - 图1
最典型的MVC就是jsp+servlet+javabean模式:
JavaBean作为模型,既可以作为数据模型来封装业务数据,又可以作为业务逻辑模型来包含应用的业务操作。其中,数据模型用来存储或传递业务数据,而业务逻辑模型接收到控制器传过来的模型更新请求后,执行特定的业务逻辑处理,然后返回相应的执行结果。
JSP作为视图层,负责提供页面为用户展示数据,提供相应的表单(Form)来用于用户的请求,并在适当的时候(点击按钮)向控制器发出请求来请求模型进行更新。
Serlvet作为控制器,用来接收用户提交的请求,然后获取请求中的数据,将之转换为业务模型需要的数据模型,然后调用业务模型相应的业务方法进行更新,同时根据业务执行结果来选择要返回的视图。

Spring MVC的介绍和配置 - 图2

Spring MVC介绍

Spring MVC是Spring FrameWork的一部分,是基于Java实现的轻量级Web框架,Spring MVC具有很多优点:
轻量级,简单易学;
高效 , 基于请求响应的MVC框架;
与Spring兼容性好,无缝结合;
约定优于配置;
功能强大:RESTful、数据验证、格式化、本地化、主题等;
简洁灵活;
Spring MVC天生和Spring无缝集成(使用SpringIoC和Aop) , 使用约定优于配置 ,能够进行简单的junit测试 、支持Restful风格、异常处理、本地化、国际化、数据验证、类型转换、拦截器……

Spring MVC的配置和第一个Spring MVC程序

首先需要导入Spring MVC需要的依赖:

  1. <!--spring系列-->
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-webmvc</artifactId>
  5. <version>4.3.24.RELEASE</version>
  6. </dependency>
  7. <!--servlet-->
  8. <dependency>
  9. <groupId>javax.servlet</groupId>
  10. <artifactId>javax.servlet-api</artifactId>
  11. <version>4.0.1</version>
  12. </dependency>

然后需要一个springmvc-servlet.xml配置文件来注册Spring MVC的一些核心类:

<?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">
        <!--前缀,这里说明视图层放jsp文件夹下面-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀,这里说明视图层是jsp-->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--Handler,由程序员编写的实现Controller接口的类,每次编写一个都需要注册一次-->
    <bean id="/hello" class="com.wjh.controller.HelloController"/>

</beans>

配置web.xml:

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

    <!--使用“/”: 匹配所有的请求;(不包括xxx.jsp页面,一般都是使用“/”-->
    <!--使用”/*“: 匹配所有的请求;(包括xxx.jsp页面)-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

编写Hander和视图层:

package com.wjh.controller;

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

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

/**
 * @author wjh
 * @date 2021/7/20 12:45
 * @Package com.wjh.controller
 */
public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //ModelAndView 模型和视图,做为返回值返回
        ModelAndView mv = new ModelAndView();

        //封装对象,放在ModelAndView--->Model
        mv.addObject("msg","Hello  SpringMVC!");
        //封装要跳转的视图,放在ModelAndView中--->View:/WEB-INF/jsp/hello.jsp
        mv.setViewName("hello");
        return mv;
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>
        SpringMVC
    </title>
</head>
<body>
${msg}
</body>
</html>

在浏览器访问
image.png