目录
2.3?@GetMapping和@PostMapping? ?
一、什么是 SrpingMVC
SpringMVC 是基于 Servlet API 构建的原始 Web 框架,从一开始就包含在 Spring 框架中。它的正式名称为“Spring Web MVC”,通常简称为 Spring MVC。以上来自官方文档,我们可以得出:
- SpringMVC 是一个 Web 框架
- SpringMVC 是基于 Servlet API 的
为了更加理解 SpringMVC,我们需要知道什么是 MVC。
1.1 理解MVC
MVC 即 Model-View -Controller(模型、视图、控制器),它是一软件架构模式,用于分离应用程序的不同功能部分。我们可以这样理解这种模式:控制器操控模型,模型返回试图。
- Model:代表应用程序的数据结构和业务逻辑。它处理数据和业务规则。
- View:代表用户界面。它负责显示数据。
- Controller:是 Model 和 View 之间的桥梁。它处理用户的输入,更新 Model 的状态,并更新 View 来反映 Model 的变化。
在 MVC 架构中,用户与 View 交互,View 将用户的请求传递给 Controller,Controller 更新 Model 的数据,然后 Model 将数据变化通知给 View,View 进行更新显示。
综上所述,我们知道了,SpringMVC 就是实现了一个 MVC 模式,并且继承了 Servlet API 的一个 Web 框架。我们用通过在浏览器输入特定格式的 Web 网址,用户就能得到 SpringMVC 项目的反馈。
1.2 如何学SpringMVC
学习 SpringMVC 实际上就就是学习以下几个方面:
- 连接的功能:能够使得浏览器与你的Java代码连接起来。
- 获取参数的功能:用户在访问网页时能获取到用户的参数即信息。
- 输出数据的功能:执行了相应的业务代码后,得把相应的数据返回给用户。
以上三个方面掌握后,SpringMVC也就掌握的大差不差了,下面我将详细讲解这三个方面,话不多说让我们进入学习吧。
二、SpringMVC连接
2.1 创建SpringMVC项目
创建 SpringMVC 项目的方式和创建 SpringBoot 项目一样时,只不过在创建时引入了 Spring Web 依赖。创建 SpringMVC 项目的方法,在本专栏中已有讲解,或点击以下连接。
2.2 @RequestMapping注解
实现浏览器与程序的连接可用 @RequestMapping 注解,注解内设置访问的路径名称,它即可修饰类也可以修饰方法。
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/init")
public String init() {
return "This is my init.";
}
}
输入 localhost:8080/test/init 后,浏览器得到了响应。
浏览器在默认情况下使用 GET 请求来获取网页内容(也可修改为POST),此时可以通过特定条件来修改 @RequestMapping 请求类型为 POST 或 GET。
使用方式是在路径后面加入 method = RequestMethod.GET 或method = RequestMethod.POST属性,是的只能使用GET 或 POST 请求。
例如,代码设置为只能通过 GET 请求方式获取。
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping(value="/init",method = RequestMethod.GET)
public String init() {
System.out.println("This is my init.");
return "This is my init.";
}
}
此时再用 Post 方式获取时,则显示不支持。
2.3@GetMapping和@PostMapping
使用 method = RequestMethod.GET 或 POST 来指定请求访问的类型相对复杂,我们可以直接使用 @GetMapping 和 @POSTMapping 两种注解来实现。
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping("/init")
public String init(){
return "This is init.";
}
@PostMapping("/init2")
public String init2(){
return "This is init2.";
}
}
三、SpringMVC获取参数
3.1 传递参数
在上文中,我们知道了 SpringMVC 是对 ServletAPI 进行封装的一个框架,因此我们可以使用 Servlet 里面HttpServletRequest 中的getParameter() 获取请求参数的值。
使用 getParameter 方法我们可以在 URL 中自行输入数据然后浏览器拿到数据后再显示出来。
@RestController
@RequestMapping("/test2")
public class TestController2 {
@RequestMapping("getcontent")
public String init(HttpServletRequest request) {
return "Content:" + request.getParameter("content");
}
}
在 URL 栏中输入 localhost:8080/test2/getcontentcontent=Thisismycontent 后,浏览器也获取到了对应的参数:
URL中的问号()用于分隔URL的路径部分和查询字符串部分。在URL中,问号之前的部分是路径部分,表示要访问的资源位置;问号之后的部分是查询字符串,用于向服务器传递额外的参数。
更加简单的方式,我们直接用 String 即可,如下代码。
@RestController
@RequestMapping("/test2")
public class TestController2 {
@RequestMapping("getcontent")
public String init(String content) {
return "Content:" + content;
}
}
此外,传递多个对象我们也可以使用 String 类型数据即可。
@RestController
@RequestMapping("/test2")
public class TestController2 {
@RequestMapping("getcontent")
public String init(String name,String content) {
return "Content:" + name + content;
}
}
3.2传递对象
可以使用**@Data来修饰一个对象时,被@Data**所修饰的方法会自动生成 getter、setter、toString 方法,我们可以在 target 目录底下的 User 对象中查看。
注意,@Data 来自于 Lombok 需要在 idea 中下载,并在 pom.xml 中添加它的框架支持。
创建一个对象 User ,并将该对象使用 @Data 注解修饰:
package com.example.demo.model;
import lombok.Data;
@Data
public class User {
private int id;
private String name;
private int password;
}
TestController 类中就能直接使用 User 对象
package com.example.demo.controller;
import com.example.demo.model.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/add")
public User add(User user) {
return user;
}
}
我在浏览器中输入对应的 URL 地址,并在后面手动输入数据,每个字段之间使用 & 隔开。框架会将我们输入对象或者集合转化为 JSON 格式,由于上方的 User 是一个对象,因此浏览器显示的自然就是一个 JSON 格式了。
3.3后端参数映射
由于我们开发是前后端分离的,假设前端程序猿写了一份关于时间戳的代码,他把时间戳的变量名设为 t 。后端程序猿写的时间戳命名为 createtime,此时变量名不同也就后端程序猿导致接收不了。
因此,我们可以使用 @RequestParam注解来重命名我们后端的变量名。
@RequestMapping("/time")
public String time(@RequestParam("t") String createtime) {
return createtime;
}
当以上链接没有输入 t 值时,则会出现报错。那是因为 @RequestParam 注解底层默认为参数不得为空,因此我们需要设置 required = false 字段,使得 t 值默认变为“可为空”。
@RequestMapping("/time")
public String time(@RequestParam(value = "t",required = false) String createtime) {
return createtime;
}
3.4获取URL中的参数
当URL包含动态部分时,可以使用@PathVariable来获取这些动态部分的值。例如,在URL/users/{userId}
中,{userId} 是一个动态参数,可以使用**@PathVariable**来获取这个userId的值。
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/users/{userid}")
public Integer init(@PathVariable Integer userid){
return userid;
}
}
3.5上传文件
上传文件,我们使用 @RequestPart,@RequestPart注解 用于接收客户端发送的多部分请求中的单个部分。通常用于文件上传,但也可以用于其他类型的多部分请求。例如,在处理文件上传时,可以使用 @RequestPart 注解来接收名为“ file” 的请求部分,这通常是客户端上传的文件
上传文件,也用到 MultipartFile,MultipartFile 主要用来以表单的形式来上传文件。MultipartFile 中的 transferTO 方法用来接收文件传输到给定目标路径。因此,我们可以写出以下代码:
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/upload")
public String upload(@RequestPart("myfile")MultipartFile file) throws IOException {
// 本地的某个文件
String path = "D:\test\img.jpg";
// 保存文件
file.transferTo(new File(path));
return path;
}
}
使用 Postman 来模拟表单上传一个图片。
再查看 D 盘的 test 文件中已经多入了一个 img.jpg 文件。
上述的上传是固定的文件,当我们想要上传一个任意格式的文件时,我们需要:
- 生成一个全球唯一的id,使用 UUID 。
- 将生成的全球唯一id和文件名后缀拼接起来 使用 getOriginalFilename 方法。
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/upload")
public String upload(@RequestPart("myfile")MultipartFile file) throws IOException {
// 生成一个全球唯一id
String name = UUID.randomUUID().toString().replace("-","");
// 获取文件名,截取文件类型然后拼接的方式
name += (file.getOriginalFilename().
substring(file.getOriginalFilename().lastIndexOf(".")));
// 保存路径
String path = "D:\test\" + name;
// 保存文件
file.transferTo(new File(path));
return path;
}
我们可以看到再次上传成功的文件名为一串长字符,也是说明了为什么我们在网页上下载的图片也是此种情况。
3.6获取Cookie/Session/header
(1)获取 Cookie,通过 @CookieValue 注解
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/getcookie")
public String getcookie(@CookieValue(value = "java",required = false) String cook) {
return cook;
}
}
手动设置一个 Cookie ,按 F12 然后根据下图设置。
(2)获取 Session,通过 @SessionAttribute注解
@RestController
@RequestMapping("/test")
public class TestController {
private static String SESSION = "SESSION_KEY";
@RequestMapping("/set_session")
public String SetSession(HttpServletRequest request) {
HttpSession session = request.getSession();
if (session != null) {
session.setAttribute(SESSION,"李四");
return "success";
}else {
return "fail";
}
}
@RequestMapping("/get_session")
public String getSession(@SessionAttribute(value = "SESSION_KEY",required = false) String name){
return name;
}
}
(3)获取header,通过 @RequestHeader 注解
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/header")
@ResponseBody
public String header(@RequestHeader("User-Agent") String userAgent) {
return "userAgent:"+userAgent;
}
}
@Controller
public class TestController {
@RequestMapping("/index")
public String index(Model model){
return "test.html";
}
}
四、SpringMVC返回参数
4.1 返回静态页面
test.html 代码中有以内容:
<body>
<h1>Hello,SpringMVC</h1>
</body>
通过 @Controller 注解:
@Controller
public class TestController {
@RequestMapping("/index")
public String index(Model model){
return "test.html";
}
}
4.2 返回一个text/html文件
@ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成 application/json 返回给前端。
@ResponseBody 可以来修饰法或者是修饰类,修饰类表示类中的所有法都会返回 html 或者 json,不是视图。
@RestController = @Controller + @ResponseBody,因此可以使用 @RestController。
@RestController
public class TestController {
@RequestMapping("/index")
public String index(){
return "test.html";
}
}
4.3 请求转发和请求重定向
return 可以实现跳转,有两种方式:forward(请求转发)、redirect(请求重定向)。
- 转发是在服务器内部进行的,客户端不知道。转发可以将请求传递给同一服务器上的另一个资源,但也可以传递给服务器外部的资源。转发操作通常在处理过程中保持请求对象和响应对象不变。
- 重定向是一种让客户端向另一个URL发送新的请求的方法。重定向会导致浏览器发起一个新的请求,因此,之前的请求对象和响应对象不会被保留。
注意:
在使用转发时,可以通过
HttpServletRequest
对象设置属性,这些属性在转发的目标页面中可以获取到。而重定向不可以,因为重定向会导致新的请求,而请求和响应对象都已经发生改变。转发对用户来说是透明的,地址栏中的URL不会改变。而重定向会改变地址栏中的URL,显示的是新的页面地址。
转发无法重定向到外部网站,而重定向可以。
转发的速度比重定向要快,因为重定向需要发起一个新的HTTP请求。
通过上述学习,我们发现学习框架实际上就是学习框架的注解。以上的内容也是非常简单,在 SpringMVC 中还有更多注解,在以后我会慢慢更新,希望各位能够有所收获。
感谢各位的观看,本篇博客到这里就结束了。