SpringMVC程序开发

前言:

📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年!

📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。

😇😇😇有兴趣的话关注博主一起学习,一起进步吧!

一、获取参数操作

1.1获取参数

1.1.1传递单个参数

在 Spring MVC 中可以直接用方法中的参数来实现传参,比如以下代码:

@RequestMapping("/m1")public Object method_1(String name){System.out.println("参数 name:"+name);return "/index.html";}

在 postman 中访问方法:

程序的执行结果:

1.1.2传递对象

并且 Spring MVC 可以自动实现参数对象的赋值,比如 Person 对象:

@RestController
@RequestMapping("/test2")
public class TestController {@RequestMapping("/getName3")public String getName3(String name,int age){return "Name:"+name+",age:"+age;}
}

 由于不是通过对象的方式传递,若后期参数发生变化,导致代码会报错,所以代码的维护性不是特别好。那如何接收对象呢?

@Data
public class User {private int id;private String name;private String password;private int age;
}
@RestController
@RequestMapping("/test2")
public class TestController {@RequestMapping("/getName3")public String getName3(String name,int age){return "Name:"+name+",age:"+age;}
}

通过属性值和传递值进行对比,如果相互匹配则进行赋值。而多余的属性是无法进行赋值的---》提升了开发的效率。

1.1.3表单参数传递/传递多个参数(非对象)

通过postman实现:

1.1.4后端参数重命名(后端参数映射)

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传递了一个time 给后端,而后端又是有 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值。

@RequestMapping("/name")public String name(@RequestParam("n") String name){return name;}

 

此处必须传n,传name=李四会报错。 此时如何解决呢?

@RequestMapping("/name")public String name(@RequestParam(value = "n",required = false) String name){return name;}

 

 1.1.5@RequestBody 接收JSON对象

JSON对象:对于前端来说就是JSON对象

对象:是具有多个属性值的

如何传递JSON对象? 

//获取前端json对象@RequestMapping("/add_json")public User addByJson(@RequestBody User user){return user;}

框架判断并转换为相应的类型 

1.1.6获取URL中参数@PathVariable

//从Path中取到该变量赋值给aid@RequestMapping("/detail/{aid}")public Integer detail(@PathVariable("aid") Integer aid){return aid;}

 获取多个参数:

@RequestMapping("/detail2/{aid}/{name}")public String detail2(@PathVariable("aid")Integer aid,@PathVariable("name") String name){return "aid:"+aid+",name:"+name;}

 

1.1.7上传文件@RequestPart

