JavaEE企业级应用开发教程——第十章 初识Spring MVC框架(黑马程序员第二版)(SSM)

news2025/1/10 10:38:16

第十章 初识Spring MVC框架

JSP Model2架构模型是一种将页面显示、流程控制和业务逻辑分离的Web应用程序架构模型,采用JSP、Servlet和JavaBean技术实现。但是,它将通用逻辑以硬编码的方式实现,每次开发新的Web应用程序时都需要重新编写Servlet控制器的URL分析代码以及流程控制等Web层通用逻辑代码。为了解决这个问题,一些基于JSP Model2架构模型的Web MVC应用框架应运而生。


10.1 Spring MVC介绍

10.1.1 Spring MVC 概述

在Java EE开发中,通常采用三层架构模型,包括表现层业务层持久层。表现层负责接收客户端的请求并向客户端响应结果,业务层负责业务逻辑处理与项目需求相关,持久层负责与数据库交互,对数据库的数据进行增删改查。

Spring MVC是一种基于Servlet API构建的Web框架,是Spring框架的一个模块,通常被称为SpringMVC。它提供了对MVC模式的全面支持,可以将表现层进行解耦,简化了表现层的实现。Spring MVC是一个请求驱动的框架,用于接收客户端的请求并进行响应,作用于三层架构中的表现层

在三层架构中,Spring MVC的位置如图所示。它包含了控制器和视图,控制器接收客户端的请求后对请求数据进行解析和封装,接着将请求交给业务层处理。业务层会对请求进行处理,最后将处理结果返回给表现层。表现层接收到业务层的处理结果后,再由视图对处理结果进行渲染,渲染完成后响应给客户端。这样,Spring MVC框架可以将表现层、业务层和持久层分别负责不同的任务,使得Web应用程序的开发更加高效和可维护。在这里插入图片描述


10.1.2 Spring MVC特点

Spring MVC能够成为当前主流的MVC框架之一,主要得益于以下几个特点:

  1. SpringMVC是Spring框架的后续产品,可以方便地使用Spring框架所提供的其他功能。

  2. SpringMVC使用简单,很容易设计出干净简洁的Web层。

  3. SpringMVC支持各种请求资源的映射策略。

  4. SpringMVC具有非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API。

  5. SpringMVC支持国际化,可以根据用户区域显示多国语言。

  6. SpringMVC支持多种视图技术,支持JSP、Velocity和FreeMarker等视图技术。

  7. SpringMVC灵活性强,易扩展。

除了上述特点外,Spring MVC还具有以下优势:

  • 易于集成其他框架,如Spring Security、Spring Boot等。
  • 支持AOP功能,可以方便地实现事务管理、日志记录等横向切面的功能。
  • 提供拦截器机制,可以在请求处理前或处理后进行拦截器的处理,实现一些通用的业务逻辑,如权限验证、日志记录等。
  • 提供全局异常处理机制,可以方便地处理各种异常,避免因异常导致应用程序崩溃。
  • 提供可定制的选项,如配置文件的加载位置、视图解析器的选择、异常处理方式等,可以根据实际需求进行灵活配置。
  • 易于使用的RESTful支持,可以通过注解的方式实现,使得开发人员可以更加方便地实现RESTful风格的API。
  • 提供Mock对象和测试框架,使得开发人员可以方便地对控制器层进行单元测试和集成测试。

综上所述,Spring MVC框架的易用性、可扩展性、灵活性和可定制性,使其成为当前主流的Web框架之一。


10.2 Spring MVC入门程序

1. 创建项目

①创建maven项目
②添加web模块
在这里插入图片描述

③添加web.xml
在这里插入图片描述

④设置web资源目录
在这里插入图片描述

在这里插入图片描述


2. 引入Maven依赖

