SpringMVC(详细版从入门到精通)未完

SpringMVC介绍

image-20211221143600426

MVC模型

MVC全称Model View Controller,是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分:

  • Model(模型):指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用中,JavaBean对象,业务模型等都属于Model。

  • View(视图):用于展示模型中的数据的,一般为jsp或html文件。

  • Controller(控制器):是应用程序中处理用户交互的部分。接受视图提出的请求,将数据交给模型处理,并将处理后的结果交给视图显示。

    image-20211214152348721

SpringMVC

SpringMVC是一个基于MVC模式的轻量级Web框架,是Spring框架的一个模块,和Spring可以直接整合使用,我们使用的版本是Spring6,所以JDK需要17以上。SpringMVC代替了Servlet技术,它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。

实时效果反馈

1. 在MVC模型中,Controller指的是

A 数据模型

B 展示数据的视图

C 应用程序中处理用户交互的部分

D 以上说法都不对

2. SpringMVC框架可以让一个简单JAVA类成为

A 控制器

B 视图

C 模型

D 以上均可以

答案

1=>C 2=>A

SpringMVC入门案例

接下来我们编写一个SpringMVC的入门案例

  1. 使用maven创建web项目,补齐包结构。

  2. 引入相关依赖

    <dependencies><!-- Spring核心依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.11</version></dependency><!-- SpringMVC --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>6.0.11</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.0.11</version></dependency><!-- Servlet --><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version><scope>provided</scope></dependency><!-- JSP --><dependency><groupId>jakarta.servlet.jsp</groupId><artifactId>jakarta.servlet.jsp-api</artifactId><version>3.0.0</version><scope>provided</scope></dependency>
    </dependencies>
    
  3. 在web.xml中配置前端控制器DispatcherServlet。

    <web-app><display-name>Archetype Created Web Application</display-name><!--SpringMVC前端控制器,本质是一个Servlet,接收所有请求,在容器启动时就会加载--><servlet><servlet-name>dispatcherServlet</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><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
    </web-app>
    
  4. 编写SpringMVC核心配置文件springmvc.xml,该文件和Spring配置文件写法一样。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 扫描包 --><context:component-scan base-package="com.itbaizhan"/><!-- 开启SpringMVC注解的支持 --><mvc:annotation-driven/></beans>
    
  5. 编写控制器

    @Controller
    public class MyController1 {// 该方法的访问路径是/c1/hello1@RequestMapping("/c1/hello1")public void helloMVC(){System.out.println("hello SpringMVC!");}
    }
    
  6. 配置tomcat10启动项目,访问 http://localhost:8080/c1/hello1

实时效果反馈

1. 使用SpringMVC必须要配置的是

A 监听器

B IOC容器

C 前端控制器

D 编码过滤器

答案

1=>C

SpringMVC执行流程

image-20211222093922306

SpringMVC的组件

  • DispatcherServlet:前端控制器,接受所有请求,调用其他组件。
  • HandlerMapping:处理器映射器,根据配置找到方法的执行链。
  • HandlerAdapter:处理器适配器,根据方法类型找到对应的处理器。
  • ViewResolver:视图解析器,找到指定视图。

组件的工作流程

  1. 客户端将请求发送给前端控制器。
  2. 前端控制器将请求发送给处理器映射器,处理器映射器根据路径找到方法的执行链,返回给前端控制器。
  3. 前端控制器将方法的执行链发送给处理器适配器,处理器适配器根据方法类型找到对应的处理器。
  4. 处理器执行方法,将结果返回给前端控制器。
  5. 前端控制器将结果发送给视图解析器,视图解析器找到视图文件位置。
  6. 视图渲染数据并将结果显示到客户端。

实时效果反馈

1. 在SpringMVC中,通过组件找到指定视图

A 前端控制器

B 处理器映射器

C 处理器适配器

D 视图解析器

2. 在SpringMVC中,通过组件接受所有请求,调用其他组件

A 前端控制器

B 处理器映射器

C 处理器适配器

D 视图解析器

答案

1=>D 2=>A

SpringMVC封装参数_简单数据类型

image-20211221144403791

在Servlet中我们通过request.getParameter(name)获取请求参数。该方式存在两个问题:

  • 请求参数较多时会出现代码冗余。
  • 与容器紧耦合。

