Spring MVC教程

news2024/9/20 12:35:46

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。

Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。

使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)

1. SpringMVC基础入门

V即View视图是指用户看到并与之交互的界面。比如由html元素组成的网页界面,或者软件的客户端界面。MVC的好处之一在于它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,它只是作为一种输出数据并允许用户操作的方式。

M即model模型是指模型表示业务规则。在MVC的三个部件中,模型拥有最多的处理任务。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

C即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

1.1 概述

Spring MVC框架是一个开源的Java平台,为开发强大的基于Java的Web应用程序提供全面的基础架构支持非常容易和非常快速。

Spring框架最初由Rod Johnson撰写,并于2003年6月根据Apache 2.0许可证首次发布。

Spring web MVC框架提供了MVC(模型 - 视图 - 控制器)架构和用于开发灵活和松散耦合的Web应用程序的组件。 MVC模式导致应用程序的不同方面(输入逻辑,业务逻辑和UI逻辑)分离,同时提供这些元素之间的松散耦合。

模型(Model)封装了应用程序数据,通常它们将由POJO类组成。

视图(View)负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出。(jsp、freemarker、thymeleaf for html5)

控制器(Controller)负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染。

Spring MVC 是一个模型 - 视图 - 控制器(MVC)的Web框架建立在中央前端控制器servlet(DispatcherServlet),它负责发送每个请求到合适的处理程序,使用视图来最终返回响应结果的概念。Spring MVC 是 Spring 产品组合的一部分,它享有 Spring IoC容器紧密结合Spring松耦合等特点,因此它有Spring的所有优点。

1.2 springmvc执行流程

1.3 SpringMVC快速入门

需求:客户端发起请求,服务器端接收请求,执行逻辑并进行视图跳转。 ​

开发步骤

①导入SpringMVC相关坐标

②配置SpringMVC核心控制器DispathcerServlet

③创建Controller类和视图页面

④使用注解配置Controller类中业务方法的映射地址

⑤配置SpringMVC核心文件 spring-mvc.xml

⑥客户端发起请求测试

1.3.1 导入SpringMVC相关坐标

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.20</version>
    </dependency>
<!--json转换-->
 <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.12.3</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.26</version>
    </dependency>
<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

1.3.2 在web.xml中配置核心控制器DispathcerServlet

<servlet>
    <servlet-name>smvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
  </servlet>
<servlet-mapping>
  <servlet-name>smvc</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置web项目的web.xml文件的首页 -->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

1.3.3 定义表现层业务处理器Controller,并配置成spring的bean(等同于Servlet)

@Controller
public class HelloController {
    @RequestMapping("/hello")
    public String  hello(){
        System.out.println("hello word");
        return "index.jsp";
    }
}

1.3.4 配置SpringMVC核心文件 spring-mvc.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 https://www.springframework.org/schema/context/spring-context.xsd">
    <!--包扫描-->
    <context:component-scan base-package="com.by"></context:component-scan>

</beans>

第二种方式:

不使用注解模式,手写配置

<!--需要继承controller 里面实现了header-->
<bean name="/hello2" class="com.by.controller.HelloController2"/>

controller编写逻辑:

public class HelloController2 implements Controller {
    
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mv=new ModelAndView();
        mv.setViewName("/WEB-INF/success.jsp");
        //mv.setViewName("hello"); 如果xml统一配置路径,可以简写程文件名
        mv.addObject("msg","今天天气很冷");
        return mv;
    }
}

快速入门二

需求:通过访问地址调转到指定的页面中

开发步骤

①创建Controller类和视图页面

②配置SpringMVC核心控制器DispathcerServlet

④使用注解配置Controller类中业务方法的映射地址

⑤配置SpringMVC核心文件 spring-mvc.xml

⑥客户端发起请求测试

1.4 Springmvc success操作

方案一 web.xml + spring-mvc.xml

1.4.1 建立配置 spring-mvc.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" xmlns:mvc="http://www.springframework.org/schema/mvc"
       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   http://www.springframework.org/schema/mvc   http://www.springframework.org/schema/mvc/spring-mvc.xsd">    
    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <!-- 设置逻辑视图名的前缀 -->  
        <property name="prefix" value="/WEB-INF/"></property>
        <!-- 设置逻辑视图名的后缀 --> 
        <property name="suffix" value=".jsp"></property>
    </bean>
<!-- 配置Handler -->  
<bean name="/hello2" class="com.by.controller.HelloController2"/>
<bean name="/hello3" class="com.by.controller.HelloController3"/>
</beans>

1.4.2 编写controller实例

public class HelloWord2 implements Controller {
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv=new ModelAndView();
        mv.setViewName("success");
        //mv.setViewName("hello"); 如果xml统一配置路径,可以简写程文件名
        mv.addObject("msg","今天天气很冷");
        return mv;
    }
}

1.4.3 构建页面 success页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>测试成功,欢迎来到这里</h2>
    <h2>页面接收参数:${msg}</h2>
</body>
</html>