<?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.itheima</groupId> <!-- 项目所属的组织ID -->
    <artifactId>chapter10</artifactId> <!-- 项目的名称 -->
    <version>1.0-SNAPSHOT</version> <!-- 版本号 -->
    <packaging>war</packaging> <!-- 打包方式 -->
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 源文件编码 -->
        <maven.compiler.source>1.8</maven.compiler.source> <!-- 源码编译版本 -->
        <maven.compiler.target>1.8</maven.compiler.target> <!-- 目标字节码版本 -->
    </properties>
    
    <dependencies>
        <!-- Spring 核心包的依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>

        <!-- Spring MVC 的依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>

        <!-- Servlet 的依赖 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- JSP 的依赖 -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <!-- Tomcat 插件的配置 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>8080</port> <!-- Tomcat 端口号 -->
                    <path>/chapter10</path> <!-- 应用访问路径 -->
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

3. 配置前端控制器

在使用 Spring MVC 框架时,前端控制器是一个必不可少的组件,它负责拦截客户端的请求,并进行转发到相应的处理器(Controller)进行处理。

Spring MVC 的前端控制器实际上就是一个 Servlet,因此我们可以在项目的 web.xml 文件中进行配置。具体来说,我们需要在 web.xml 文件中定义一个 Servlet,将其映射到指定的 URL 地址,并设置相关的初始化参数,比如 Spring MVC 配置文件的位置等。

这样,在客户端发起请求时,Servlet 容器会将请求转发给前端控制器,由前端控制器进行处理,并根据配置将请求转发给相应的处理器进行后续的逻辑处理。

需要注意的是,虽然在 web.xml 文件中进行配置是一种常见的方式,但也可以使用其他方式,比如使用 Java 配置或注解的方式来配置前端控制器。

  • web.xml示例
<?xml version="1.0" encoding="UTF-8"?>
<!-- 定义 Web 应用的部署描述文件,使用 JavaEE 标准的 XML 格式 -->
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
         
    <!-- 配置 Spring MVC 的前端控制器 -->
    <servlet>
        <!-- 定义 Servlet 的名称 -->
        <servlet-name>DispatcherServlet</servlet-name>
        <!-- 定义 Servlet 的实现类 -->
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置初始化参数,用于读取 Spring MVC 的配置文件 -->
        <init-param>
            <!-- 指定初始化参数的名称 -->
            <param-name>contextConfigLocation</param-name>
            <!-- 指定初始化参数的值,即 Spring MVC 配置文件的位置 -->
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!-- 应用加载时创建 Servlet 实例 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <!-- 配置 Servlet 的映射 -->
    <servlet-mapping>
        <!-- 指定 Servlet 的名称,必须与上面定义的名称一致 -->
        <servlet-name>DispatcherServlet</servlet-name>
        <!-- 指定 Servlet 处理的 URL 映射,这里表示处理所有的请求 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
</web-app>

4. 配置处理器映射信息和视图解析器

在项目的resources文件夹下创建 Spring MVC 的配置文件spring-mvc.xml,用于配置处理器射信息和视图解析器:

<?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.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
       
    <!-- 配置 Spring MVC 要扫描的包 -->
    <context:component-scan base-package="com.itheima.controller" />
    
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/" /> <!-- JSP 文件的路径前缀 -->
        <property name="suffix" value=".jsp" /> <!-- JSP 文件的后缀 -->
    </bean>
    
</beans>
  • beans 标签是 Spring 配置文件的根元素,用于包含所有的配置信息。
  • context:component-scan 标签用于配置 Spring MVC 要扫描的包,该配置指定了要扫描的包的基础路径为 “com.itheima.controller”,表示该路径下的所有类都会被 Spring MVC 扫描并注册为控制器。
  • InternalResourceViewResolver 是 Spring MVC 的一个视图解析器,用于将逻辑视图名解析为物理视图名(即 JSP 文件的路径)。在该配置中,通过 bean 标签定义了一个名为 “InternalResourceViewResolver” 的视图解析器,其实现类为 “org.springframework.web.servlet.view.InternalResourceViewResolver”。该视图解析器的 prefix 属性被设置为 “/WEB-INF/pages/”,表示 JSP 文件的路径前缀为 “/WEB-INF/pages/”,suffix 属性被设置为 “.jsp”,表示 JSP 文件的后缀为 “.jsp”。

5. 创建处理器

在项目的 src/main/java 目录下创建一个路径为 com.itheima.controller 的包。在包中创建处理器 FirstController类,用于处理客户端的请求并指定响应时转跳的页面。

