软件设计之SSM(9)

软件设计之SSM(9)

路线图推荐:
【Java学习路线-极速版】【Java架构师技术图谱】
尚硅谷新版SSM框架全套视频教程,Spring6+SpringBoot3最新SSM企业级开发
资料可以去尚硅谷官网免费领取

学习内容:

SpringMVC

  1. 概念及核心组件
  2. MVC初始化类
  3. 数据接收

1、概念及核心组件

SpringMVC 是 Spring 框架中的一个模块,主要用于简化和组织 Java Web 应用程序中的请求处理和响应逻辑(简化前端参数接收( 形参列表 )简化后端数据响应(返回值))。它是一个基于 Model-View-Controller (MVC) 设计模式的框架,提供了一整套用于处理 HTTP 请求、生成响应和将业务逻辑与视图解耦的机制。

SpringMVC处理请求流程:

  1. 客户端发送请求:浏览器或其他客户端向服务器发送 HTTP 请求,请求的 URL 会被发送到服务器并被分配到特定的 DispatcherServlet
  2. DispatcherServlet 接收请求:DispatcherServlet 是 Spring MVC 的核心组件,负责接收所有的请求并进行分发。它相当于前端控制器(Front Controller),所有请求都会首先经过它。[需要web.xml配置生效]
  3. HandlerMapping 映射请求:DispatcherServlet 调用一个或多个 HandlerMapping,这些映射器的作用是根据请求的 URL 找到合适的处理器(Handler)。通常,@RequestMapping 注解就定义了请求路径与控制器方法之间的映射关系。[需要进行IoC配置]
  4. 调用处理器适配器 (HandlerAdapter):找到处理器(通常是一个控制器方法)后,DispatcherServlet 会根据处理器的类型找到相应的 HandlerAdapter,并通过适配器调用真正的处理方法。
  5. 执行控制器逻辑:控制器中的处理方法被调用,执行具体的业务逻辑。它会处理请求参数,调用服务层,执行数据库查询等操作,并通常会返回一个包含视图名称和模型数据的ModelAndView 对象
  6. 视图解析:控制器返回的视图名称需要解析为具体的视图文件,DispatcherServlet 调用 ViewResolver 来解析视图名称。视图解析器(如 InternalResourceViewResolver)会将视图名称与实际的 JSP、Thymeleaf、FreeMarker 等视图模板进行匹配。
  7. 渲染视图:视图解析完成后,视图会被渲染,模型数据将被填充到视图中,最终生成 HTML 响应。
  8. 返回响应给客户端:视图渲染完成后,DispatcherServlet 将生成的 HTML 响应发送回客户端,用户可以在浏览器中看到处理后的结果。
    在这里插入图片描述

2、MVC初始化类

在传统的 Spring MVC 应用中,通常会在 web.xml 中配置 DispatcherServlet 来处理请求,并配置 Spring 的应用上下文。这种 XML 配置方式虽然很灵活,但并不够现代和简洁。

AbstractAnnotationConfigDispatcherServletInitializer 是 Spring 提供的一个方便类,用于简化基于 Java 配置的 Spring Web 应用的初始化。实现该类的目的是用来替代传统的 web.xml 配置文件,以编程方式注册 DispatcherServlet,并配置 Spring 应用的上下文。

onStartup 是该类中的一个关键方法,它负责在应用启动时完成初始化工作。开发者可以通过 onStartup 方法直接与 ServletContext 交互,注册 Servlet创建配置Ioc容器、配置过滤器、监听器等。

创建初始化类实现该接口目的:

  1. 注册DispatcherServlet通过继承 AbstractAnnotationConfigDispatcherServletInitializer,可以自动注册 DispatcherServlet,它是 Spring MVC 的核心前端控制器,用于拦截所有的请求并分发给合适的控制器进行处理。
  2. 加载 Spring 和 Spring MVC 配置类 该类会通过两个方法分别为根应用上下文(Root ApplicationContext)和 Spring MVC 应用上下文(Servlet ApplicationContext)提供配置类:
  • getRootConfigClasses():用于配置应用的全局根配置,例如服务层、数据源等。
  • getServletConfigClasses():用于配置 Spring MVC 的相关配置,例如控制器、视图解析器等。
  1. 配置 URL 映射 实现该类时,需要定义哪些 URL 请求应该由 DispatcherServlet 处理,通常通过 getServletMappings() 方法来实现。通常的映射是 “/”,表示拦截所有请求。

3、数据接收

访问路径设置