1.5 入门案例工作流程分析

  • 服务器启动

    • 加载web.xml中DispatcherServlet

    • 读取spring-mvc.xml中的配置,加载所有com.by包中所有标记为bean的类

    • 读取bean中方法上方标注@RequestMapping的内容

  • 处理请求

    • DispatcherServlet配置拦截所有请求 /

    • 使用请求路径与所有加载的@RequestMapping的内容进行比对

    • 执行对应的方法

    • 根据方法的返回值在webapp目录中查找对应的页面并展示

1.5.1 SpringMVC 技术架构图

1.5.2 前端控制器

Spring Web 模型-视图-控制(MVC)框架是围绕 DispatcherServlet设计的,DispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求和响应,DispatcherServlet的存在降低了组件之间的耦合性。Spring Web MVC DispatcherServlet 的请求处理的 工作流程 如下图所示:

1.6 具体流程

  • 第一步:发起请求到前端控制器(DispatcherServlet)

  • 第二步:前端控制器请求处理器映射器HandlerMapping查找 Handler (可以根据xml配置、注解进行查找)

  • 第三步:处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为一个执行链(HandlerExecutionChain)对象(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略

  • 第四步:前端控制器调用处理器适配器去执行Handler

  • 第五步:处理器适配器HandlerAdapter将会根据适配的结果去执行Handler

  • 第六步:Handler执行完成给适配器返回ModelAndView

  • 第七步:处理器适配器向前端控制器返回ModelAndViewModelAndView是springmvc框架的一个底层对象,包括 Model和view)

  • 第八步:前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可

  • 第九步:视图解析器向前端控制器返回View

  • 第十步:前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)

  • 第十一步:前端控制器向用户响应结果

1.7 总结流程

  1. Spring MVC所有的请求都经过DispatcherServlet来统一分发。

  2. 需要借助HandlerMapping定位到具体的Controller,然后将请求转发到对应的Controller映射。

  3. Controller接口将处理用户请求,这和Java Servlet扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView(数据和视图)对象给DispatcherServlet前端控制器。

从宏观角度考虑:DispatcherServlet是整个Web应用的控制器;带头大哥

从微观考虑: Controller小弟是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。返回的视图需要通过ViewResolver接口(视图解析器)在Web应用中负责查找View对象,从从而将相应结果渲染给客户。

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

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

相关文章

明明都是2000坐标的地形图,怎么位置就不一样呢?

前几天有一个同事在工作中遇到一个问题,核心说起来就是,甲方发来两个年份的同一个片区的地形图,并且言之凿凿都是2000坐标的,但是在一个CAD复制后,到另一个CAD中使用“粘贴到原坐标”,就是位置对不上。 以下使用测试数据还原一下情景。 地形图A,是一个高程点: 地形图…

【网络系统集成】Windows Server集群实验

1.实验名称 Windows Server集群实验 2.实验目的 通过使用Windows 2003进行实验,理解与掌握服务器技术与系统集成相关知识点。 3.实验内容 (1)在Vmware Workstation中安装Windows Server 2003 (2)在Windows Server 2008中完成DNS,WEB的配置

LinuxI2C应用编程——访问EEPROM

文章目录 介绍读芯片手册代码编译运行 阅读博文&#xff1a;LinuxI2C应用编程——I2C-Tools的使用 介绍 EEPROM (Electrically Erasable Programmable read only memory)&#xff0c;指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。 读芯片手册 首先按如图…

SSMP整合案例(15) 解决分页中删除最后一页的最后一条数据,导致查询错位问题

上文 我们还是做了个比较重要的是 将我们的查询全部逻辑改为了分页查询 但是 目前 我们的删除和分页配合起来 它会有一点点问题 例如 这种情况 我们最后一页只有一条数据了 我们操作删除 将这条数据给他干掉 删除完之后 它会调分页查询 但我们当前页的条件还是之前的 例如 我…

【网络】UDP协议详解

目录 UDP的感性理解 UDP协议格式 UDP协议格式感性理解 UDP特点 UDP的缓冲区 UDP的感性理解 UDP的传输过程类似于寄信&#xff0c;假设你要写一封家书寄回家里&#xff1a;首先你要在信封上填写好寄件人和收件人的地址&#xff0c;其次在贴好邮票&#xff0c;最后将信件投放…

MySQL数据库 库表操作