package com.itheima.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

// 设置当前类为处理器类
@Controller
public class FirstController {

    // 设定当前方法的访问映射地址
    @RequestMapping("/firstController")
    // 设置当前方法返回值类型为 String,用于指定请求完成后跳转的页面
    public String sayHello() {
        System.out.println("访问到 FirstController!");
        // 设定具体跳转的页面
        return "success";
    }
}
  • Controller 注解用于将当前类标识为 Spring MVC 的控制器类。
  • RequestMapping 注解用于将 HTTP 请求映射到处理器类或处理器方法上。
  • FirstController 类中的 sayHello() 方法使用 RequestMapping 注解将 HTTP 请求映射到 “/firstController” 路径,当客户端访问该路径时,该方法会被调用。
  • sayHello() 方法返回一个字符串 “success”,该字符串将被解析为一个视图名,Spring MVC 会将其解析为一个 JSP 文件的路径。在本例中,因为在配置文件中已经设置了视图解析器的前缀和后缀,所以最终返回的视图路径为 “/WEB-INF/pages/success.jsp”。

6. 创建视图(View)页面

在项目的WEB-INF文件夹下创建名称为 pages 的文件夹并在 pages 文件夹下创建名称为 success 的JSP文件,用于对客户端请求进行处理后的视图进行展示。

<html>
<head>
    <title>Spring MVC FirstController!</title>
</head>
<body>
    <h2>Spring MVC FirstController!</h2>
</body>
</html>

该 JSP 文件使用 HTML 标签和文本来展示处理客户端请求后的视图。在本例中,该 JSP 文件会被视图解析器解析为 “/WEB-INF/pages/success.jsp”,并由 Spring MVC 返回给客户端。


7.启动项目并测试应用

配好tomcat,启动。
在这里插入图片描述

在浏览器访问:http://localhost:8080/chapter10/firstController
在这里插入图片描述


10.3 Spring MVC工作原理

Spring MVC 的三大组件分别是:

  • HandlerMapping(处理器映射器):负责根据客户端请求的 URL 找到对应的处理器 Handler。它可以理解为一个 Map<URL, Handler>,根据不同的映射方式提供不同的映射器实现。

  • HandlerAdapter(处理器适配器):根据 HandlerMapping 找到的 Handler 信息,去执行相关的 Handler 的业务逻辑。由于不同的处理器映射器映射出来的 Handler 对象是不一样的,因此不同的映射由不同的适配器来负责解析。

  • ViewResolver(视图解析器):进行视图解析时,首先将逻辑视图名解析成物理视图名,即具体的页面地址,再生成 View 视图对象返回。ViewResolver 的作用是根据视图逻辑名找到对应的视图对象,用于最终将数据渲染到页面上。
    在这里插入图片描述


  1. 用户通过浏览器向服务器发送请求,请求会被 Spring MVC 的前端控制器 DispatcherServlet 拦截。

  2. DispatcherServlet 拦截到请求后,会调用处理器映射器 HandlerMapping

  3. 处理器映射器根据请求 URL 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)并返回给 DispatcherServlet

  4. DispatcherServlet 会通过返回信息选择合适的处理器适配器 HandlerAdapter

  5. HandlerAdapter 会调用并执行处理器(也就是 Controller 类),完成业务逻辑处理。

  6. Controller 执行完成后,会返回一个 ModelAndView 对象,该对象中会包含视图名或包含模型和视图名。

  7. HandlerAdapterModelAndView 对象返回给 DispatcherServlet

  8. 前端控制器请求视图解析器 ViewResolver 根据逻辑视图名解析真正的视图。

  9. ViewResolver 解析后,会向 DispatcherServlet 中返回具体的视图 View 对象。

  10. DispatcherServletView 进行渲染,即将模型数据填充至视图中。

  11. 前端控制器向用户响应结果。

在上述执行过程中,DispatcherServletHandlerMappingHandlerAdapterViewResolver 对象的工作是框架内部执行的,开发人员只需要配置前端控制器 DispatcherServlet 完成 Controller 中的业务处理并在视图中展示相应信息即可。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/425845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis注解开发---实现增删查改和动态SQL