而SpringMVC支持参数注入的方式用于获取请求数据,即将请求参数直接封装到方法的参数当中。用法如下:

  1. 编写控制器方法

    // 封装为简单数据类型类型参数
    @RequestMapping("/c1/param1")
    public void simpleParam(String username,int age){
    System.out.println(username);
    System.out.println(age);
    }
  2. 访问该方法时,请求参数名和方法参数名相同,即可完成自动封装。

    http://localhost:8080/c1/param1?username=bz&age=10

实时效果反馈

1. 在SpringMVC中,接受简单类型参数时,请求参数名和相同即可自动封装

A 类名

B 属性名

C 方法名

D 方法参数名

答案

1=>D

SpringMVC封装参数_简单对象

image-20211221144613779

SpringMVC支持将参数直接封装为对象,写法如下:

  1. 编写实体类

    public class Student {private int id;private String name;private String sex;// 省略getter/setter/tostring
    }
    

  2. 编写控制器方法

    // 封装为简单对象类型参数
    @RequestMapping("/c1/param2")
    public void objParam(Student student){System.out.println(student);
    }
    

  3. 访问该方法时,请求参数名和对象参数的属性名相同,即可完成自动封装。

    http://localhost:8080/c1/param2?id=1&name=bz&sex=female

SpringMVC封装参数_关联对象

SpringMVC还可以将请求参数封装为关联对象,即对象的属性也是一个对象。写法如下:

  1. 编写实体类

    public class Student {private int id;private String name;private String sex;private Address address; // 地址对象// 省略getter/setter/tostring
    }public class Address {private String info; //地址信息private String postcode; //邮编// 省略getter/setter/tostring
    }
    

  2. 编写控制器方法

    // 获取关联对象类型参数
    @RequestMapping("/c1/param3")
    public void objParam2(Student student){  System.out.println(student);
    }
    
  3. 访问该方法时,请求参数名和方法参数的属性名相同,即可完成自动封装。

    http://localhost:8080/c1/param3?id=1&name=bz&sex=female&address.info=beijing&address.postcode=030000

    我们也可以使用表单发送带有参数的请求:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html><head><title>表单提交</title></head><body><form action="/c1/param3" method="post">id:<input name="id">姓名:<input name="name">性别:<input name="sex">住址:<input name="address.info">邮编:<input name="address.postcode"><input type="submit"></form></body>
    </html>
    

实时效果反馈

1. 在SpringMVC中,接受对象类型参数时,请求参数名和相同即可自动封装

A 方法参数名

B 方法对象参数的属性名

C 方法名

D 类名

答案

1=>B

SpringMVC封装参数_List集合

image-20211221144931683

SpringMVC支持将请求参数封装为List或Map集合,写法如下:

封装为简单数据类型集合

  1. 编写控制器方法(封装为简单数据类型集合的话,参数前必须添加@RequestParam注解)

    // 封装为简单数据类型集合,参数前必须添加@RequestParam注解
    @RequestMapping("/c1/param4")
    public void listParam(@RequestParam List<String> users){ System.out.println(users);
    }
    

    该方式也可以封装为简单数据类型数组:

    @RequestMapping("/c1/param5")
    public void listParam2(@RequestParam String[] users){ System.out.println(users[0]); System.out.println(users[1]);
    }
    

  2. 请求的参数写法

    http://localhost:8080/c1/param4?users=bj&users=sxt

封装为对象类型集合

SpringMVC不支持将请求参数封装为对象类型的List集合,但可以封装到有List属性的对象中。

  1. 编写实体类

    public class AddressList {private List<Address> address; // 地址集合// 省略getter/setter/tostring
    }
    
  2. 编写控制器方法

    // 对象中包含集合属性
    @RequestMapping("/c1/param6")
    public void listParam3(AddressList addressList){System.out.println(addressList);
    }
    
  3. 请求的参数写法

    http://localhost:8080/c1/param6?address[0].info=bj&address[0].postcode=100010&address[1].info=sh&address[1].postcode=100011

新版Tomcat中,URL中的方括号必须编码,[使用%5B代替, ]使用%5D代替,所以URL的路径写法如下:

http://localhost:8080/c1/param6?address%5B0%5D.info=bj&address%5B0%5D.postcode=100010&address%5B1%5D.info=sh&address%5B1%5D.postcode=100011

实时效果反馈

1. 在SpringMVC中,接受简单数据类型List参数,必须在方法参数前加

