SpringMVC2

news2025/5/22 6:46:48

一、springmvc 接收请求

类上、方法上

@RequestMapping

@GetMapping

@PostMapping

package com.hl.springmvc02.web;
​
import jdk.nashorn.internal.objects.annotations.Getter;
import org.springframework.web.bind.annotation.*;
​
@RestController
@RequestMapping("/user")
public class UserController {
    //get 请求默认访问方法
    @GetMapping
    public String welcome(){
        System.out.println("welcome");
        return "welcome!";
    }
    //post请求执行的默认方法
    @PostMapping
    public String welcome2(){
        System.out.println("welcome2");
        return "welcome2!";
    }
    /*
    url: http://localhost:8080/user/save
    @RequestMapping:默认情况下,接收任意类型请求
    限制只能接收特定请求  method = RequestMethod.GET 只接收get请求
    method = RequestMethod.GET|POST|PUT|DELETE
     */
    @RequestMapping(value = {"/save1","/save2","/save"},
            method = RequestMethod.GET)
    public void save(){
        System.out.println("save");
    }
}
​

二、springmvc 接收数据

1、接收参数
package com.hl.springmvc02.web;
​
import com.hl.springmvc02.pojo.Product;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
​
import javax.servlet.http.HttpServletRequest;
​
@RestController
@RequestMapping("/product")
public class ProductController {
    /*
    接收数据
    方式一、原生 HttpServletRequest 接收数据
     */
    @RequestMapping("/save")
    public String save(HttpServletRequest request){
        //接收参数  返回值只能是字符串类型
        String name = request.getParameter("name");
        String id = request.getParameter("id");
        //类型转换时,需要手动转换
        if(id !=null && id!=""){
            System.out.println(Integer.parseInt(id));
        }
        return "save!"+id+"---"+name;
    }
    /*
    方式二:通过参数名称接收  要求  url后传递的参数名和方法的形参名保持一致
    http://localhost:8080/product/save2?id=11&name=admin
    尽可能使用包装类,而不是基本数据数据类型
     */
    @RequestMapping("/save2")
    public String save2(Integer id,String name){
        return "save!"+id+"--"+name;
    }
    @RequestMapping("/save3")
    public String save3(int id,String name){
        return "save!"+id+"--"+name;
    }
    /*
    方式三、参数名称不一致时  @RequestParam(name = "username")  参数映射
     1、限制是否允许为空  @RequestParam 默认不允许为空
     @RequestParam(required = false)
     required = false  是否允许为空
     2、是否给默认值 @RequestParam(defaultValue = "12345")
     */
    @RequestMapping("/save4")
    public String save4(@RequestParam(defaultValue = "12345",required = false) Integer id,
                        @RequestParam(name = "username") String name){
        return id+"---"+name;
    }
    
    /*
    方式四、通过对象接收数据 (当前端传递的参数名和对象的属性名保持一致时)
    http://locahost:8080/product/save5?id=12&name=admin
     */
    @RequestMapping("save5")
    public Product save5(Product product,String name1){
        System.out.println(name1);
        return  product;
    }
    
