跳转至

MVC架构模式#

约 555 个字 6 行代码 预计阅读时间 11 分钟

不使用MVC模式存在的问题#

  • 不使用MVC模式,Servlet需要负责数据接收核心业务逻辑处理数据库连接和增删改查操作页面展示等功能。职责过重。
  • 代码的复用性差,相同的业务操作或数据库操作,需要在不同Servlet中编写重复代码,不方便维护。
  • 代码耦合度高,导致代码很难扩展。
  • 操作数据库的代码和处理业务逻辑的代码混杂在一起,很容易出错,无法专注于业务逻辑的编写。

MVC模式概述#

  • M(Model、模型):用于处理业务
  • V(View、视图):负责页面展示
  • C(Controller、控制器):控制器是MVC架构的核心,
MVC架构图解
MVC请求响应过程

DAO(Data Access Object、数据访问对象)

属于JavaEE的设计模式之一。只负责数据库的增删改查,没有任何业务逻辑在里面

三层架构#

  • 表示层:Controller控制器+View视图
  • 业务逻辑层:Service服务
  • 持久化层:DAO数据访问对象

Spring MVC概述#

Spring MVCSpring Framework框架的子模块

Spring MVC是实现MVC架构模式的Web框架。底层使用Servlet实现。

Spring MVC能干什么

  • 入口控制:通过DispatcherServlet作为入口控制器负责接收请求和分发请求。
  • 自动将表单请求参数封装为JavaBean对象
  • 统一使用IOC容器管理对象
  • 统一请求处理:提供拦截器、统一异常处理等机制
  • 视图解析:轻松切换JSP、Freemarker、Velocity等视图模板
  • 对Controller进行单元测试时,不依赖Tomcat Web服务器

Spring MVC入门案例#

创建maven工程,将工程改为war包,引入依赖:

XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.luguosong</groupId>
    <artifactId>springmvc-hello</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>6.1.8</version>
        </dependency>
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>6.0.0</version>
            <!--provided表示该依赖只在编译和测试时有效-->
            <!--打war包时不会包含,由Tomcat提供-->
            <scope>provided</scope>
        </dependency>
        <!--日志-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.5.3</version>
        </dependency>
        <!--thymeleaf与spring6整合-->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring6</artifactId>
            <version>3.1.2.RELEASE</version>
        </dependency>

    </dependencies>

</project>

在web.xml中配置前端控制器(DispatcherServlet):

XML
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
         version="6.0">
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--url-pattern配置/表示处理除jsp外的所有请求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

在Spring MVC配置文件配置包扫描视图解析器:

其中常见的视图解析器有以下几种:

  • JSP的视图解析器:InternalResourceViewResolver
  • FreeMarker的视图解析器:FreeMarkerViewResolver
  • Velocity的视图解析器:VelocityViewResolver
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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--配置组件扫描-->
    <context:component-scan base-package="com.luguosong.controller"/>

    <!--配置视图解析器-->
    <bean id="thymeleafViewResolver" class="org.thymeleaf.spring6.view.ThymeleafViewResolver">
        <property name="characterEncoding" value="UTF-8"/>
        <property name="order" value="1"/>
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring6.SpringTemplateEngine">
                <property name="templateResolver">
                    <bean class="org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver">
                        <property name="prefix" value="/WEB-INF/template/"/>
                        <property name="suffix" value=".thymeleaf"/>
                        <property name="templateMode" value="HTML"/>
                        <property name="characterEncoding" value="UTF-8"/>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>
</beans>

编写视图:

hello.thymeleaf
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
hello Spring MVC
</body>
</html>

编写Controller:

Java
package com.luguosong.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

/**
 * @author luguosong
 */
@Controller
public class HelloController {
    //请求映射
    @RequestMapping("/hello-mvc")
    public String hello() {
        //返回逻辑视图名称
        return "hello";
    }
}

启动Tomcat,通过以下地址可以访问视图:

Text Only
http://localhost:8080/springmvc_hello_war_exploded/hello-mvc

Spring MVC执行流程#

Spring MVC执行流程

评论