@RequestParam

@Param

@Value

@List

2. SpringMVC不支持封装对象类型的List参数,但可以封装

A 包含List的数组

B 包含List的Map集合

C 包含List的Collection集合

D 有List属性的对象

答案

1=>A 2=>D

SpringMVC封装参数_Map集合

同样,SpringMVC要想把参数封装到Map集合中,需要封装到有Map属性的对象中

  1. 编写实体类

    public class AddressMap {private Map<String,Address> address;// 省略getter/setter/tostring
    }
    
  2. 编写控制器方法

    // 对象中包含map属性
    @RequestMapping("/c1/param7")
    public void mapParam3(AddressMap addressMap){System.out.println(addressMap.getAddress());
    }
    

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

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

相关文章

vue3运行机制同tkinter做类比

把刚才“Vue3 盖别墅”的故事&#xff0c;和 Python 的 tkinter 做一个“一一对应”的翻译&#xff0c;你就能瞬间明白两件事的异同。 为了直观&#xff0c;用同一栋房子比喻&#xff1a; Vue3 的“网页” ⇄ tkinter 的“桌面窗口”浏览器 ⇄ Python 解释器 Tcl/Tk 引擎 下面…

Fastadmin后台列表导出到表格

html中添加按钮<a href"javascript:;" class"btn btn-success btn-export" title"{:__(导出数据)}" ><i class"fa fa-cloud-download"></i> {:__(导出数据)}</a>对应的js添加代码处理点击事件&#xff0c;添加…

Nginx反向代理与缓存实现

1. Nginx反向代理核心配置解析 1.1 反向代理基础配置结构 Nginx反向代理的基础配置结构主要包括server块和location块的配置。一个典型的反向代理配置示例如下&#xff1a; server {listen 80;server_name example.com;location / {proxy_pass http://backend_servers;proxy_se…

第2节 如何计算神经网络的参数:AI入门核心逻辑详解

🎯 核心目标:找到最佳w和b! 上期咱们聊了神经网络就是复杂的"线性变换+激活函数套娃",今天的重头戏就是:怎么算出让模型完美拟合数据的w(权重)和b(偏置)!先从最简单的线性函数说起,一步步揭开神秘面纱 那么如何计算w和b呢?首先明确我们需要的w和b能够让…

AutoSar AP平台功能组并行运行原理

在 AUTOSAR Adaptive Platform&#xff08;AP&#xff09;中&#xff0c;同一个机器上可以同时运行多个功能组&#xff08;Function Groups&#xff09;&#xff0c;即使是在单核CPU环境下。其调度机制与进程调度既相似又存在关键差异&#xff0c;具体实现如下&#xff1a;功能…

linux服务器查看某个服务启动,运行的时间

一 查看服务启动运行时间1.1 查看启动时间查看启动时间&#xff08;精确到秒&#xff09;&#xff1a;ps -p <PID> -o lstart例子如下&#xff1a;ps -p 1234 -o lstart1.2 查询运行时长ps -p <PID> -o etimeps -p 1234 -o etime1.3 总结

【JS 性能】前端性能优化基石:深入理解防抖(Debounce)与节流(Throttle)

【JS 性能】前端性能优化基石&#xff1a;深入理解防抖&#xff08;Debounce&#xff09;与节流&#xff08;Throttle&#xff09; 所属专栏&#xff1a; 《前端小技巧集合&#xff1a;让你的代码更优雅高效》 上一篇&#xff1a; 【JS 语法】代码整洁之道&#xff1a;解构赋值…

线性代数 · 直观理解矩阵 | 空间变换 / 特征值 / 特征向量

注&#xff1a;本文为 “线性代数 直观理解矩阵” 相关合辑。 英文引文&#xff0c;机翻未校。 如有内容异常&#xff0c;请看原文。 Understanding matrices intuitively, part 1 直观理解矩阵&#xff08;第一部分&#xff09; 333 March 201120112011 William Gould Intr…

设计模式基础概念(行为模式):策略模式

概述 策略模式是一种行为设计模式&#xff0c; 它能让你定义一系列算法&#xff0c; 并将每种算法分别放入独立的类中&#xff0c; 以使算法的对象能够相互替换。 主要目的是通过定义相似的算法&#xff0c;替换if else 语句写法&#xff0c;并且可以随时相互替换 结构示例 策略…