@RequestMapping注解的作用就是将请求的 URL 地址和处理请求的方式(handler方法)关联起来,建立映射关系。

  1. 在@RequestMapping注解指定 URL 地址时,可以精准路径匹配、也可以通过使用通配符模糊匹配
  2. 设置到类级别: @RequestMapping 注解可以设置在控制器类上,用于映射整个控制器的通用请求路径。这样,如果控制器中的多个方法都需要映射同一请求路径,就不需要在每个方法上都添加映射路径。
  3. 设置到方法级别: @RequestMapping 注解也可以单独设置在控制器方法上,用于更细粒度地映射请求路径和处理方法。当多个方法处理同一个路径的不同操作时,可以使用方法级别的 @RequestMapping 注解进行更精细的映射。
  4. 附带请求方式限制: HTTP 协议定义了八种请求方式,GETPOST等,设置请求方式可以指定该方法只处理某种特定的 HTTP 请求方法,违背请求方式,会出现405异常,该注解只能添加到handler方法上,无法添加到类上

接收参数

表单参数param与json参数比较

表单参数(param):如果你的请求数据是简单的键值对(如登录表单、查询参数),并且不需要传递复杂的对象结构,使用表单参数是比较方便和直接的方式。

JSON 参数:如果需要传递复杂的数据结构(如对象数组、嵌套对象等),并且客户端和服务器端采用的是 RESTful 风格的交互,使用 JSON 参数会更加适合。JSON 参数的可读性和结构化使它在现代 Web 开发中成为标准。

比较项表单参数(param)JSON 参数
数据格式key=valueJSON 格式 { "key": "value" }
适用场景简单键值对、表单提交复杂的对象或嵌套结构的数据
请求类型GET、POST、PUT、DELETE 等通常为 POST、PUT、PATCH 等
传递方式查询参数、表单参数,放在 URL 或请求体中请求体中
解析自动解析为 @RequestParam 或对象需要使用 @RequestBody 来解析
优点简单、快速结构化数据支持强,适合复杂的对象和数组
缺点不适合复杂的数据结构需要手动解析 JSON 数据,并设置请求头

param参数接收

  1. 直接接收
    在url中传递参数,即可自动接收,但要求形参数名和类型与传递参数相[可以不传递参数,不会报错]
    比如: localhost:8080/param/data?name=root&age=10
    //直接获取//只要形参数名和类型与传递参数相同,即可自动接收@RequestMapping("data")@ResponseBodypublic String data(String name, int age){System.out.println("name = " + name + ", age = " + age);return "name = " + name + ", age = " + age ;}
  1. @RequestParam注解
    可以使用 @RequestParam 注释将 Servlet 请求参数(即查询参数或表单数据)绑定到控制器中的方法参数。
代码作用
@RequestParam("stuAge") String age:传递参数变更为stuAge
required = false:默认情况下,传递参数要求是必须传递的,这是该值可以不传递,转而设置为默认值
defaultValue = "18":设置age的默认值为18
@GetMapping(value="/data")
@ResponseBody
public Object paramForm(@RequestParam("name") String name, @RequestParam(value = "stuAge",required = false,defaultValue = "18") int age){System.out.println("name = " + name + ", age = " + age);return name+age;
}
  1. 一名多值
    多选框,提交的数据的时候一个key对应多个值,可以使用集合进行接收
    注意:这里一定要加注解@RequestParam,不加会直接将多个请求参数作为字符串复制给集合,报错
  /*** 前端请求: http://localhost:8080/param/mul?hbs=吃&hbs=喝**  一名多值,可以使用集合接收即可!但是需要使用@RequestParam注解指定*/@GetMapping(value="/mul")@ResponseBodypublic Object mulForm(@RequestParam List<String> hbs){System.out.println("hbs = " + hbs);return hbs;}
  1. 实体接收
    Spring MVC 是 Spring 框架提供的 Web 框架,它允许开发者使用实体对象来接收 HTTP 请求中的参数。通过这种方式,可以在方法内部直接使用对象的属性来访问请求参数,而不需要每个参数都写一遍。
    前提:定义一个用于接收参数的实体类
@Controller
@RequestMapping("param")
public class ParamController {@RequestMapping(value = "/user", method = RequestMethod.POST)@ResponseBodypublic String addUser(User user) {// 在这里可以使用 user 对象的属性来接收请求参数System.out.println("user = " + user);return "success";}
}

路径参数接收
动态路径设计: /user/{动态部分}/{动态部分} 动态部分使用{}包含即可! {}内部动态标识!
形参列表取值:

  • @PathVariable Long id 如果形参名 = {动态标识} 自动赋值
  • @PathVariable(“动态标识”) Long id 如果形参名 != {动态标识} 可以通过指定动态标识赋值
 /*** 访问测试:  /param/user/1/root  -> id = 1  uname = root*/
@GetMapping("/user/{id}/{name}")
@ResponseBody
public String getUser(@PathVariable Long id, @PathVariable("name") String uname) {System.out.println("id = " + id + ", uname = " + uname);return "user_detail";
}

JSON参数接收
在控制器中,使用 @RequestBody 注解来接收 JSON 数据,并将其转换为 Java 对象

在接收JSON时,需要面对两个问题:

