当前位置: 首页 > news >正文

StringMVC

目录

一,MVC定义

二,SpringMVC的基本使用 

2.1建立连接 - @RequestMapping("/...")

​编辑

2.2请求

1.传递单个参数

2.传递多个参数

3.传递对象

4.参数重命名

5.传递数组

6. 传递集合

7.传递JSON数据

8. 获取url中数据

9. 传递文件

10.获取Cookie

11.获取session

12.获取header

​编辑

2.3响应

1.返回静态页面

2.返回html片段

3. 返回JSON

 4.设置状态码

5.设置Header


一,MVC定义

MVC,英文名Model-View-Controller,是软件工程中的一种软件架构模式。MVC模式分离了应用程序的数据访问,用户界面,和处理逻辑。

  • Model(模型)模型是用来处理数据和业务逻辑,在MVC 模式中,模型与视图是分离的,模型并不知道视图的存在。
  • View(视图)视图是用户看到和交互的界面,例如网页,窗口等。视图通常是动态生成的。
  • Controller(控制器)控制器接收用户的请求,并调用模型和视图去完成用户的需求。控制器本身不输出任何东西和做任何处理,它只是接收请求并决定调用哪个模型构件和哪个视图来处理请求。

二,SpringMVC的基本使用 

学习Spring MVC 就是学习如何通过浏览器和用户程序进行交互,主要分为一下三个方面:

  1. 建立连接:将浏览器于Java程序连接起来,就是访问一个网址能调用Spring程序
  2. 接收请求:用户请求可能会带一些参数,要学会在程序中接收这些参数
  3. 返回响应:直接完业务逻辑后,要将程序运行的结果返回给用户

2.1建立连接 - @RequestMapping("/...")

@RequestMapping 注解是用来注册接口的路由映射的。表示服务接收到请求时,路径为 /... 的请求会调用对应的方法。

该注释既可以修饰方法也可以修饰类,如果两者同时加注释的话,它的访问地址就是 类路径 + 方法路径,举个例子:

@RestController
@RequestMapping("/test")
public class Test {@RequestMapping("/hello")public String test1(){return "hello world!";}
}
//这里的路径是指:类路径(/test)+ 方法路径(/hello)

@RequestMapping注释既支持post请求也支持get请求,也可以限定只支持其中一个请求方式,代码如下:

@RestController
@RequestMapping("/test")
public class Test {//如果只有一个参数,就会默认赋值给value这个属性,如果有多个参数,就需要属性名 = ...//此处表示只支持post请求@RequestMapping(value = "/hello",method = RequestMethod.POST)public String test1(){return "hello world!";}
}

2.2请求

一般的参数名要与请求中给的数据一致

1.传递单个参数

    @RequestMapping("/r1")public String r1(String name){return "name = " + name;}

2.传递多个参数

    @RequestMapping("/r2")public String r2(String name, Integer age){return "name = " + name+", age = " + age;}