功能组和功能组状态的概念关系和区别

在 AUTOSAR Adaptive Platform 中&#xff0c;功能组&#xff08;Function Group&#xff0c;FG&#xff09; 和 功能组状态&#xff08;Function Group State&#xff09; 是状态管理&#xff08;SM&#xff09;的核心概念&#xff0c;二者构成静态逻辑单元与动态行为模式的协…

力扣326:3的幂

力扣326:3的幂题目思路代码题目 给定一个整数&#xff0c;写一个函数来判断它是否是 3 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 3 的幂次方需满足&#xff1a;存在整数 x 使得 n 3^x 思路 想要是三的幂次方的话将这个…

前瞻性技术驱动,枫清科技助力制造企业借助大模型完成生产力转化

麦肯锡于近期发布的《技术趋势展望2025》更清晰地定义了AI的角色与发展方向。报告在不止一个章节总结了基础模型加速小型化的趋势&#xff0c;多模态融合成为主流&#xff1a;企业的模型利用从追求“大而全”转向“小而精”&#xff0c;高效专用小模型成本降低90%的同时保持性能…

如何远程连接云服务器上mysql

一&#xff1a;使用系统命令查看端口占用# 查看MySQL进程及其端口sudo netstat -tlnp | grep mysql# 或者使用ss命令sudo ss -tlnp | grep mysql# 查看3306端口&#xff08;MySQL默认端口&#xff09;sudo netstat -tlnp | grep 3306出现如下信息&#xff0c;说明端口3306[root…

今日分享:C++模板(全详解)

&#x1f60e;【博客主页&#xff1a;你最爱的小傻瓜】&#x1f60e; &#x1f914;【本文内容&#xff1a;C模板 &#x1f60d; 】&#x1f914; -------------------------------------------------------------------------------------------------------------------…

ramdisk内存虚拟盘(一)——前世今生

1990 年代&#xff1a;前因——“硬盘太慢、驱动太多” 背景&#xff1a;早期 Linux 根文件系统要么在软盘、要么在 IDE 硬盘&#xff0c;内核把对应的软盘/IDE 驱动编进去即可顺利挂载。矛盾出现&#xff1a;随着 SCSI、PCMCIA、USB、RAID 控制器等百花齐放&#xff0c;如果把…

ETH持续上涨推动DEX热潮,交易活跃度飙升的XBIT表现强势出圈

BOSS Wallet 8月15日讯&#xff0c;随着ETH价格在过去24小时内强势拉升至4300美元&#xff0c;整个加密市场再度掀起涨势狂潮&#xff0c;链上交易活跃度空前高涨。其中&#xff0c;去中心化交易所平台迅速成为市场焦点&#xff0c;其平台活跃度与交易量双双上涨&#xff0c;吸…

Stand-In - 轻量级人物一致性视频生成 高保真视频人脸交换 ComfyUI工作流 支持50系显卡 一键整合包下载

Stand-In 是一个轻量级、即插即用的身份保护视频生成框架&#xff0c;只需要上传一张人物照片&#xff0c;加上一段提示词&#xff0c;即可生成高度一致性的高保真人物视频&#xff0c;人脸相似度和自然都几乎达到100%还原水平。 Stand-In 能把任何一张人脸&#xff08;甚至动漫…

vue3相关基础

1、ref和reactive的区别两者都是响应式数据的声明。Reactive只适用于非基本数据类型&#xff0c;如对象&#xff0c;数组等。而ref是兼容适用于reactive的的数据类型的以及其他数据&#xff0c;灵活性较高。ref声明的变量取值时需要.value。在<template></template>…

云手机存储和本地存储的区别

云手机存储通常指云存储&#xff0c;即数据存储在云端服务器&#xff0c;本地存储则是将数据存储在用户设备硬件中&#xff0c;主要区别体现在存储位置、访问方式、依赖条件等多个方面&#xff0c;具体如下&#xff1a;本地存储主要是将数据存储在用户自有设备的物理硬件中&…

【科研绘图系列】R语言绘制三维曲线图

文章目录 介绍 加载R包 数据下载 导入数据 数据预处理 画图 系统信息 参考 介绍 【科研绘图系列】R语言绘制三维曲线图 加载R包 library(tidyverse) library(ggsignif) library(RColorBrewer) library(dplyr) library(reshape2) library(grid