  • 不支持json数据类型处理
  • 没有json类型处理的工具(jackson)

对应的解决方案是:

  • 配置json转化器:在配置类加上注解@EnableWebMvc
  • 在pom.xml 加入jackson依赖:jackson-databind
@PostMapping("/person")
@ResponseBody
public String addPerson(@RequestBody Person person) {// 在这里可以使用 person 对象来操作 JSON 数据中包含的属性return "success";
}

接收Cookie数据

可以使用 @CookieValue 注释将 HTTP Cookie 的值绑定到控制器中的方法参数

@GetMapping("/demo")
public void handle(@CookieValue("CookieName") String cookie) { //...
}

接收请求头数据

可以使用 @RequestHeader批注将请求标头绑定到控制器中的方法参数。

下面的示例获取Accept-EncodingKeep-Alive标头的值:

@GetMapping("/demo")
public void handle(@RequestHeader("Accept-Encoding") String encoding, @RequestHeader("Keep-Alive") long keepAlive) { //...
}

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

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

相关文章

POST注入通过sqli-labs靶场less-11

POST注入原理 原理介绍 进入第十一关靶场&#xff0c;我们发现是一个登录窗口&#xff0c;随意提交数据&#xff0c;显示 在url地址进行get提交&#xff0c;发现一直是登录窗口&#xff0c;页面无其他变化&#xff0c;想到post提交注入。 通关原理 打开靶场源码文件。 查看…

SEO(搜索引擎优化)指南

SEO&#xff08;Search Engine Optimization&#xff09;是通过优化网站内容、结构和外部链接&#xff0c;提升网页在搜索引擎结果中的排名&#xff0c;从而增加网站流量的过程。SEO 涉及多个层面&#xff0c;包括技术 SEO、内容优化、外部链接建设等。以下是 SEO 的核心优化策…

FineReport打开报错“配置数据库出错“怎么解决?

配置数据库被锁住&#xff0c;是否重置?将在embed文件夹生成备份并重置 我直接用管理员身份证打开就完美解决了!

AD9361,数据接口

CMOS LVDS Xilinx原语IBUFDS、OBUFDS IBUFDS、和OBUFDS都是差分信号缓冲器&#xff0c;用于不同电平接口之间的缓冲和转换。IBUFDS 用于差分输入&#xff0c;OBUFDS用于差分输出。 IBUFDS https://docs.amd.com/r/en-US/ug953-vivado-7series-libraries/IBUFDS // IBUFDS …

启明智显工业级HMI芯片Model4功耗特性分享

Model4工业级MPU是国产自主面向工业应用的RISC-V架构的应用级芯片&#xff0c;内置玄铁64bit RISC-V CPU C906&#xff0c;主频高达600MHz&#xff0c;算力约1380DMIPS。支持RTOS、linux系统&#xff0c;支持LVGL工具开发UI&#xff1b; Model4系列工业级MPU具有极强的屏显、多…

VL53L0X 测距传感器使用记录

VL53L0X 测距传感器测试使用说明...... by 矜辰所致前言 最近代理商告知以前使用的测距传感器 VL6180 公司已经宣告停产了&#xff0c;那么咱就得找一款替代品作为测距产品的探头了&#xff0c;推荐了 VL53L4 和 VL53L0X 系列&#xff0c;考虑到功耗问题&#xff0c;决定选用低…

【数据结构 | PTA】栈

文章目录 7-1 汉诺塔的非递归实现7-2 出栈序列的合法性**7-3 简单计算器**7-4 盲盒包装流水线 7-1 汉诺塔的非递归实现 借助堆栈以非递归&#xff08;循环&#xff09;方式求解汉诺塔的问题&#xff08;n, a, b, c&#xff09;&#xff0c;即将N个盘子从起始柱&#xff08;标记…

STM32-TIM输入捕获

一、概述 IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变&#xff08;上升沿或下降沿&#xff09;时&#xff0c;当前CNT的值将被锁存到CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续…

提示工程、微调和 RAG

自众多大型语言模型&#xff08;LLM&#xff09;和高级对话模型发布以来&#xff0c;人们已经运用了各种技术来从这些 AI 系统中提取所需的输出。其中一些方法会改变模型的行为来更好地贴近我们的期望&#xff0c;而另一些方法则侧重于增强我们查询 LLM 的方式&#xff0c;以提…

【C语言】猜数字小游戏

&#x1f602;个人主页: 起名字真南 &#x1f923;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 随机数的生成1.1 rand1.2 srand1.3 time1.4 设置随机数范围 2 猜数字游戏实现 前言&#xff1a;我们学习完前面的循环以后可以写一个猜数字小游戏 1 随机数的生成 想要完成…

八大排序--07归并排序

假设数组 arr[] {5,7,4,2,0,1,6},请通过插入排序的方式&#xff0c;实现从小到大排列&#xff1a; 方法&#xff1a;先拆分&#xff0c;再合并&#xff0c;并在合并过程中结束临时空间进行排序&#xff1b; 拆分&#xff1a;从待排序列中间位置拆开&#xff0c;数据分成左右两…

使用欧拉安装ceph分布式存储,ceph的集群安装、添加主机集群和删除主机、添加osd硬盘和手动添加硬盘为osd和移除osd。

1.ceph安装 1.1 首先准备3台机子&#xff0c;配置ip&#xff0c;给每台机子添加3块硬盘,设置主机名为ceph01、ceph02、ceph03。 192.168.10.20ceph01192.168.10.21ceph02192.168.10.22ceph03 1.2 三台机子关闭防火墙&#xff0c;setenforce 0&#xff0c;添加hosts解析、配置…

RWKV-7 预览版、大量新论文...RWKV 社区 9 月动态速览

欢迎大家收看《RWKV 社区最新动态》第五期&#xff0c;本期内容收录了 RWKV 社区 2024 年 9 月的最新动态。 9 月动态省流版&#xff08;TL;DR&#xff09; RWKV 官方新闻动态 RWKV-7 发布预览版RWKV-7 论文撰写已面向社区开放RWKV 官网上线 Bad Case 收集页面RWKV 中文文档已…

高带宽示波器在信号测试分析中的优势和主要应用场景

最近&#xff0c;普源精电推出了一款13GHz带宽的示波器DS81304,。有些小伙伴会好奇&#xff0c;为什么普源示波器的带宽会从5GHz跳到13GHz&#xff0c;为什么不是到10GHz或者15GHz呢&#xff1f;13GHz的示波器又能干些什么呢&#xff1f;下面讲为大家介绍&#xff0c;为什么DS8…

基于Arduino的遥控自平衡小车

基于Arduino的遥控自平衡小车 一、项目简介二、所需材料三、理论支持四、外壳设计五、线路连接六、检查MPU6050连接七、烧录库八、PID控制设置九、设置传感器参数十、无线移动控制十一、超声波模块 一、项目简介 一个使用Arduino Nano、MPU-6050以及便宜的6伏直流齿轮电机的自…

HT8513 内置自适应同步升压和防破音功能的6.5W D类及AB类音频功率放大器

1、特征 防削顶失真功能(防破音,Anti-Clipping Function, ACF) 免滤波器数字调制&#xff0c;直接驱动扬声器 输出功率 3W (VBAT3.3V, RL-4Ω, THDN<1%, 20-20kHz full band) 2.0W (VBAT3.3V, RL8Ω,THDN<1%, 20-20kHz full band) 6.5W (VBAT4.2V, RL2Ω, THDN10%,f1kHz…

(Linux驱动学习 - 9).设备树下platform的LED驱动

一.platform相关结构体与函数 1.匹配列表 - struct of_device_id struct of_device_id {char name[32];char type[32];/* compatible 很重要&#xff0c;需要与设备树节点的 compatible 属性一致&#xff0c;才能匹配 */char compatible[128]; const void *data; }; …

IOT-Tree连接西门子PLC S7 200 Smart竟然如此简单

最近一个项目需要把用户现场控制柜接入到云端&#xff0c;控制柜使用西门子PLC Smart 200 SR40型号&#xff0c;已经运行多年&#xff0c;PLC通过以太网接口对接一个触摸屏。 按照我以往的经验&#xff0c;觉得触摸屏以太网接口已经被占用&#xff0c;那么只能通过剩余的RS485…

视频剪辑软件推荐电脑版:这5款剪辑软件不容错过!

在视频剪辑领域&#xff0c;选择合适的软件至关重要。不同的软件各有千秋&#xff0c;有的简单易用&#xff0c;适合新手快速上手&#xff1b;有的功能强大&#xff0c;适合专业团队进行深度编辑。以下是一些电脑版视频剪辑软件的推荐&#xff0c;涵盖了从新手到专业级别的不同…

智能电子价签:助力零售效率升级的关键

在竞争日益激烈的零售市场&#xff0c;如何优化运营、提升效率&#xff0c;是每个零售商都在关注的问题。电子价签作为一项创新技术&#xff0c;提供了蒿效的解决方案。今天&#xff0c;我们就来聊聊电子价签如何帮助零售商轻松管理信息、减少人工误差&#xff0c;并展示它在门…