SpringBoot MVC 快速入门
1.什么是MVC
MVC的概念
MVC(Model-View-Controller)是一种软件设计模式,用于将应用程序的逻辑、数据和用户界面分离为三个独立的部分。这种分离提高了代码的可维护性、可扩展性和可重用性。
MVC的组成部分
Model(模型)
模型负责处理数据和业务逻辑。它直接管理数据,包括数据的存储、检索和更新。模型通常与数据库交互,但不涉及用户界面的任何细节。
View(视图)
视图是用户界面的部分,负责展示数据(从模型获取)并接收用户输入。视图通常是动态生成的页面或界面组件,不包含业务逻辑。
Controller(控制器)
控制器作为模型和视图之间的桥梁,处理用户输入并更新模型或视图。它接收用户请求,调用模型处理数据,并选择适当的视图进行渲染。
2.什么是SpringMVC?
SpringMVC 的定义
SpringMVC 是 Spring 框架的一个模块,专为构建基于 Java 的 Web 应用程序而设计。它基于 Model-View-Controller (MVC) 架构模式,提供了一种结构化的方式来分离业务逻辑、数据展示和用户交互。SpringMVC 通过DispatcherServlet 作为核心控制器,协调请求处理流程,支持灵活的配置和扩展。
核心组件
- DispatcherServlet:前端控制器,接收所有请求并分发给对应的处理器。
- HandlerMapping:解析请求 URL,确定对应的控制器(Controller)。
- Controller:处理业务逻辑,返回模型数据(Model)和视图名称。
- ViewResolver:将视图名称解析为具体的视图技术(如 JSP、Thymeleaf)。
- ModelAndView:封装模型数据和视图信息的容器。
3.学习SpringMVC
主要分以下三个⽅⾯:
- 建⽴连接:将⽤⼾(浏览器)和Java程序连接起来,也就是访问⼀个地址能够调⽤到我们的 Spring 程序。
- 请求:⽤⼾请求的时候会带⼀些参数,在程序中要想办法获取到参数,所以请求这块主要是获取参数 的功能.
- 响应:执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤⼾,也就是响应
建立连接
在SpringMVC中使⽤ @RequestMapping 来实现URL路由映射,在Spring框架中@RequestMapping
是一个核心注解,用于将HTTP请求映射到特定的处理器方法或类上。
注意:以下代码可利用postman和fiddler观察,这里就不具体的演示。
简单代码示例
@RestController//后续讲解
public class headController {@RequestMapping("/hello")public String func() {return "hello";}
启动应用后,在浏览器访问http://171.0.0.1:8080/hello
即可触发该方法。
GET请求和POST请求
//方法一指定请求方法
@RequestMapping(value = "/m1" , method = RequestMethod.GET)public String func1() {return "m1";}//方法二 使用GetMapping注解@GetMapping(value = "/m4")public String func4() {return "m4";}
请求
传递单个参数
// 传递单个参数的情况下
@RequestMapping("/m5")public String func5(String name) {return "接受到的参数" + name;}
咱们使⽤浏览器发送请求并传参 http://127.0.0.1:8080/param/m5?name=spring
注意:如果使用基本类型正常传递参数的情况下为响应200;传递的参数类型不匹配的情况下会返回400;传递的参数为空时会返回500错误;使用在使用过程中包装类和基本类型需挑选使用。
传递多个参数
//传递多个参数的情况下@RequestMapping("/m7")public String func7(String name , Integer password) {return "姓名" + name + "\n" + "密码" + password;}
传递对象
现在有个user对象里面封装了对象的账号和密码
@RequestMapping("/m8")public String func8(user user1) {return user1.toString();}
后端参数重命名(后端参数映射)
使⽤ @RequestParam 来重命名前后端的参数值.
// 必传参数@RequestMapping("/m10")public String func10(@RequestParam("time") String name) {return "接受到的参数" + name;}// 非必传参数@RequestMapping("/m11")public String func11(@RequestParam(value = "time",required = false) String name) {return "接受到的参数" + name;}
使⽤浏览器发送请求并传参:http://127.0.0.1:8080/param/m10?time=2023-09-12
传递数组
@RequestMapping("/m9")public String func9(String[] array) {return "可多传参数" + Arrays.toString(array);}
数组参数:请求参数名与形参数组名称相同且请求参数为多个,后端定义数组类型形参即可接收参数
传递集合
集合参数:和数组类似,同⼀个请求参数名有为多个,且需要使⽤ @RequestParam 绑定参数关系请求⽅式和数组类似
@RequestMapping("/m9")public String method6(@RequestParam List<String> listParam){return "可多传参:"+listParam;}
传递JSON数据
JSON字符串和Java对象互转
//对象转java
// @Test
// void testObject2Json() throws JsonProcessingException {
// ObjectMapper objectMapper = new ObjectMapper();
// user user = new user("小黑",123456);
// //对象转json
// String s = objectMapper.writeValueAsString(user);
// System.out.println(s);
// }//json转对象@Testvoid testJson2Object() throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();//定义一个json字符串String s = "{\"username\":\"小黑\",\"password\":123456}";//json 转 对象user user = objectMapper.readValue(s, user.class);System.out.println(user.toString());}
传递
接收JSON对象,需要使⽤ @RequestBody 注解
// 传递json数据@RequestMapping("/m12")public String func12(@RequestBody user user) {return "接受到的参数" + user.toString();}
获取URL中参数@PathVariable
这个注解主要作⽤在请求URL路径上的数据绑定,那么我的请求参数就在问号之前了。
/获取URL中参数@PathVariable@RequestMapping("/m13/{id}/{name}")public String func13(@PathVariable Integer id , @PathVariable String name) {return " 解析参数 id:"+id+",name:"+name;}
上传⽂件@RequestPart
//上传⽂件@RequestPart@RequestMapping("/m14")public String func14(@RequestPart("file") MultipartFile file) throws IOException {String str = file.getOriginalFilename();//⽂件上传到指定路径file.transferTo(new File("D:/图片/" + file.getOriginalFilename()));return " 接收到⽂件名称为: "+ str;}
获取Cookie/Session
Cookie 是客户端存储技术,由服务器发送到用户浏览器并保存在本地的小型数据片段。每次请求时,浏览器会自动将 Cookie 附加到请求头中发送给服务器。
Session 是服务器端存储技术,用于跟踪用户状态。服务器为每个用户创建一个唯一的 Session ID,通常通过 Cookie 传递给客户端。后续请求中,客户端通过 Session ID 与服务器交互,服务器根据 ID 查找对应的用户数据。Session 数据存储在服务器内存或数据库中。
cookie其实就是我们的学生证,是在我们的手中,当我们用他在学校刷某一个需要学生证才可以完成的事情时,服务器就会接受到我们的请求,通过服务器所连接的数据库根据Session ID对我们的信息完成认证。
Cookie 和Session的区别
- Cookie是客⼾端保存⽤⼾信息的⼀种机制.Session是服务器端保存⽤⼾信息的⼀种机制.
- Cookie和Session之间主要是通过SessionId关联起来的,SessionId是Cookie和Session之间的 桥梁
- Cookie和Session经常会在⼀起配合使⽤,但是不是必须配合,完全可以⽤Cookie来保存⼀些数据在客⼾端.这些数据不⼀定是⽤⼾⾝份信息,也不⼀定是 SessionId ,Session中的sessionId也不需要⾮得通过Cookie/Set-Cookie传递,⽐如通过URL传递
获取Cookie
HttpServletRequest , HttpServletResponse 是Servlet提供的两个类,是Spring MVC⽅法的内置对象.需要时直接在⽅法中添加声明即可
HttpServletRequest 对象代表客⼾端的请求,当客⼾端通过HTTP协议访问服务器时,HTTP请 求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客⼾端请求的所有信 息
HttpServletResponse 对象代表服务器的响应.HTTP响应的信息都在这个对象中,⽐如向客⼾端发送的数据,响应头,状态码等.通过这个对象提供的⽅法,可以获得服务器响应的所有内容 Spring MVC在这两个对象的基础上进⾏了封装,给我们提供更加简单的使⽤⽅法
//获取cookie信息//HttpServletResponse response@RequestMapping("/co1")public String func15(HttpServletRequest request) {//获取所有cookieCookie[] cookie = request.getCookies();StringBuilder stringBuilder = new StringBuilder();if(cookie != null){for(Cookie cookie1 : cookie){stringBuilder.append(cookie1.getName()+":"+cookie1.getValue());}}return "cookie:"+stringBuilder;}//cookie获取简化@RequestMapping("/co2")public String func16(@CookieValue("bite") String bite) {return "bite " + bite;}
Session存储
//session存储@RequestMapping("/setSess")public String setSession(HttpServletRequest request){//获取session对象HttpSession httpSession = request.getSession();if(httpSession != null){httpSession.setAttribute("username","zhangsan");}return "session 存储成功 ";}
Session读取
//Session读取@RequestMapping("/getSess")public String getSession(HttpServletRequest request){//获取session对象,如果不存在不会自动创建HttpSession httpSession = request.getSession(false);String username = null;if(httpSession != null && httpSession.getAttribute("username") != null){username = (String) httpSession.getAttribute("username");}return "username:" + username;}//Session读取简化1@RequestMapping("/getSess1")public String getSession1(@SessionAttribute(value = "username",required = false) String username){return "username:" + username;}//Session读取简化2@RequestMapping("/getSess2")public String getSession2(HttpSession httpSession){String username = (String) httpSession.getAttribute("username");return "username:" + username;}
获取head信息
//获取head信息@RequestMapping("/head")public String func17(HttpServletRequest request){String heads = request.getHeader("User-Agent");return "请求头中ua信息为:" + heads;}//简易获取@RequestMapping("/head1")public String func18(@RequestHeader("User-Agent") String userAgent){return "userAgent:"+userAgent;}
响应
简单html代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>这是一个页面</title>
</head>
<body>Hello,Spring MVC, 我是 Index ⻚⾯
</body>
</html>
后台代码
//返回视图的方法
@Controller
//@ResponseBody // 即是类注解又是方法注解,也可以多个数据搭配使用
public class BodyContorller {@RequestMapping("/body1")public String func1(){return "/index.html";}
返回HTML代码⽚段
后端返回数据时,如果数据中有HTML代码,也会被浏览器解析
@RequestMapping("/body3")@ResponseBodypublic String func3(){return "<h1>Hello,HTML~</h1>";}
返回JSON
//也可以返回json对象@RequestMapping("/body4")@ResponseBodypublic HashMap<String, String> func4(){HashMap<String, String> map = new HashMap<>();map.put("Java", "Java Value");map.put("MySQL", "MySQL Value");map.put("Redis", "Redis Value");return map;}
设置状态码
//设置状态码@RequestMapping("/body5")@ResponseBodypublic String func5(HttpServletResponse response){response.setStatus(401);return "设置成功";}
设置Content-Type
@RequestMapping(value = "/body6",produces = "application/json")@ResponseBodypublic String func6(){return "{\"success\":true}";}
设置其他的head
@RequestMapping(value = "body7")@ResponseBodypublic String setHeader(HttpServletResponse response) {response.setHeader("MyHeader","MyHeaderValue");return " 设置 Header 成功 ";}
@Controller
和 @RestController
@Controller
和 @RestController
是 Spring MVC 中用于处理 HTTP 请求的核心注解,二者均用于标记类为控制器(Controller),但设计目标和功能存在差异。
核心功能差异
@Controller
- 传统 Spring MVC 控制器注解,通常与
@ResponseBody
结合使用。 - 返回的字符串默认解析为视图名称(View Name)
- 若需直接返回数据(如 JSON/XML),需在方法上额外添加
@ResponseBody
。
@RestController
- 是
@Controller
和@ResponseBody
的组合注解,简化了 RESTful API 开发。 - 默认将所有方法的返回值直接序列化为 HTTP 响应体(如 JSON/XML),无需显式添加
@ResponseBody
。 - 专为构建无状态、数据驱动的 Web 服务设计。