3.传递对象

    @RequestMapping("/r3")public String r3(User user){//User是单独创建的一个对象,需要有构造方法和get()return user.toString();}

4.参数重命名

当请求中的给的名称与参数名不一致时,可以使用 @RequestParam注解

    @RequestMapping("/r4")public String r4(@RequestParam("name") String username, Integer age){return "name = " + username+", age = " + age;}

使用@RequestParam注解还有一点需要注意:它修饰的参数默认是必须传值的,如果没有传值,就会报错。当然也可以设置为非必传,代码如下:

    @RequestMapping("/r4")public String r4(@RequestParam(value = "name", required = false) String username, Integer age){return "name = " + username+", age = " + age;}

5.传递数组

    @RequestMapping("/r5")public String r5(int[] arr){return Arrays.toString(arr);}

有两种请求方式 :

6. 传递集合

集合参数:和数组类似, 同⼀个请求参数名有为多个, 且需要使⽤ @RequestParam 绑定参数关系
默认情况下,请求中参数名相同的多个值,是封装到数组. 如果要封装到集合,必须使用@RequestParam 绑定参数关系。
此次的请求与数组一致,就不再贴图了。
    @RequestMapping("/r6")public String r6(@RequestParam List<Integer> lst){return lst.toString();}

7.传递JSON数据

JSON就是⼀种数据格式, 有自己的格式和语法, 使用文本表示⼀个对象或数组的信息, 因此
JSON本质是字符串. 主要负责在不同的语言中数据传递和交换,它是以键值对的形式表示,主要还是表示一个对象。
JSON给的数据是在请求的正文当中,所以需要使用@RequestBody注解,被该注解修饰的参数需要到请求正文中查找对应的数据,该注释只有一个属性就是required,也就是说它也可以设置该参数是否必传。
    @RequestMapping("/r7")public String r7(@RequestBody User user){return user.toString();}

8. 获取url中数据

这里需要使用@PathVariable,该注释主要作用在url路径的数据绑定上,即默认参数写在url上。该注释也可以设置成非必传,但是一般都是默认的。

    @RequestMapping("/r8/{name}")public String r8(@PathVariable String name){return name;}

9. 传递文件

     @RequestMapping("/r9")public String r9(@RequestPart MultipartFile file) throws IOException {String filename = file.getOriginalFilename();//获取文件名file.transferTo(new File("D:/二次元/"+filename));//将文件上传到指定的路径return filename;}

10.获取Cookie

    @RequestMapping("/r10")//这里的两个参数,是spring内置的,用到的时候可以直接加上public String r10(HttpServletRequest request, HttpServletResponse response) {}//获取cookie的第一种写法,能得到所有的cookie@RequestMapping("/r10")public String r10(HttpServletRequest request) {Cookie[] cookies = request.getCookies();String res = "";for(Cookie x : cookies){res = res +  x.getName() + ":" + x.getValue();}return res;}//第二种写法,获取名为Cookie_2对应value@RequestMapping("/r11")public String r11(@CookieValue("Cookie_2") String value) {return value;}

11.获取session

    //三种方式都行@RequestMapping("/r12")public String r12(HttpServletRequest request) {HttpSession session = request.getSession();String username = (String)session.getAttribute("username");return username;}@RequestMapping("/r13")public String r13(HttpSession session) {String username = (String)session.getAttribute("username");return username;}@RequestMapping("/r14")public String r14(@SessionAttribute("username") String name) {return name;}

12.获取header

    @RequestMapping("/getHeader")public String getHeader(HttpServletRequest request){//请求头中的数据是以键值对的形式存储,所以和map的用法差不多String userAgent = request.getHeader("User-Agent");return userAgent;}@RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent") String userAgent){return userAgent;}

2.3响应

1.返回静态页面

@Controller
@RequestMapping("/demo")
public class Demo {@RequestMapping("/r1")public String r1(){return "/index.html";}
}

这里需要讲解一下@RequestController注解与@Controller注解的区别,先看一下它们的源码:

//@Controller
@Target({ElementType.TYPE})//表示能作用的目标(比如:类,方法)
@Retention(RetentionPolicy.RUNTIME)//表示生命周期
@Documented
@Component
public @interface Controller {@AliasFor(annotation = Component.class)String value() default "";
}
//@ResquestController
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {@AliasFor(annotation = Controller.class)String value() default "";
}

我们可以发现,@RequestController = @Controller + @ResponseBody,而@Controller注释只负责告诉Spring帮我们管理哪些程序,所以关键是@ResponsBody注释,它的作用是保证返回的一定是数据,如果不加该注释,那么默认返回的是一个网页。

 @ResponsBody注解既可以修饰类,也可以修饰方法,修饰类,那么该类中的所有方法都返回数据;修饰方法,表示该方法返回的数数据,当一个类中的方法既要返回数据也要返回页面时,要给该类使用@Controller注解,再给返回数据的方法加上@ResponseBody注解。

2.返回html片段

直接返回数据,spring会根据返回的结果,动态设置response的content-type

    @ResponseBody@RequestMapping("/r2")public String r2(){return "<h1>.....</h1>";}

3. 返回JSON

类和哈希都会自动转换成 json格式来返回

    @ResponseBody@RequestMapping("/r3")public User r3(){User user = new User();user.setName("zhangsan");user.setAge(18);user.setSex("男");return user;}

    @ResponseBody@RequestMapping("/r4")public Map<String, String> r4(){HashMap map = new HashMap();map.put("key", "value");map.put("zhangsan", "lisi");return map;}

 4.设置状态码

    @ResponseBody@RequestMapping("/r7")public String r7(HttpServletResponse response){response.setStatus(404);return "设置成功";}

5.设置Header

Http响应报头也会向客户端传递一些信息,比如服务程序的名称,请求资源已移动到新地址等,如:Content-Type,Local等。这些信息通过@RequestMapping注解来实现,先看看它的源码:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {String name() default "";@AliasFor("path")String[] value() default {};@AliasFor("value")String[] path() default {};RequestMethod[] method() default {};String[] params() default {};String[] headers() default {};String[] consumes() default {};String[] produces() default {};
}
  • value:指映射的URL
  • method:指请求的method类型,比如:post,get,put...
  • consumes:指处理请求(request)的提交内容类型(Content-Type)
  • produces:指返回提交内容类型,仅当request请求头中的Accept类型包含该指定类型才返回
  • params:request中必须包含某参数值时,才让该方法处理
  • header:request中必须包含某指定的header参数值时,才让该方法处理

 设置Content-Type

    @ResponseBody@RequestMapping(value = "/r9",produces = "application/json")public String r9(){return "1111";}

自定义Header:这里的key和value是可以自己随意指定的

    @ResponseBody@RequestMapping("/r10")public String r10(HttpServletResponse response) {response.setHeader("key","value");return "设置成功";}

 

相关文章:

StringMVC

目录 一&#xff0c;MVC定义 二&#xff0c;SpringMVC的基本使用 2.1建立连接 - RequestMapping("/...") ​编辑 2.2请求 1.传递单个参数 2.传递多个参数 3.传递对象 4.参数重命名 5.传递数组 6. 传递集合 7.传递JSON数据 8. 获取url中数据 9. 传递文…...

前端基础入门三大核心之HTML篇 —— SVG的viewBox、width和height:绘制矢量图的魔法比例尺【含代码示例】

前端基础入门三大核心之HTML篇 —— SVG的viewBox、width和height&#xff1a;绘制矢量图的魔法比例尺【含代码示例】 基本概念与作用viewBoxwidth和height 代码示例与实践基础示例动态调整示例 不同角度的使用思路保持比例缩放自动适应容器 实际问题与解决方案结语与讨论 在前…...

Java-Zookeeper

zookeeper是什么 一个分布式、开源的分布式应用程序协调服务&#xff0c;具有配置维护、域名服务、分布式同步、组服务等 zookeeper有哪些功能 功能简介集群管理监控节点状态、运行请求等主节点选举主节点挂掉之后会执行新主选举分布式锁zookeeper提供两种锁&#xff1a;独占…...

Godot游戏引擎有哪些优势

哈喽呀&#xff0c;大家好呀&#xff0c;淼淼又来和大家见面啦&#xff0c;众所周知在当今游戏开发领域&#xff0c;各种游戏引擎如雨后春笋般涌现&#xff0c;为开发者提供了丰富的选择。而在这些众多的选择中&#xff0c;Godot游戏引擎以其独特的特性和开放源代码的优势&…...

一张图看懂大模型性价比:能力、价格、并发量全面PK

最近&#xff0c;国内云厂商的大模型掀起一场降价风暴。火山引擎、阿里云、百度云等纷纷宣布降价&#xff0c;部分模型价格降幅据称高达99%&#xff0c;甚至还有些模型直接免费。 五花八门的降价话术&#xff0c;一眼望去遍地黄金。但事实真的如此吗&#xff1f;今天我们就拨开…...

设计井字棋游戏(一)

创建游戏登录注册窗口 用户名admin 密码admin&#xff08;可自行改变&#xff09; 主页面 1. 导包 import pickle&#xff1a;导入 pickle 模块&#xff0c;这是一个 Python 的内置模块&#xff0c;用于将 Python 对象序列化和反序列化。序列化是指将对象转换为字节流&am…...

华为手机卡顿(仅针对于部分人来说,我也不清楚是否真的有用)

关机&#xff01; 之前一段时间手机变得特别卡顿&#xff0c;然后网上搜了一堆教程一点用没有&#xff0c;结果因为昨天下午在考试所以把手机关机了一个多小时&#xff0c;再打开之后手机就变得很流畅&#xff0c;原因不详&#xff0c;但效果显著&#xff0c;如有需要可尝试一…...

7、按钮无法点击

不能点击&#xff0c;打开f12&#xff0c;删除disabled...

开源博客项目Blog .NET Core源码学习(25:App.Hosting项目结构分析-13)

本文学习并分析App.Hosting项目中后台管理页面的文章管理页面。   文章管理页面用于显示、检索、新建、编辑、删除文章数据&#xff0c;以便在前台页面的首页、文章专栏、文章详情页面显示文章数据。文章管理页面附带一新建及编辑页面&#xff0c;以支撑新建和编辑文章数据。…...

第七节 ConfigurationClassParser 源码分析

tips&#xff1a; ConfigurationClassParser 是 Springframework 中的重要类。 本章主要是源码理解&#xff0c;有难度和深度&#xff0c;也枯燥乏味&#xff0c;可以根据实际情况选择阅读。 位置&#xff1a;org.springframework.context.annotation.ConfigurationClassPars…...

零基础代码随想录【Day42】|| 1049. 最后一块石头的重量 II,494. 目标和,474.一和零

目录 DAY42 1049.最后一块石头的重量II 解题思路&代码 494.目标和 解题思路&代码 474.一和零 解题思路&代码 DAY42 1049.最后一块石头的重量II 力扣题目链接(opens new window) 题目难度&#xff1a;中等 有一堆石头&#xff0c;每块石头的重量都是正整…...

2024-5-24 石群电路-15

2024-5-24&#xff0c;星期五&#xff0c;22:15&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。今天最后一天上班&#xff0c;终于要放返校假啦&#xff0c;开心&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;不过放假也不能耽误…...

功能测试:核心原理、挑战以及解决之道

在软件开发生命周期中&#xff0c;功能测试占据了至关重要的位置。它是确保软件应用按照既定的要求和规格运行的关键测试阶段。功能测试的目的在于验证软件的功能、行为和用户界面等是否达到了业务需求的标准。本文将深入探讨功能测试的概念&#xff0c;执行过程中可能遇到的挑…...

跨境电商赛道,云手机到底能不能化繁为简?

当下国内电商背景&#xff1a; 从零售额的数据来看&#xff1a;随着互联网的普及和消费者购物习惯的改变&#xff0c;国内电商市场规模持续扩大。据相关数据显示&#xff0c;网络消费亮点纷呈&#xff0c;一季度全国网上零售额达到了3.3万亿元&#xff0c;同比增长12.4%。这表…...

linux:信号深入理解

文章目录 1.信号的概念1.1基本概念1.2信号的处理基本概念1.3信号的发送与保存基本概念 2.信号的产生2.1信号产生的五种方式2.2信号遗留问题(core,temp等) 3.信号的保存3.1 信号阻塞3.2 信号特有类型 sigset_t3.3 信号集操作函数3.4 信号集操作函数的使用 4.信号的处理4.1 信号的…...

Android系统的/etc/mkshrc文件

/etc/mkshrc 文件是用于配置 mksh&#xff08;MirBSD Korn Shell&#xff09;环境的启动脚本。mksh 是 Android 默认使用的 shell&#xff0c;在 shell 启动时会读取并执行这个文件中的配置。以下是关于 /etc/mkshrc 文件的详细信息及其用途。 /etc/mkshrc 文件的作用 环境配…...

LeetCode199二叉树的右视图

题目描述 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 解析 这一题的关键其实就是找到怎么去得到当前是哪一层级&#xff0c;可以利用队列对二叉树进行层次遍历&#xff0c;但…...

JavaScript 基础

一 JavaScript 的书写形式 1.1 行内式 <input type"button" value"点我一下" onclick"alert(hello akai);" > 注意,JS 中的字符串常量可以用单引号表示,也可以使用双引号表示.HTML 中推荐使用双引号,JS 中推荐使用单引号(使用双引号容易…...

DOS学习-目录与文件应用操作经典案例-type

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 1. 查看文本文件内容 2. 同时查看多个文本文件内容 3. 合并文…...

QT教程-一,初识QT

目录 一,QT是什么&#xff1f;能够使用它做什么&#xff1f; 二&#xff0c;Qt 能够使用的语言 三&#xff0c;Qt主要用于什么领域&#xff1f; 四&#xff0c;Qt开发的软件 一,QT是什么&#xff1f;能够使用它做什么&#xff1f; Qt是一个跨平台的 C 开发库&#xff0c;主…...

SpringBoot搭建Eureka注册中心

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 1、Spring-Cloud Euraka介绍 Spring-Cloud Euraka是Spring Cloud集合中一…...

day 38 435.无重叠区间 763.划分字母区间 56. 合并区间 738.单调递增的数字 968.监控二叉树

435.无重叠区间 思路 为了使区间尽可能的重叠所以排序来使区间尽量的重叠&#xff0c;使用左边界排序来统计重叠区间的个数与452. 用最少数量的箭引爆气球恰好相反。 代码 class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals,(a,…...

ssm/springoot养老院问诊服务预约系统_96316老年人服务系统

2.管理员&#xff1a; &#xff08;1&#xff09;登入注册页面&#xff1a;管理员进行操作时需要是已注册登入的 &#xff08;2&#xff09;权限管理&#xff1a;管理员登入后可以运用权限进行相应的操作管理。 &#xff08;3&#xff09;用户管理&#xff1a;对用户进行删除、…...

WordPress插件优化对提升性能有多大影响?

WordPress插件优化对提升性能的影响可以是非常显著的。插件是WordPress平台的一个重要组成部分&#xff0c;它们可以增强网站的功能和定制性。然而&#xff0c;如果插件没有经过优化&#xff0c;它们可能会成为网站性能的瓶颈。 通过优化插件&#xff0c;可以减少对服务器资源…...

Servlet的response对象

目录 HTTP响应报文协议 reponse继承体系 reponse的方法 响应行 public void setStatus(int sc) 响应头 public void setHeader(String name, String value) 响应体 public java.io.PrintWriter getWriter() public ServletOutputStream getOutputStream() 请求重定…...

Unity射击游戏开发教程:(20)增加护盾强度

在本文中,我们将增强护盾,使其在受到超过 1 次攻击后才会被禁用。 Player 脚本具有 Shield PowerUp 方法,我们需要调整盾牌在被摧毁之前可以承受的数量,因此我们将声明一个 int 变量来设置盾牌可以承受的击中数量。...

初识C语言——第二十八天

代码练习1&#xff1a; 用函数的方式实现9*9乘法表 void print_table(int n) {int i 0;int j 0;for (i 1; i< n; i){for (j 1; j< i; j){printf("%d*%d%-3d ", i, j, i * j);}printf("\n");}}int main() {int n 0;scanf("%d", &a…...

Android NDK系列(三)输入事件分发到Native层的流程

在Android NDK系列(一)手动搭建Native Project 创建的Native工程中,是可以接收输入事件的,只需在android_main中注册输入事件的处理函数,当触摸屏幕后,handleInputEvent函数便会调用,代码如下。 static int32_t handleInputEvent(struct android_app* app, AInputEvent…...

Kafka之【生产消息】

消息&#xff08;Record&#xff09; 在kafka中传递的数据我们称之为消息&#xff08;message&#xff09;或记录(record)&#xff0c;所以Kafka发送数据前&#xff0c;需要将待发送的数据封装为指定的数据模型&#xff1a; 相关属性必须在构建数据模型时指定&#xff0c;其中…...

asp.net core接入prometheus

安装prometheus和Grafana 参考之前的文章->安装prometheus和Grafana教程 源代码 dotnet源代码 新建.net core7 web项目 修改Program.cs using Prometheus;namespace PrometheusStu01;public class Program {public static void Main(string[] args){var builder We…...