传统的基于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>
  1. @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返回类型

  1. 返回 URI 资源路径的字符串,可以使用 redirect:/服务路径 表示重定向到某个路径,forward:/服务路径 表示转发到某个路径,如果前边不写默认就是转发(可参考上面的例子)。
  2. @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的返回值和参数类型相关推荐

  1. C++函数的定义、函数返回值和参数类型、函数重载、重载函数等。

    一.函数 1.何为函数? 能够执行一个功能的可复用的用大括号括起来的代码块: 2.按照函数的拥有者进行分类: 预定义函数:头文件中提供的预定义函数(内置):用户可以直接调用: 自定义函数:用户根据需要 ...

  2. Python 函数参数有冒号 声明后有- 箭头 返回值注释 参数类型注释

    在python3.7 环境下 函数声明时能在参数后加冒号,如图: 1 def f(ham: str, eggs: str = 'eggs') -> str : 2 print("Ann ...

  3. python冒号声明类型_Python 函数参数有冒号 声明后有- 箭头 返回值注释 参数类型注释...

    在python3.7 环境下 函数声明时能在参数后加冒号,如图: 1 def f(ham: str, eggs: str = 'eggs') -> str : 2 print("Ann ...

  4. SpringMVC Controller 返回值的可选类型

    原文地址:http://www.cnblogs.com/xiepeixing/p/4243801.html  感谢原作者! spring mvc 支持如下的返回方式:ModelAndView, Mod ...

  5. C#调用存储过程详解(带返回值、参数输入输出等)

    C#调用存储过程详解(带返回值.参数输入输出等) 这篇文章主要介绍了C#调用存储过程的方法,结合实例形式详细分析了各种常用的存储过程调用方法,包括带返回值.参数输入输出等,需要的朋友可以参考下 本文实 ...

  6. c oracle存储过程返回值,C#调用存储过程详解(带返回值、参数输入输出等)

    本文实例讲述了C#调用存储过程的方法.分享给大家供大家参考,具体如下: CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @stu ...

  7. Swift2.0语言教程之函数的返回值与函数类型

    Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...

  8. python CV2中shape和resize返回值和参数的区别

    python CV2中shape和resize返回值和参数的区别 1.在一副图像中使用shape得到一个3个类别的列表 shape[0] =图像的高 shape[1] =图像的宽 shape[2] = ...

  9. SpringMVC——处理方法返回值的可选类型

    spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void.下面将对具体的一一进行说明: 一.Model ...

最新文章

  1. Spring Cloud剖析--云平台技术栈17
  2. android 网络加载图片点击大图后 浏览 可 缩放,Android 网络加载图片点击大图后 浏览 可 缩放...
  3. RPAD()和LPAD()函数进行字符串的填充
  4. javaweb学习总结(二十九)——EL表达式
  5. 访问数据库_Lua 数据库访问
  6. php accept-length,php中Accept-Length获取不到下载文件的大小
  7. Spring MVC处理用户请求的完整流程
  8. 分布式通用爬虫管理平台Crawlab
  9. Eviews9.0---软件安装
  10. CentOS7:Ruby安装
  11. ”记录集为只读“怎么解决?请高手帮忙看看。感激不尽……
  12. 服务器1U,2U的含义
  13. Ubuntu16.04发热 CPU/GPU温度比win10高解决方法
  14. 晨星封闭式基金9月21日业绩排行榜
  15. 关于出现IllegalArgumentException异常的可能原因
  16. SCADA/EMS系统的子系统的划分
  17. MOS管中有体二极管(也就是寄生二极管)原因,衬底不和S极短接,DS可以互换。如短接则不可互换
  18. python 操作mysql制作一个超市管理系统
  19. linux下使用微信web开发者工具
  20. 《超级处理器》介绍及下载

热门文章

  1. 利用数据缓存加速文件备份
  2. Linux学习总结(77)—— Shell 开发运维经验总结
  3. Maven学习总结(53)——利用Maven插件构建镜像进行持续交付中的版本号管理
  4. Java Web学习总结(12)——使用Session防止表单重复提交
  5. shell脚本样本_Shell脚本
  6. 中修改环境变量_系统小技巧:彻底弄懂Windows 10环境变量
  7. angular获取图片高宽_Angular 读书笔记
  8. 【sql绕过】Bypass waf notepad of def
  9. python django 快速实现注册,登录,注销
  10. TurboMail邮件服务器帮你应付电子邮件归档危机