SpringMVC的返回值和参数类型
传统的基于Spring Framework的web开发需要大量的 xml 配置,在有SpringBoot以后,Web开发的效
率得到了很大的提升,几乎大部分配置可以使用默认约定的规则。我们基于SpringBoot的项目来进行
SpringMVC的学习
概述
SpringMVC框架围绕 DispatcherServlet(前端控制器) 这个核心展开, DispatcherServlet 是SpringMVC框架的总导演、总策划,它负责截获请求并将其分派给相应的处理器处理。
MVC设计模式介绍
MVC(Model View Controller)是软件工程中的一种软件模式,他把软件系统分为模型、视图、控制器三个基本部分
Model(模型):是应用程序中用于处理应用程序数据逻辑的部分(通常模型对象负责在数据库中存储数据)
View(视图):是应用程序处理数据显示的部分(通常视图是依据模型数据创建)
Controller(控制器):是应用程序中处理用户交互的部分(通常负责从视图读取数据,控制用户输入,并向模型发送数据)
SpringMVC的使用
如:先在 src/main/resources/static 目录中,创建index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title><script src="index.js"type="application/javascript"></script>
</head>
<body><h1>hello world!!!</h1>
</body>
</html>
- @Controller的使用和RequestMapping的使用
@Controller
解标注是一个类的Web控制器,其和Component注解等价,只不过在Web层使用,便于区分类的作用
@ReqestMapping
在对SpringMVC进行配置的时候,需要指定请求与处理方法之间的映射关系,这时候就需要使用
@RequestMapping注解。该注解可以在控制器类的级别和其方法级别上使用
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/login")public String wb(){return "redirect:/index.html";}
}
也可以单独只在方法上使用@RequestMapping
@Controller
public class UserController {@RequestMapping("/login")public String wb(){return "redirect:/index.html";}
}
注意:@RequestMapping注解能够处理的HTTP请求方法有: GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
为了能够将一个请求映射到一个特定的HTTP方法,你需要在@RequestMapping中使用method参数声
明HTTP请求所使用的方法类型。如下示例,在 UserController 中添加请求映射方法
@Controller
public class UserController {@RequestMapping(value = "/login",method = RequestMethod.GET)public String wb(){return "redirect:/index.html";}
}
控制器方法的返回
String返回类型
- 返回 URI 资源路径的字符串,可以使用 redirect:/服务路径 表示重定向到某个路径,forward:/服务路径 表示转发到某个路径,如果前边不写默认就是转发(可参考上面的例子)。
- @RequestMapping结合@ResponseBody,返回的字符串会作为响应体内容。此时响应的Content-Type为 text/plain 普通文本。
@RequestMapping("/login2")@ResponseBodypublic String test(){return "你好,世界";}
返回普通的Java类型
- 返回类型为Object,一般使用带Getter,Setter方法的模型类
- 结合@ResponseBody使用,表示将对象序列化后的数据放在响应体返回
- 在SpringBoot中默认响应的Content-Type为 application/json
- 非字符串对象会自动序列化为 json 字符串
@RequestMapping("/login3")@ResponseBodypublic Object test1(){Map<String,Object> map = new HashMap<>();map.put("1","李逵");map.put("2",123);map.put("3","abc");return map;}
组合注解
可以使用组合注解来完成同时定义多个注解的效果,如:@RestController,@GetMapping,@PostMapping
如:当我们查看@RestController的源码的时候,发现他的注解里面又@Controller、@ResponseBody等的时候,我们就可以直接使用@RestController,这时候就无需再加上@Controller、@ResponseBody等注解,因为它里面已经包含了
如,查看@RestController源码注解
控制器方法支持的参数类型
@PathVariable参数
一般的 URI 服务路径都是固定的,SpringMVC提供了 restful 风格可以变化的 URI
@GetMapping("/name1/{username1}/name2/{username2}")@ResponseBodypublic Object test(@PathVariable String username1,@PathVariable String username2){Map<String,Object> map = new HashMap<>();map.put("1","黑旋风"+username1);map.put("2","及时雨"+username2);return map;}
注意:这里要注解标识@ResponseBody
- {}是将服务路径 URI 中的部分定义为变量,之后在方法参数中获取该路径变量
- 请求 localhost:8080/name1/李逵/name2/宋江 显示的页面内容为{ “1”: “黑旋风李逵”,“2”: "及时雨宋江})
- 变量已经定义为String,但是传入李逵和宋江这两个虽然不是字符串输入,但是会自动转换为字符串
- 变量名username1和username2要和URI中的定义名称一样
@RequestParam参数
当请求数据要绑定到某个简单对象时,可以使用@RequestParam
- URL 中的请求数据queryString
- 请求头,Content-Type为表单默认提交的格式 application/x-www-form-urlencoded ,请求体中的数据
- 请求头,Content-Type为 multipart/form-data ,请求体中的数据。 form-data 可以提交文本数据,也可以提交二进制文件
- 以上简单对象包括:基本数据类型、包装类型、MultipartFile(接收二进制文件)
示例1:
@PostMapping("/param2")public Object param2(@RequestParam(required = false) Integer count){Map<String, Integer> map = new HashMap<>();map.put("count", count);return map;}
注意:
- 这里的(required = false)为非必须写的,只不过加上它之后,就指定这个count为非必须输入
- 以上代码使用包装类型 Integer ,如果使用 int ,不传入键为 count 的请求数据就会报错,因为null 无法转换为 int。(必填的请求数据可以使用基本数据类型,可以不传的参数,都要使用包装类型。)
示例二:
通过 post 请求,使用 form-data 提交一个键为 file 的二进制文件,需要注意整个请求数据大小不能超过10m,单个文件大小不超过1m。(这是 SpringBoot 的默认设置,修改需要通过
src/main/resources/application.properties 文件配置)
@PostMapping("/param3")public Object param3(@RequestParam MultipartFile file) throws IOException {Map<String, String> map = new HashMap<>();map.put("文件名", file.getName()+", "+file.getOriginalFilename());map.put("文件类型", file.getContentType());map.put("文件大小", file.getSize()/1024+"KB");map.put("文件内容(二进制转字符串)", new String(file.getBytes()));return map;}
POJO对象(Plain Ordinary Java Object):简单的Java对象,实际就是属性提供了Getter,Setter方法的普通对象
使用 java 对象和使用@RequestParam注解非常类似,只是有点细节不同:
- @RequestParam是以方法参数变量名和传入的键对应,POJO对象作为方法参数时,是以POJO对象中的属性名对应传入的键
- @RequestParam默认必须传入该请求数据,而 POJO 对象是根据请求数据来填充属性,如果请求数据没有,则属性就是默认值(new对象时每个属性的默认值)
@PostMapping("/pojo")public Object pojo1(String username, Integer count){Map<String, String> map = new HashMap<>();map.put("用户名", username);map.put("count", String.valueOf(count));return map;}
<h3>@RequestBody</h3>
当请求的数据类型Content-Type为 application/json 时,需要显示的使用@RequestBody注解
例如:首先在example下创建一个User类
@Getter
@Setter
@ToString
public class User {private String username;private String password;
}
在请求映射方法中作为方法参数,使用RequestBody注解
@PostMapping("/json")public Object json(@RequestBody User user){Map<String, String> map = new HashMap<>();map.put("用户名", user.getUsername());map.put("密码", user.getPassword());return map;}
@RequestPart
对于请求的数据类型Content-Type为 multipart/form-data 时,二进制文件除了以上@RequestParam和 POJO 对象的方式外,还可以使用@RequestPart。
@PostMapping("/part")public Object part(User user, @RequestPart MultipartFile file) throwsIOException {Map<String, String> map = new HashMap<>();map.put("用户名", user.getUsername());map.put("密码", user.getPassword());map.put("文件名", file.getName()+", "+file.getOriginalFilename());map.put("文件类型", file.getContentType());map.put("文件大小", file.getSize()/1024+"KB");map.put("文件内容(二进制转字符串)", new String(file.getBytes()));return map; }
Servlet API
在控制器方法参数中,可以使用Servlet相关API,SpringMVC会自动将相关Servlet对象装配到方法参数
中,如 HttpServletRequest 、 HttpServletResponse 、 HttpSession 等。
@GetMapping("/servlet")public void servlet(HttpServletRequest req, HttpServletResponse resp) throwsIOException {req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");resp.setContentType("text/html");String username = req.getParameter("username");String password = req.getParameter("password");PrintWriter pw = resp.getWriter();pw.println("接收到的请求为:用户名="+username+",密码:"+password);pw.flush();pw.close();}
返回值设置为void,此时和在Servlet中开发差不多了。当然也可以使用返回值,SpringMVC会自动跳转
页面(无@ResponseBody,返回类型为String),或返回Content-Type: text/html的网页内容(使用
@ResponseBody,返回类型为String),或返回 json 字符串(@ResponseBody,返回 POJO 对象)
SpringMVC的返回值和参数类型相关推荐
- C++函数的定义、函数返回值和参数类型、函数重载、重载函数等。
一.函数 1.何为函数? 能够执行一个功能的可复用的用大括号括起来的代码块: 2.按照函数的拥有者进行分类: 预定义函数:头文件中提供的预定义函数(内置):用户可以直接调用: 自定义函数:用户根据需要 ...
- Python 函数参数有冒号 声明后有- 箭头 返回值注释 参数类型注释
在python3.7 环境下 函数声明时能在参数后加冒号,如图: 1 def f(ham: str, eggs: str = 'eggs') -> str : 2 print("Ann ...
- python冒号声明类型_Python 函数参数有冒号 声明后有- 箭头 返回值注释 参数类型注释...
在python3.7 环境下 函数声明时能在参数后加冒号,如图: 1 def f(ham: str, eggs: str = 'eggs') -> str : 2 print("Ann ...
- SpringMVC Controller 返回值的可选类型
原文地址:http://www.cnblogs.com/xiepeixing/p/4243801.html 感谢原作者! spring mvc 支持如下的返回方式:ModelAndView, Mod ...
- C#调用存储过程详解(带返回值、参数输入输出等)
C#调用存储过程详解(带返回值.参数输入输出等) 这篇文章主要介绍了C#调用存储过程的方法,结合实例形式详细分析了各种常用的存储过程调用方法,包括带返回值.参数输入输出等,需要的朋友可以参考下 本文实 ...
- c oracle存储过程返回值,C#调用存储过程详解(带返回值、参数输入输出等)
本文实例讲述了C#调用存储过程的方法.分享给大家供大家参考,具体如下: CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @stu ...
- Swift2.0语言教程之函数的返回值与函数类型
Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...
- python CV2中shape和resize返回值和参数的区别
python CV2中shape和resize返回值和参数的区别 1.在一副图像中使用shape得到一个3个类别的列表 shape[0] =图像的高 shape[1] =图像的宽 shape[2] = ...
- SpringMVC——处理方法返回值的可选类型
spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void.下面将对具体的一一进行说明: 一.Model ...
最新文章
- Spring Cloud剖析--云平台技术栈17
- android 网络加载图片点击大图后 浏览 可 缩放,Android 网络加载图片点击大图后 浏览 可 缩放...
- RPAD()和LPAD()函数进行字符串的填充
- javaweb学习总结(二十九)——EL表达式
- 访问数据库_Lua 数据库访问
- php accept-length,php中Accept-Length获取不到下载文件的大小
- Spring MVC处理用户请求的完整流程
- 分布式通用爬虫管理平台Crawlab
- Eviews9.0---软件安装
- CentOS7:Ruby安装
- ”记录集为只读“怎么解决?请高手帮忙看看。感激不尽……
- 服务器1U,2U的含义
- Ubuntu16.04发热 CPU/GPU温度比win10高解决方法
- 晨星封闭式基金9月21日业绩排行榜
- 关于出现IllegalArgumentException异常的可能原因
- SCADA/EMS系统的子系统的划分
- MOS管中有体二极管(也就是寄生二极管)原因,衬底不和S极短接,DS可以互换。如短接则不可互换
- python 操作mysql制作一个超市管理系统
- linux下使用微信web开发者工具
- 《超级处理器》介绍及下载
热门文章
- 利用数据缓存加速文件备份
- Linux学习总结(77)—— Shell 开发运维经验总结
- Maven学习总结(53)——利用Maven插件构建镜像进行持续交付中的版本号管理
- Java Web学习总结(12)——使用Session防止表单重复提交
- shell脚本样本_Shell脚本
- 中修改环境变量_系统小技巧:彻底弄懂Windows 10环境变量
- angular获取图片高宽_Angular 读书笔记
- 【sql绕过】Bypass waf notepad of def
- python django 快速实现注册,登录,注销
- TurboMail邮件服务器帮你应付电子邮件归档危机