目录 1. 环境搭建 &#xff08;1&#xff09;创建持久层接口&#xff0c;并在接口方法上定义Sql语句 &#xff08;2&#xff09;测试方法 &#xff08;3&#xff09;运行结果 2. 注解实现增删查改 &#xff08;1&#xff09;增加用户 &#xff08;2&#xff09;删除用…

【4.17】贪心算法入门

什么是贪心&#xff1f; 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 刷题或者面试的时候&#xff0c;手动模拟一下感觉可以局部最优推出整体最优&#xff0c;而且想不到反例&#xff0c;那么就试一试贪心。 贪心的解题步骤&#xff1f; 贪心算法一…

《人体地图》笔记

《人体地图》 坂井建雄 著 孙浩 译 腹部通向大腿的隧道 腹部与大腿的分界点是大腿根部&#xff0c;即是腹股沟。 腹壁肌肉连结在腹股沟韧带上&#xff0c;腹壁肌肉包括三层&#xff0c;分别为腹外斜肌、腹内斜肌和腹横肌&#xff0c;每块肌肉都有一个张开的小孔&#xff0c;…

【靶场设计和渗透】

目录 一、前言 二、靶场设计 1、局域网 2、说明 三、渗透测试 1、信息收集 2、漏洞利用 四、后渗透利用 1、提权 2、权限维持 一、前言 为了深入贯彻学习网络安全法律法规&#xff0c;深入学习渗透测试知识&#xff0c;强化实战技能............ 编不出来了&#xff…

The Sandbox 的 OliveX Fitness 之城来啦!

4 月 11 日至 17 日&#xff0c;亲自来体验一下吧&#xff01; 这种独特的体验将有趣和故事驱动的游戏与健身以及奖励结合起来。玩家可以探索隐藏的角落&#xff0c;逃出迷宫&#xff0c;爬上梯子&#xff0c;清除障碍&#xff0c;完成相互关联的任务&#xff0c;所以战略规划是…

Avue dynamic表单实现form单选,修改及新增项

Avue dynamic表单实现form单选&#xff0c;修改及新增项 AvueDialogFormTableViewOption.js /** Description:银行账号* Version: 1.0* Autor: Tj* Date: 2023-03-21 11:02:42*/ export const BankAccountOption (vueObj, formData) > {return {labelWidth: 100, //整体列…

【华为OD机试】1046 - 计算字符串的编辑距离

文章目录一、题目&#x1f538;题目描述&#x1f538;输入输出&#x1f538;样例1二、思路解析三、代码参考作者&#xff1a;KJ.JK&#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f…

GDPU C语言 天码行空8

1. 求序列和 ⭐ 输出没有小数的浮点数 #include <stdio.h>double fun(int a, int n) {double res 0;int aa a,i;//aa 记录每一项for(i 1; i < n; i){res aa;aa aa * 10 a;}return res; }int main(){int a,n;scanf("%d %d", &a,&n);printf(&q…

Linux学习笔记——HTTPS协议

文章目录HTTPS是什么什么是加密为什么要进行加密常见的加密方式数据摘要与数据指纹数字签名HTTPS的工作过程探究方案1—只使对称加密方案2—只使非对称加密方案3—双方都是用非对称加密方案4—非对称加密对称加密中间人攻击证书方案5—非对称加密对称加密证书认证HTTPS是什么 H…

hypack单波束采集和处理基本流程

前两天有个读者问是否有单波束测深的操作和处理的步骤&#xff0c;在xiaok海洋测绘网上用关键字“单波束”搜索的结果就是确实没有相关的文章&#xff0c;相关的文章都是外业过程记录。下面以单波束XX&#xff08;可以是任何单波束&#xff09;和采集处理软件Hypack为例说明单波…

树莓派通过网线连接笔记本实现笔记本电脑Wifi的网络共享