@RequestMapping("/upload")public String upload(@RequestPart("myfile")MultipartFile file) throws IOException {String path="D:\\image\\img.png";//保存文件file.transferTo(new File("path"));return path;}

 

1.1.8获取Cookie/Session/header 

获取 Request 和 Response 对象

@RequestMapping("/param10")public String param10(HttpServletResponse response, HttpServletRequest requ
est) {String name = request.getParameter("name");
// 获取所有 cookie 信息Cookie[] cookies = request.getCookies();return name + " 你好.";}

传统获取 header/cookie 

@RequestMapping("/param10")@ResponseBodypublic String param10(HttpServletResponse response, HttpServletRequest requ
est) {String name = request.getParameter("name");
// 获取所有 cookie 信息Cookie[] cookies = request.getCookies();String userAgent = request.getHeader("User-Agent");return name + ":"+userAgent;}

简洁的获取 Cookie—@CookieValue 

@RequestMapping("/getcookie")public String getCookie(@CookieValue("java") String ck){return ck;}

Session 存储和获取 

//存session@RequestMapping("/set_sess")public String setSess(HttpServletRequest request){HttpSession session= request.getSession();if(session!=null){session.setAttribute("SESSION_KEY","张三");return "session set success";}else{return "session set fail";}}//获取Session@RequestMapping("/get_sess")public String getSess(@SessionAttribute(required = false,value = "SESSION_KEY")String name){return name;}

 

 简洁获取 Header—@RequestHeader

@RequestMapping("/header")@ResponseBodypublic String header(@RequestHeader("User-Agent") String userAgent) {return "userAgent:"+userAgent;}

二、返回数据操作

 2.1返回数据

//不使用RestController
@Controller
public class TestController2 {@RequestMapping("/index")public String index(){return "hello";}
}

 默认在Resource中寻找 hello.html 的页面(背景:MVC起初是前后端不分离的框架),由于没有找到,访问一级路由会发生报错:

通过创建hello.html进行验证:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>I am hello 的配置</h1>
</body>
</html>
@Controller
public class TestController2 {@RequestMapping("/index")public String index(){return "hello.html";}
}

如何返回一个数据呢?通过添加注解

@Controller
@ResponseBody
public class TestController2 {@RequestMapping("/index")public String index(){return "hello.html";}
}

 

 2.1.1实现计算器功能

可使用 postman 传递参数,或使用 form 表单的方式提交参数。前端页面:

<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.
0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>计算器示例</title>
</head>
<body>
<form action="http://localhost:8080/calc/sum"><h1>计算器</h1>数字1:<input name="num1" type="text"><br>数字2:<input name="num2" type="text"><br><input type="submit" value=" 点击相加 ">
</form>
</body>
</html>

controller 代码:

@ResponseBody
@Controller
@RequestMapping("/calc")
public class CalcController {@RequestMapping("/sum")public String sum(Integer num1,Integer num2){return String.format("<h1>计算的结果是:%d</h1><a href='javascript:history.go(-1);'>返回</a>",num1+num2);}
}

2.1.2实现登录功能,前端使用 ajax,后端返回 json 给前端。

@RequestMapping(value = "/login")@ResponseBodypublic HashMap<String,Object> login(String username, String password){HashMap<String,Object> res = new HashMap<>();int succ = 200;if(username!=null && password!=null &&username.equals("admin") && password.equals("admin")){res.put("msg","登录成功");}else{res.put("msg","登录失败");}res.put("succ",succ);return res;}

前端代码:

<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.
0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><script src="js/jquery-1.9.1.min.js"></script><title>Document</title><script>function mysub() {var username = jQuery("#username").val();var password = jQuery("#password").val();jQuery.getJSON("/user/login",{"username":username,"password":password},function (result) {if(result.succ==200){alert("返回结果:"+result.msg);}else{alert("操作失败,请重试。");}});}</script>
</head>
<body>
<div style="text-align: center;"><h1>登录</h1>用户:<input id="username"><br>密码:<input id="password" type="password"><br><input type="button" value=" 提交 " onclick="mysub()" style="margin
-top: 20px;margin-left: 50px;">
</div>
</body>
</html>

2.1.3请求转发或请求重定向(forward VS redirect)

return 不但可以返回一个视图,还可以实现跳转,跳转的方式有两种:

  • forward 是请求转发;
  • redirect:请求重定向。

请求转发和重定向的使用对比:

// 请求重定向@RequestMapping("/index")public String index(){return "redirect:/index.html";}// 请求转发@RequestMapping("/index2")public String index2(){return "forward:/index.html";}

2.1.3.1举例说明 forward 和 redirect

forward(请求转发)和 redirect(请求重定向)的区别,举例来说,例如,你告诉你妈妈,你想吃辣条,如果你妈妈,说好,我帮你去买,这就是 forward 请求转发;如果你妈妈让你自己去买,那么就是请求 redirect 重定向。

“转发”和“重定向”理解:在中国官方发布的内容越少事也越大,“转发”和“重定向”也是一样:字越少,责任越大。转发是服务器帮转的,而重定向是让浏览器重新请求另一个地址。

forward 和 redirect 具体区别如下:

1. 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
2. 请求重定向地址发生变化,请求转发地址不发生变化。
3. 请求重定向与直接访问新地址效果一直,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。

2.1.3.2请求转发 forward 导致问题演示

请求转发如果资源和转发的页面不在一个目录下,会导致外部资源不可访问,演示示例如下。
controller 示例代码:

@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping(value = "/index")public String sayHi(){return "forward:/index.html";}
}

程序的目录如下:

程序的执行结果如下:

尝试将转发 foward 换成重定向 redirect,如下代码所示: 

@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping(value = "/index")public String sayHi(){return "redirect:/index.html";}
}

页面就可以正常获取到外部资源 js 了。

2.1.4@ResponseBody 说明

@ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成
application/json 返回给前端。
@ResponseBody 可以用来修饰方法或者是修饰类,修饰类表示类中的所有方法都会返回 html 或者json,而不是视图。

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

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

相关文章

【位运算】算法实战

文章目录 一、算法原理常见的位运算总结 二、算法实战1. leetcode面试题01.01. 判断字符是否唯一2. leetcode268 丢失的数字3. leetcode371 两整数之和4. leetcode004 只出现一次的数字II5. leetcode面试题17.19. 消失的两个数字 三、总结 一、算法原理 计算机中的数据都以二进…

香港服务器怎么打开SSH

​  SSH是一种远程登录协议&#xff0c;可以通过加密方式在网络上安全地传输数据。它允许用户在远程服务器上执行命令&#xff0c;管理文件和目录&#xff0c;并进行其他系统管理任务。 如何打开SSH服务? 1.确认已安装OpenSSH服务器&#xff1a; 你可以通过命令sudoapt-geti…

开发一款AR导览导航小程序多少钱?ar地图微信小程序 ar导航 源码

随着科技的不断发展&#xff0c;增强现实&#xff08;AR&#xff09;技术在不同领域展现出了巨大的潜力。AR导览小程序作为其中的一种应用形式&#xff0c;为用户提供了全新的观赏和学习体验。然而&#xff0c;开发一款高质量的AR导览小程序需要投入大量的时间、人力和技术资源…

Sql Server导出数据库到另一个数据库

1.打开sql server数据库&#xff0c;连接到服务器后&#xff0c;找到需要导出的数据库&#xff0c;右击后选择 任务->导出数据。 2.点击 下一步。 3.身份验证可以使用SQL Server身份验证&#xff0c;就是当时建立连接时的用户名和密码&#xff0c;数据库名称使用默认的&…

Kafka生产者原理 kafka生产者发送流程 kafka消息发送到集群步骤 kafka如何发送消息 kafka详解

kafka尚硅谷视频&#xff1a; 10_尚硅谷_Kafka_生产者_原理_哔哩哔哩_bilibili ​ 1. producer初始化&#xff1a;加载默认配置&#xff0c;以及配置的参数&#xff0c;开启网络线程 2. 拦截器拦截 3. 序列化器进行消息key, value序列化 4. 进行分区 5. kafka broker集群 获取…

数据库为什么使用B+树而不是B树做索引

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

华为质量管理:从产品质量到用户体验,Kano模型成为新方向

目录 前言 华为质量管理的四个阶段 基于 IPD 如何做质量管理呢&#xff1f; CSDN相关课程 作者简介 前言 今天继续来谈谈华为流程体系中的质量管理过程。 通常来说质量具体是指产品的质量&#xff0c;也就是产品的使用价值及其属性。 产品再细分的话可以分为三个层次&a…

Python 数据分析——matplotlib 快速绘图

matplotlib采用面向对象的技术来实现&#xff0c;因此组成图表的各个元素都是对象&#xff0c;在编写较大的应用程序时通过面向对象的方式使用matplotlib将更加有效。但是使用这种面向对象的调用接口进行绘图比较烦琐&#xff0c;因此matplotlib还提供了快速绘图的pyplot模块。…

《vue3实战》在created生命周期中运用slice()方法结合element plus组件实现电影评价系统的分页

目录 前言 电影评价系统的分页是什么&#xff1f;它具体的作用体现在哪些方面&#xff1f; 一、slice的含义、语法和作用以及created的作用 slice是什么&#xff1f;slice有什么语法&#xff1f;slice的作用体现在哪些方面&#xff1f; created生命周期的作用&#xff1a;…

K8S cluster with multi-masters on Azure VM

拓扑参考&#xff1a; 在 Azure VM 实例上部署 KubeSphere 基础模板 需要修改 IP 地址和 VM Image的可以在模板中修改。 {"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#","contentVersion": &q…

云计算存储类型

一、共享存储模式 NAS: ①一种专门用于存储和共享文件的设备&#xff0c;它通过网络连接到计算机或其他设备&#xff0c; 提供了一个中心化的存储解决方案 ②存储网络使用IP网络 &#xff0c;数据存储共享基于文件 ③本质上为:NFS和CIFS文件共享服务器 ④提供的不是一个磁盘块…

python使用 flask+vue 制作前后端分离图书信息管理系统

目录标题 前言制作前后端分离图书信息管理系统的思路&#xff1a;素材代码效果展示 后端部分接口部分前端部分尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 哈喽兄弟们&#xff0c;今天咱们来用Python实现一个前后端分离的图书信息管理系统。 制作前后端分离图书信…

【IEEE会议】2023年第三届IEEE数字化社会与智能系统国际学术会议(DSInS 2023)

2023年第三届IEEE数字化社会与智能系统国际学术会议&#xff08;DSInS 2023) 2023 3rd International Conference on Digital Society and Intelligent Systems 由西南交通大学主办&#xff0c;悉尼科技大学、四川大学、中南大学社会计算研究中心、西南财经大学、武汉理工大学…

React 18 用 State 响应输入

参考文章 用 State 响应输入 React 控制 UI 的方式是声明式的。不必直接控制 UI 的各个部分&#xff0c;只需要声明组件可以处于的不同状态&#xff0c;并根据用户的输入在它们之间切换。这与设计师对 UI 的思考方式很相似。 声明式 UI 与命令式 UI 的比较 当设计 UI 交互时…

《存储IO路径》专题:数据魔法师DMA

初识DMA 大家好,今天我要给大家介绍一位在计算机世界中不可或缺的魔法师——DMA(Direct Memory Access)。让我们一起揭开这位魔法师的神秘面纱,看看它是如何让数据在内存之间自由穿梭的。 DMA这位魔法师可是大有来头。在现代计算机系统中,CPU、内存和各种设备之间需要进…

线性代数的学习和整理4: 求逆矩阵的多种方法汇总

目录 原始问题&#xff1a;如何求逆矩阵&#xff1f; 1 EXCEL里&#xff0c;直接可以用黑盒表内公式 minverse() 数组公式求A- 2 非线性代数方法&#xff1a;解方程组的方法 3 增广矩阵的方法 4 用行列式的方法计算&#xff08;未验证&#xff09; 5 A-1/|A|*A* &…

redis持久化机制 事务详解

目录 前言&#xff1a; 持久化机制 RDB&#xff08;Redis DataBase&#xff09; 手动触发 save bgsave 自动触发 RDB特点 AOF&#xff08;append only file&#xff09; 缓冲区刷新策略 重写机制 aof重写流程 混合持久化 事务 事务操作命令 WATCH WATCH实现原…

【Hello Algorithm】堆和堆排序

本篇博客简介&#xff1a; 讲解堆和堆排序相关算法 堆和堆排序 堆堆的概念堆的性质堆的表示形式堆的增加删除堆的最大值 堆排序堆排序思路时间复杂度为N的建堆方法已知一个近乎有序的数组 使用最佳排序方法排序 堆 堆的概念 这里注意&#xff01;&#xff01;&#xff01; 这…

UG\NX二次开发 使用BlockUI设计对话框时,如何设置默认的开发语言?

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,C\C++,Qt-CSDN博客 简介: NX二次开发使用BlockUI设计对话框时,如何设置默认的代码语言? 效果: 方法: 依次打开“文件”->“实用工具”->“用户默认设置”->“用户界面”->“操作记录”->“…

【WSN无线传感器网络恶意节点】使用 MATLAB 进行无线传感器网络部署研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…