当前位置: 首页 > news >正文

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 服务设计。


文章转载自:

http://3fclNCPk.srrzb.cn
http://codKnBwm.srrzb.cn
http://jWhTuVil.srrzb.cn
http://yDgS8qU2.srrzb.cn
http://oZiow00H.srrzb.cn
http://3pnGZxw3.srrzb.cn
http://X2YRffx8.srrzb.cn
http://55QHIT50.srrzb.cn
http://ENb6VnRX.srrzb.cn
http://mk9rHq6D.srrzb.cn
http://5fBKDHoR.srrzb.cn
http://JGdq6wiX.srrzb.cn
http://8mDEoUdf.srrzb.cn
http://QqqwNBUJ.srrzb.cn
http://XFex2MTy.srrzb.cn
http://u8gTut66.srrzb.cn
http://a20U8zHE.srrzb.cn
http://qI4JU7bo.srrzb.cn
http://lpyzdnx5.srrzb.cn
http://ceTR3Nuc.srrzb.cn
http://cUnmQmKD.srrzb.cn
http://3Tfk9H4X.srrzb.cn
http://c1ZPDC50.srrzb.cn
http://Hrg9oYFV.srrzb.cn
http://XlZKJyZ0.srrzb.cn
http://5fJuzlDE.srrzb.cn
http://p7gUdQsS.srrzb.cn
http://xo8rtzIw.srrzb.cn
http://BzDOeHjp.srrzb.cn
http://4b9qD4r0.srrzb.cn
http://www.dtcms.com/a/386653.html

相关文章:

  • Nature Communications 北京大学联合德国马普所在触觉传感器方面取得进展,实现机器人指尖超分辨率力感知
  • 解决一次 “Failed to load model because protobuf parsing failed”:从现象到根因与修复
  • 从ppm到ppb:全面解读浓度单位转换的诀窍
  • 贪心算法应用:霍夫曼编码详解
  • NLP Subword 之 BBPE(Byte-level BPE) 算法原理
  • 【nodejs】Windows7系统下如何安装nodejs16以上版本
  • Part05 数学
  • 每天五分钟深度学习:深层神经网络的优势
  • PCGrad解决多任务冲突
  • 第十一章:游戏玩法和屏幕特效-Gameplay and ScreenEffects《Unity Shaders and Effets Cookbook》
  • Choerodon UI V1.6.7发布!为 H-ZERO 开发注入新动能
  • 科教共融,具创未来!节卡助力第十届浦东新区机器人创新应用及技能竞赛圆满举行
  • 食品包装 AI 视觉检测技术:原理、优势与数据应用解析
  • 【深度学习计算机视觉】05:多尺度目标检测之FPN架构详解与PyTorch实战
  • 从工业革命到人工智能:深度学习的演进与核心概念解析
  • [Emacs list使用及配置]
  • DQN在稀疏奖励中的局限性
  • 为何需要RAII——从“手动挡”到“自动挡”的进化
  • 第五课、Cocos Creator 中使用 TypeScript 基础介绍
  • 09MYSQL视图:安全高效的虚拟表
  • R 语言本身并不直接支持 Python 中 f“{series_matrix}.txt“ 这样的字符串字面量格式化(f-string)语法 glue函数
  • 【AI论文】AgentGym-RL:通过多轮强化学习训练大语言模型(LLM)智能体以实现长期决策制定
  • Win11本地jdk1.8和jdk17双版本切换运行方法
  • vue3 使用print.js打印el-table全部数据
  • Vue 3 + TypeScript + 高德地图 | 实战:多车轨迹回放(点位驱动版)
  • [vue]创建表格并实现筛选和增删改查功能
  • JVM-运行时内存
  • 后缀树跟字典树的区别
  • LanceDB向量数据库
  • RabbitMQ 异步化抗洪实战