基于windows电脑连接树莓派进行设置&#xff1a;通过通过一根网线&#xff0c;连接树莓派和电脑&#xff0c;使电脑和树莓派构成一个局域网&#xff0c;然后树莓派接收来自笔记本电脑wifi网络的共享网络。操作方法类似台式机通过网线共享笔记本电脑无线网络的步骤 1、 保证笔记…

[c++整人代码]超级加倍,让人承认自己是大傻猪

㊀程序介绍 这是本人看到的一个整人小病毒&#xff0c;唯一的杀伤力就是逼着你想坑的人承认他是猪。 本次更新&#xff1a;要求运行程序的人手动输入“我是猪”三个字 ㊁程序截图 1 本程序的窗口会自动保持最前 2 无法关闭本窗口 ㊂代码展示&#xff1a; #include <Wi…

【pinia持久化存储】使用pinia和pinia-plugin-persistedstate依赖进行数据的持久化存储

简言 使用pinia和pinia-plugin-persistedstate依赖进行数据的持久化存储。 存储方式 &#xff1a; localStoragesessionStorage pinia-plugin-persistedstate 中文官网 pinia 中文官网 安装 安装和使用 pinia &#xff0c;请参考使用pinia文章。 安装 pinia-plugin-pers…

使用PDF猫怎么将PNG图片转化成JPG格式图片?

如需了解更多办公应用的相关教程&#xff0c;可到赛效官方网站的应用资讯栏目或者应用问答栏目下查看更多。 TXT文本工具是微软操作系统上附带的一种文本格式&#xff0c;打开速度比较快&#xff0c;且记录文字内容时比较便捷且快速&#xff0c;但是很多时候记录成TXT文本的工…

八大排序算法(冒泡排序、快速排序、堆排序.....)

每坚持一天&#xff0c;offer就会离我更近一步&#x1f339; 文章目录冒泡排序选择排序插入排序希尔排序快速排序计数排序堆排序归并排序冒泡排序 算法描述&#xff1a;从第一个元素开始&#xff0c;两两比较&#xff0c;如果前者比后者大&#xff0c;那么就将两者进行交换&am…

[oeasy]python0133_[趣味拓展]颜文字_流石兄弟_表情文字_2ch_kaomoji

颜文字 回忆上次内容 上次我们了解unicode 里面有各种字体 甚至还有emoji emoji 本质上也是文字 按照unicode的方式编码存储时按照utf-8的方式编码显示时按照系统定义的方式进行显示 还有什么好玩的亚文化吗&#xff1f;&#x1f914; emoticon 1982 年 9 月 19 日 诞生了第…

docker安装rabbitmq的延迟队列插件

1.进入rabbitmq镜像 docker exec -it rabbitmq bash2.查看rabbitmq版本号&#xff0c;方便查找对应版本的延迟队列插件 rabbitmqctl version2.查询rabbitmq插件列表 rabbitmq-plugins list若没有rabbitmq_delayed_message_exchange-xxx.ez&#xff0c;则可以去[延迟队列插件…

win11家庭版 使用vm进行虚拟化的设置(此平台不支持虚拟化的 Intel VT-x/EPT。)

一、安装vm,进入BIOS设置虚拟化&#xff08;vm安装16.2以上版本&#xff09; 这个网上很多&#xff0c;就不说了 二、此时安装vm,创建虚拟机就没问题了&#xff0c;但是想继续再虚拟化&#xff0c;将会有一个问题“此平台不支持虚拟化的 Intel VT-x/EPT。” &#xff08;很多…

中移链系统合约管控功能介绍

中移链是在满足我国信息化监管需求、合规可控的前提下&#xff0c;打造的中国移动区块链服务平台。如果把中移链类比为计算机系统&#xff0c;那么系统合约就是中移链中的系统设置部分&#xff0c;用于配置和管理链的资源和行为。在计算机系统中,系统设置提供了对计算机系统的底…

SE11/SM30 维护视图

文章目录创建维护视图偶遇错误创建维护视图 首先我们现在SE11中创建一个透明表,然后点击如下图 需要我们创建一个函数组,他的目的是为了让系统生成相应的代码放在这个函数组中,也可以说是SM30的操作界面;点击上面的保存就可以了 注意在输入屏幕编号的时候切记不要和其他的维护…