1. (1) mysql> create database Market; 创建数据库 mysql> use Market 使用Market数据库(2) mysql> create table customers(-> c_num int(11) primary key auto_increment,-> c_name varchar(50),-> c_contact varchar(50),-> c_city varc…

ChatGPT炒股:从巨潮资讯网上批量下载特定主题的股票公告

巨潮资讯网是股票公告的指定披露渠道之一&#xff0c;上面有非常详细的A股股票公告内容。 现在&#xff0c;我们要获取2023-01-04~2023-07-04期间所有新三板公司中标题包含“2023年日常性关联交易”的公告。 首先从network中获取到真实网址&#xff1a;http://www.cninfo.com…

大一下学期期末考wp

【web】 1.sign 打开题目 发现有1000个页面 打开第9999个和第9998个页面&#xff0c;发现是utf-8编码 当再随机打开其他页面时&#xff0c;页面又出现了另外一种情况 于是我们猜测&#xff0c;flag是由utf-8编码的&#xff0c;编码被拆散了随机放在10000个页面中的几个页面中…

找不到msvcp140.dll解决方法有哪些?那个修复方法更简单

是使用Windows操作系统的计算机时&#xff0c;总是不可避免会遇到系统报错。像计算机提示找不到msvcp140.dll&#xff0c;msvcp140.dll是一个Windows操作系统中的动态链接库文件&#xff0c;它属于Microsoft Visual C Redistributable包的一部分。这个文件包含了一些供C程序使用…

计算机的大脑 CPU

晶体管 N型MOS管P型MOS管 算术逻辑单元 ALU 晶体管–>门电路–>加法器–>ALU 既可以做逻辑运算、也可以做逻辑运算、成为计算机CPU中非常核心的组件。 指令 一条指令只完成一个基本操作的精简指令集 RISC 、它们的指令长度基本上是固定的。比如 ARM一条指令可以…

【SLAM14讲】02 视觉SLAM基本架构

一、传感器 1.1 安装位置分类 根据安装位置分为两类&#xff1a; 携带于机器人本体 上的传感器&#xff0c;比如激光传感器、相机、轮式编码器、惯性测量单元&#xff08;Inertial Measurement Unit, IMU&#xff09;等等&#xff0c;它们测到的通常都是一些间接的物理量而不…

一键创建日期命名的txt文件(方便日报)

背景 刚工作&#xff0c;免不了写日报&#xff0c;写日计划的时候。为了方便&#xff0c;写了一个bat文件直接点击即可创建今天时间命名的txt文件 代码 win10我的笔记本 echo set tmp%date:~3,4%%date:~8,2%%date:~11,2% type nul > %tmp%.txtwindows 下创建文件就是 t…

排序算法性能分析

目录 实现插入排序、冒泡排序、选择排序、合并排序、快速排序算法&#xff08;从小到大&#xff09; ①插入排序 ②冒泡排序 ③选择排序 ⑥快速排序 五种排序 现在有10亿的数据&#xff08;每个数据四个字节&#xff09;&#xff0c;请快速挑选出最大的十个数&#xff0…

红黑树与234树

红黑树 参考&#xff1a;宇文新粥&#xff1a;红黑树红黑树可视化 234树 这个树有三种节点&#xff0c;分别包含1/2/3个元素&#xff0c;下方可以有2/3/4个子节点理解234树的插入 红黑树与234树之间的关系 红黑树有几个特性&#xff0c;但如果从234树的角度理解红黑树&…

在微软十年了!

时光飞逝&#xff0c;光阴如梭。 2013 年的 7 月 8 号&#xff0c;我在隔壁的交大软院毕业后&#xff0c;正式入职紫竹微软。 至今&#xff0c;已是整整 10 年了。 记得当时的闵行回市区的交通还不是那么堵&#xff0c;坐 5点半的班车下班&#xff0c;S4中环一路走&#xff0c;…

【C++ OJ练习】4.字符串中的第一个唯一字符

1.题目链接 力扣 2.解题思路 利用计数排序的思想 映射进行计数 最后计数为1的那个字符就是唯一字符 从前往后遍历 可以得到 第一个唯一字符 3.代码 class Solution { public:int firstUniqChar(string s) {//使用映射的方式统计次数 计数排序思想int count[26] { 0 };fo…

机器视觉硬件选型-工业光源-环形光源

视觉人机器视觉-硬件发货前硬件确认效果 工业光源根据灯的几何形状可分为条形光源,分区光源&#xff0c;环形光源、圆顶&#xff08;积分&#xff09;光源、平面光源&#xff0c;同轴光源&#xff0c;方形光源&#xff0c;线扫光源&#xff0c;点光源&#xff0c;线光源等等。 …

在上海滩,听懂5G时代的浪奔浪流

几天前的“湾区升明月”上&#xff0c;赵雅芝与吕良伟合唱了一首《上海滩》。“浪奔&#xff0c;浪流”的歌词一出&#xff0c;无数记忆涌上了一代人的心头。 上海这座城市&#xff0c;始终代表着进取、创新、引领&#xff0c;代表着面向世界的中国形象。黄浦江的浪花&#xff…

【尚医通】vue3+ts前端项目开发笔记 2 —— 创建项目、封装网络请求、集成elment-plus 、重置样式、准备状态管理/路由 等开发前准备

尚医通开发记录(Vue3TypeScriptPiniaAxios) 一、接口地址 服务器地址:http://syt.atguigu.cn 医院接口&#xff1a;http://139.198.34.216:8201/swagger-ui.html 公共数据接口&#xff1a;http://139.198.34.216:8202/swagger-ui.html 会员接口&#xff1a;http://139.198.34…

掌握文件转换的技巧:在线工具帮你轻松转换为PDF格式

许多文件都有自己的原始格式&#xff0c;然而这些格式都可以进行修改。遇到无法打开或信息丢失的情况时&#xff0c;可以进行格式转换&#xff0c;其中效果最好的就是PDF格式&#xff0c;无论在哪个平台上查看文档&#xff0c;都有自己的格式&#xff0c;能够在所有平台上查看的…