    /*
    方法五、restful风格接收(@PathVariable 地址栏传参)
    http://localhost:8080/product/save6/1/admin
    微服务中推荐的模式
     */
    @RequestMapping("/save6/{id1}/{name}")
    public Product save6(@PathVariable(name = "id1") Integer id,
                         @PathVariable(required = false) String name){
        System.out.println(id+"---"+name);
        return new Product(id,name);
    }

2、cookie数据

/*
    cookie传递数据
    @CookieValue 从cookie中获取数据,根据key找到value
 */
@RequestMapping("/cookie")
public String getCookie(@CookieValue(name = "username",required = false)
                        String username){
    return username;
}

3、请求头中数据
@RestController
@RequestMapping("/order")
public class OrderController {
​
    /*
    @RequestHeader(name = "user-agent") String userAgent
    获取浏览器请求头中特定key对应的value
     */
    @RequestMapping("/header")
    public String header(@RequestHeader(name = "User-Agent") String userAgent,
                         @RequestHeader(name = "token") String token){
        return userAgent+"---"+token;
    }
}

4、接收其他controller转发的数据

业务操作:调用service

package com.hl.springmvc02.web;
​
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
​
import javax.servlet.http.HttpServletRequest;
​
@Controller
@RequestMapping("/s1")
public class DispatcherController {
​
    @RequestMapping("/getMsg")
    public String getMsg(HttpServletRequest request){
        System.out.println("getMsg......");
        //获取浏览器传递的参数
        String msg = request.getParameter("msg");
        //一次转发过程中携带数据(传递数据)
        request.setAttribute("msg1","hello world!");
        //转发到其他的controller方法
        return "/s1/getData";
    }
​
    @RequestMapping("/getData")
    public String getData(HttpServletRequest request,
                          @RequestAttribute(required = false) String msg1){
        System.out.println("getData......");
        //获取request转发携带的数据
        System.out.println(request.getAttribute("msg1"));
        System.out.println("--注解获取--"+msg1);
        //转发到页面
        return "/index.html";
    }
}
 

三、前后端分离:返回数据给前端(前后端一体,转发,重定向页面跳转)

@ResponseBody
@RestController
统一返回数据格式

声明一个结果集R类

package com.hl.springmvc02.pojo;
​
import lombok.Data;
​
/*
R ---> 结果集对象(响应对象)
统一封装  服务端返回给前端的数据
 */
@Data
public class R {
    private Integer code;//状态码
    private String msg;//描述信息
    private Object data;//传递的数据
​
    //成功的方法
    public static R ok() {
        return new R(200,"操作成功",null);
    }
    //成功的方法
    public static R ok(Object data) {
        return new R(200,"操作成功",data);
    }
    //成功的方法
    public static R ok(String msg ,Object data) {
        return new R(200,msg,data);
    }
    //失败的方法
    public static R fail(String msg) {
        return new R(201,msg,null);
    }
​
    public R(Integer code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
​
    public R() {
    }
}
 
package com.hl.springmvc02.web;
​
import com.hl.springmvc02.pojo.R;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
​
@RestController
@RequestMapping("/response")
public class ResponseController {
    @RequestMapping("/data")
    public R data(){
        //业务逻辑
        return R.ok();
    }
    @RequestMapping("/data2")
    public R data2(){
        return R.ok("新增成功",null);
    }
    @RequestMapping("/data3")
    public R data3(){
        return R.fail("用户名已存在!");
    }
}

四、各种常见错误及解决方案

常见错误类型:
404:路径未找到   http://localhost:8080/product/save4
405: 方法不匹配   前端get ---->  服务端@PostMapping       @RequestMapping(method="")
400: 参数赋值错误
       前端id=abc   服务端:Integer id
       前端没有传递id null  服务端  int id  null--->int 报错
       前端id没有传值     服务端  @RequestParam(required=true)  Integer id
500: 服务端错误
   1、接收到请求了
   2、接收到数据
   3、方法体报错

五、springmvc的内部执行流程

springmvc实现的功能

1、springmvc接收请求

2、springmvc接收数据

3、返回数据给前端

4、页面跳转(携带数据)

springmvc内部核心组件

1、DispatcherServlet 前端控制器

2、HandlerMapping 处理器映射器

3、HandlerAdapter 处理器适配器

4、Handler 处理器

5、ViewResolver 视图解析器组件

springmvc内部执行流程

六、mvc设计模式

MVC 架构 model 业务层、view 视图层、controller控制层

view 视图层:用户交互 html、css、js、vue、小程序

controller 控制层: 接收前端请求、接收前端数据、返回数据给前端 spring webmvc (web包)

model 业务层: 业务操作 service、dao、pojo

总结

1、接收请求的方式

@RequestMapping ,@GetMapping,@PostMapping 区别

2、接收数据

参数、请求头、cookie、接收其他controller转发的数据

@RequestBody 注解(没讲 ,接收前端传递的json数据)

3、返回数据给前端 R

code | msg | data

4、各种常见的错误及解决方案

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

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

相关文章

【每日一题丨2025年5.12~5.18】排序相关题

个人主页:Guiat 归属专栏:每日一题 文章目录 1. 【5.12】P1068 [NOIP 2009 普及组] 分数线划定2. 【5.13】P5143 攀爬者3. 【5.14】P12366 [蓝桥杯 2022 省 Python B] 数位排序4. 【5.15】P10901 [蓝桥杯 2024 省 C] 封闭图形个数5.【5.16】P12165 [蓝桥…

Typora + PicGo + GitHub 配置图床——图片自动上传 详细教程

文章目录 一、创建 GitHub 仓库二、添加私人令牌三、下载 PicGo四、配置 PicGo五、测试 一、创建 GitHub 仓库 进入 Github 官网 注册一个属于自己的账号,点击创建仓库。 2. 创建自己的新仓库。仓库设置为公开,方便上传图片(你设置私有也可以…

QT+Visual Studio 配置开发环境教程

一、QT架构 Qt Creator 是一个轻量级、跨平台的 IDE,专为 Qt 开发量身打造,内置对 qmake/CMake 的深度支持、Kits 配置管理、原生 QML 调试器以及较低的资源占用维基百科。 而在 Windows 环境下,Visual Studio 配合 Qt VS Tools 扩展则可将 Q…

缺乏经验的 PCB 过孔建模方法

您是一名背板设计人员,被指派设计一种新的高速、多千兆位串行链路架构,从多个线卡到背板上的多个交换矩阵交换卡。这些链路必须在第一天以 6GB/s 的速度运行,并且为 10GB/s (IEEE 802.3KR) 做好产品演进的准备。时间表很紧,您需要提出一个背板架构,以允许程序的其余部分…

【漫话机器学习系列】265.普拉托变换的相关问题(Issues With Platt Scaling)

Platt Scaling 的相关问题详解 | 模型校准中的隐患分析 在机器学习模型中,模型预测的“置信度”并不一定等于真实的概率。为了提高模型预测结果的可解释性和实用性,我们通常会使用一种后处理的概率校准方法——Platt Scaling(普拉托变换&…

【Linux高级全栈开发】2.2.1 Linux服务器百万并发实现2.2.2 Posix API与网络协议栈

【Linux高级全栈开发】2.2.1 Linux服务器百万并发实现2.2.2 Posix API与网络协议栈 高性能网络学习目录 基础内容(两周完成): 2.1网络编程 2.1.1多路复用select/poll/epoll2.1.2事件驱动reactor2.1.3http服务器的实现 2.2网络原理 百万并发…

LlamaIndex

1、大语言模型开发框架的价值是什么? SDK:Software Development Kit,它是一组软件工具和资源的集合,旨在帮助开发者创建、测试、部署和维护应用程序或软件。 所有开发框架(SDK)的核心价值,都是降低开发、维护成本。 大语言模型开发框架的价值,是让开发者可以更方便地…

springboot使用xdoc-report包导出word

背景:项目需要使用xdoc-report.jar根据设置好的word模版,自动填入数据 导出word 框架使用 我的需求是我做一个模板然后往里面填充内容就导出我想要的word文件,问了下chatgpt还有百度,最后选用了xdocreport这个框架,主…

重拾GMP

目录 GMP总结 线程协程三家对比GMP调度模型 mgp过一遍流程 g 一个G的生命周期 mpschedt全局队列g0视角看看G的调度流程 四大调度类型 主动调度被动调度正常调度抢占调度 宏观的调度流程上面流程的具体细节 schedule()findRunnable()execute()gosched_m()park_m()与ready()goe…

实验分享|基于千眼狼sCMOS科学相机的流式细胞仪细胞核成像实验

实验背景 流式细胞仪与微流控技术,为细胞及细胞核成像提供新的路径。传统流式细胞仪在细胞核成像检测方面存在检测通量低,荧光信号微弱等局限,故某光学重点实验室开发一种基于高灵敏度sCMOS科学相机并集成在自组荧光显微镜的微流控细胞核成像…

【Linux笔记】——线程池项目与线程安全单例模式

🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹: 【Linux笔记】——简单实习一个日志项目 🔖流水不争,争的是滔滔不息 一、线程池设计二…

ZooKeeper 原理解析及优劣比较

大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! 引言 在分布式系统中,服务注册、配置管理、分布式锁、选举等场景都需要一个高可用、一致性强的协调服务。Apache ZooKeeper 凭…

是德科技 | 单通道448G未来之路:PAM4? PAM6? PAM8?

内容来源:是德科技 随着数据中心规模的不断扩大以及AI大模型等技术的兴起,市场对高速、大容量数据传输的需求日益增长。例如,AI训练集群中GPU等设备之间的互联需要更高的传输速率来提升效率。在技术升级方面,SerDes技术的不断进步…

OceanBase 开发者大会,拥抱 Data*AI 战略,构建 AI 数据底座

5 月 17 号以“当 SQL 遇见 AI”为主题的 OceanBase 开发者大会在广州举行,因为行程的原因未能现场参会,仍然通过视频直播观看了全部的演讲。总体来说,这届大会既有对未来数据库演进方向的展望,也有 OceanBase 新产品的发布&#…

STM32IIC协议基础及Cube配置

STM32IIC协议基础及Cube配置 一,IC协议简介1,核心特点2,应用场景 二,IC协议基础概念1,总线结构2,主从架构3,设备寻址4,起始和停止条件5,数据传输6,应答机制 三…

CNN vs ViT:图像世界的范式演进

一、图像建模,是不是也可以“大一统” 在前文中我们提到,多模态大模型打破“只能处理文字”的限制。 在 NLP 世界里,Transformer 已经证明自己是理解语言的王者。那么在图像世界,我们是否也能有一种“通用架构”,让模…

cocos creator使用jenkins打包微信小游戏,自动上传资源到cdn,windows版运行jenkins

cocos 版本2.4.11 在windows上jenkins的具体配置和部署,可参考上一篇文章cocos creator使用jenkins打包流程,打包webmobile_jenkins打包,发布,部署cocoscreator-CSDN博客 特别注意,windows上运行jenkins需要关闭windows自己的jenkins服务&a…

定时器的两种实现方式

1、基于优先级队列/堆 队列是先进先出,优先级队列是优先级越高就存放在队列之前,我们可以将过期时间越早设置为优先级越高,那么临近过期时间的任务就会在队列前面,距离过期时间越晚的任务就在队列后面。 可以分配一个线程&#…

[Java实战]Spring Boot整合MinIO:分布式文件存储与管理实战(三十)

[Java实战]Spring Boot整合MinIO:分布式文件存储与管理实战(三十) 一、MinIO简介与核心原理 MinIO 是一款高性能、开源的分布式对象存储系统,兼容 Amazon S3 API,适用于存储图片、视频、日志等非结构化数据。其核心特…

AI在人力资源领域的应用:把握时代浪潮

借鉴历史经验,引领技术变革 历史总是呈现出惊人的相似性。十年前,众多企业未能及时洞察移动技术与社交技术的潜在价值,迟迟没有将这些创新引入职场环境。随着时间推移,这些组织才意识到BYOD(自带设备办公)…