目录
在前几节中小编给大家分享了有关于Spring Boot的项目的创建和使用,那么在接下来小编将会给大家分享一些有关于Spring MVC的的程序的开发,以及什么是Spring MVC。
Spring MVC本质是Spring Web MVC他是基于Servlet API构建的原始Web框架,从一开始就包含在Spring框架中。从上面的一段描述中我们可以看出来Spring MVC是一个Web框架,Spring MVC是基于Servlet API构建的。
MVC是Model View Controller的缩写,他是软件工程中的一种软件架构模式,他把软件系统分成为模型、视图和控制器三个基本部分。
解释:
MVC的执行流程:
MVC是一种思想,而Spring MVC是对MVC思想的具体实现。总结来说,Spring MVC是一个实现MVC模式,并继承了Servlet API的Web框架,既然是Web框架,那么当用户在浏览器中输入了url之后,我们的Spring MVC项目就可以感知到用户的请求。
现在绝大部分的Java项目都是基于Spring(或Spring Boot)的,而Spring的核心就是Spring MVC,也就是说Spring MVC是Spring框架的核心模块,而Spring Boot是Spring的脚手架,因此我们可以推断出,现在市面上绝大部分的Java项目约等于Spring MVC项目,这是我们要学习Spring MVC的原因。
和我们之前的创建Spring Boot项目的方式一样只不过是在我们选择项目依赖的时候需要对其进行多选择一个依赖,具体如下所示:
学习Spring MVC我们只需要掌握以下三个功能:
接下来我们就来实现客户端和程序之间的“连接”。
在Spring MVC中使用@RequestMapping来实现URL路由映射,也就是浏览器连接程序的作用。
它是Spring Web应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的。所谓路由映射指的是当用户在访问一个url时将用户的请求对应到某个类的某个方法的过程就叫做路由映射。
代码展示:
- package com.example.demo.controller;
-
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- @RestController
- @RequestMapping("/test")
- public class TestController {
- @RequestMapping("/sayhi")
- public String sayHi() {
- return "你好 Spring MVC";
- }
- }
结果展示:
注意:从上面的代码中我们可以看出来@RequestMapping既可以修饰类又可以修饰方法。
那么@RequestMapping是GET请求呢还是POST氢气呢?这里我们可以使用PostMan来进行验证。
由上可以得知@RequestMapping即是GET请求又是POST请求。
使用@GetMapping实现HTTP连接,但只支持GET类型的请求。
代码展示:
- package com.example.demo.controller;
-
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.RestController;
-
- @RestController
- @RequestMapping("/test_get")
- public class GetController {
- //写法一:
- @RequestMapping("/get1")
- public String sayHi1() {
- return "你好 Spring MVC1";
- }
- //写法二:
- @RequestMapping(value = "/get2",method = RequestMethod.GET)
- public String sayHi2() {
- return "你好 Spring MVC2";
- }
-
- //写法三:
- @GetMapping("/get3")
- public String sayHi3() {
- return "你好 Spring MVC3";
- }
- }
结果展示:
同样我们也可以使用PostMan来进行验证一下看是不是只是支持GET请求。
当我们发送的是一个GET请求的时候是可以访问到的。
当我们发送的是POST的时候就访问不到了,所以证明了当我们使用@GetMapping的时候确实是只是支持GET类型的。
使用@PostMapping实现HTTP连接,但只支持POST类型的请求。
代码展示:
- package com.example.demo.controller;
-
- import org.springframework.web.bind.annotation.*;
-
- @RestController
- @RequestMapping("test_post")
- public class PostController {
- //写法一:
- @RequestMapping("/post1")
- public String sayHi1() {
- return "你好 Spring MVC1";
- }
- //写法二:
- @RequestMapping(value = "/post2",method = RequestMethod.POST)
- public String sayHi2() {
- return "你好 Spring MVC2";
- }
-
- //写法三:
- @PostMapping("/post3")
- public String sayHi3() {
- return "你好 Spring MVC3";
- }
-
- }
结果展示:
注意:这里在代码中的写法一是可以通过浏览器正常访问到的,但是写法二和写法三是不可以的,因为浏览器默认是使用GET类型的。
这里虽然在浏览器上看不出来效果但是我们可以使用PostMan来进行模拟。
同样这里也可以使用PostMan来验证是否是只能使用POST。
获取单个参数时可以使用以下两种方法来进行参数的传递。
代码展示:
- package com.example.demo.controller;
-
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- import javax.servlet.http.HttpServletRequest;
-
- @RestController
- @RequestMapping("/getname")
- public class TestController2 {
- //方法一:
- @RequestMapping("/getname1")
- public String getName1(HttpServletRequest request) {
- return "Name: " + request.getParameter("name");
- }
-
- //方法二:
- @RequestMapping("/getname2")
- public String getName2(String name) {
- return "Name: " + name;
- }
- }
结果展示:
在此之前我们先来创建出一个User实体类。
代码如下所示(PS:这里我们使用了Lombok里面的@Data注解)
- package com.example.demo.model;
-
- import lombok.Data;
-
- @Data
- public class User {
- private int id;
- private String name;
- private int age;
- }
那么接下来我们就尝试着获取User这个对象。
代码展示:
- package com.example.demo.controller;
-
- import com.example.demo.model.User;
- import org.springframework.web.bind.annotation.RequestBody;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- @RestController
- @RequestMapping("/user")
- public class TestController3 {
- @RequestMapping("add1")
- public User add(User user) {
- return user;
- }
-
- @RequestMapping("/add2")
- public User addByJson(@RequestBody User user) {
- return user;
- }
- }
结果展示:
使用JSON格式的对象。
如果我们想要将一张图片上传至本地磁盘中,我们就可以使用以下的方式来进行上传。
代码展示:
- package com.example.demo.controller;
-
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestPart;
- import org.springframework.web.bind.annotation.RestController;
- import org.springframework.web.multipart.MultipartFile;
-
- import java.io.File;
- import java.io.IOException;
-
- @RestController
- @RequestMapping("/test4")
- public class TestController4 {
- @RequestMapping("/upload")
- public String upload(@RequestPart("myfile")MultipartFile file) throws IOException {
- String path = "D:\\image\\img.png";
- //保存文件
- file.transferTo(new File(path));
- return path;
- }
- }
结果展示:
在Postman中进行演示:
代码展示:
- package com.example.demo.controller;
-
- import org.springframework.web.bind.annotation.CookieValue;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- @RestController
- @RequestMapping("/Cookie")
- public class TestController5 {
-
- @RequestMapping("/getcookie")
- public String getCookie(@CookieValue(value = "java",required = false) String ck) {
- return ck;
- }
- }
注意:在上述中的代码中我们设置了@RequestParma中的required=false,这样就可以满足我们的实际业务前端的参数是一个非必传的参数了。
代码展示:
- package com.example.demo.controller;
-
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
- import org.springframework.web.bind.annotation.SessionAttribute;
-
- @RestController
- @RequestMapping("/Session")
- public class TestController6 {
- @RequestMapping("/getsession")
- public String getsession(@SessionAttribute(required = false,value = "1") String name) {
- return name;
- }
- }
代码展示:
- package com.example.demo.controller;
-
- import org.springframework.web.bind.annotation.RequestHeader;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- @RestController
- @RequestMapping("/Header")
- public class TestController7 {
- @RequestMapping("/header")
- public String header(@RequestHeader("User-Agent") String userAgent) {
- return "userAgent: " + userAgent;
- }
- }
代码展示:
- package com.example.demo.controller;
-
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- @RestController
- @RequestMapping("/url")
- public class TestController8 {
- @RequestMapping("/urlpath/{name}/{age}")
- public String geturl(@PathVariable String name, @PathVariable String age) {
- return name + age;
- }
- }
结果展示:
通过上面的学习我们知道,默认请求下无论是Spring MVC或者是Spring Boot返回的是视图(xxx.html),而现在都是前后端分离的,后端只是需要返回给前端数据即可,这个时候我们就需要使用@ResponseBody注解了。
创建一个index.html:
代码展示:
- package com.example.demo.controller;
-
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
-
- @Controller
- @RequestMapping("/p")
- public class indexController {
- @RequestMapping("/index")
- public String index(){
- return "/index.html";
- }
- @RequestMapping("/m")
- @ResponseBody
- public String index2() {
- return "
Hello Spring MVC
"; - }
- }
结果展示:
如果我们想要直接在页面中显示的就是我们返回的数据那么就可以直接使用上述的@RestController这个注解。
好了这节小编就给大分享到这里啦,希望这节对大家有关于Spring MVC的基础知识的了解有一定帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)