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

SpringMVC 程序开发

SpringMVC 程序开发


文章目录

  • SpringMVC 程序开发
  • 什么是SpringMVC?
    • MVC定义
    • MVC和Spring MVC的关系
  • 为什么要学Spring MVC?
  • 怎么学习Spring MVC
    • Spring MVC创建和连接
    • @RequestMapping注解
    • @RequestMapping是post还是get请求
    • 获取参数
    • 返回数据
    • @ResponseBody 说明
    • 组合注解:@RestController


什么是SpringMVC?

  1. Spring MVC 是一个 Web 框架。
  2. Spring MVC 是基于 Servlet API 构建的。

然而要真正的理解什么是 Spring MVC? 我们首先要搞清楚什么是 MVC?

MVC定义

  • 它是一种软件工程架构模式,它把系统分为模型,视图和控制器三个基本部分
    在这里插入图片描述
  • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据
  • View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的
  • Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据

MVC和Spring MVC的关系

  • MVC是一种思想,而Spring MVC是对MVC思想的具体体现
  • Spring MVC是一个实现MVC模式,并继承了Servlet API的Web框架。既然是Web框架,那么当用户在浏览器中输入url之后,我们的Spring MVC项目就可以感知到用户的请求

为什么要学Spring MVC?

大部分 Java 项目基于 Spring(或 Spring Boot),而 Spring 的核心是 Spring MVCSpring Boot 是 Spring 的脚手架,所以市面上绝大部分 Java 项目相当于 Spring MVC 项目,这是学习 Spring MVC 的原因。创建 Spring Boot 项目时勾选的 Spring Web 框架就是 Spring MVC 框架,简言之,学习 Spring MVC 是因为它是 Spring、Spring Boot 项目的基础
在这里插入图片描述

  • 简单的来说,我们之所以要学Spring MVC 是因为它是一切项目的基础,我们以后要创建的所有Spring 和 Spring Boot 项目,基本上都是基于Spring MVC的

怎么学习Spring MVC

学习 Spring MVC 我们只需要掌握以下 3 个功能:

  1. 连接的功能:将用户(浏览器)和 Java 程序连接起来,也就是访问一个地址能够调用到我们的 Spring 程序
  2. 获取参数的功能:用户访问的时候会带一些参数,在程序中要想办法获取到参数
  3. 输出数据的功能:执行了业务逻辑之后,要把程序执行的结果返回给用户
    对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC

Spring MVC创建和连接

  • Spring MVC 项目创建和 Spring Boot 创建项目相同(Spring MVC 使用 Spring Boot 的方式创建),在创建的时候选择 Spring Web 就相当于创建了 Spring MVC 的项目
  • 在 Spring MVC 中使用 @RequestMapping 来实现 URL 路由映射,也就是浏览器连接程序的作用
  • 接下来要实现的功能是访问地址:http://localhost:8080/hello/Spring,能打印“Hello,Spring”信息
  1. 创建项目
    在这里插入图片描述

  2. 代码

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/hello")
public class Hello {@RequestMapping("/Spring")public String sayHello() {System.out.println("Hello, Spring!");return "Hello, Spring!";}
}
  • 这样实现之后,当访问地址http://localhost:8080/hello/Spring之后,就能打印“Hello,Spring!”的信息

@RequestMapping注解

  • @RequestMapping 是 Spring MVC 中最核心、最基础的一个注解,它用于将 Web 请求(如 HTTP 请求)映射到特定的处理类(Controller)或处理方法上。简单来说,它告诉 Spring,当用户访问一个特定的 URL 时,应该由哪个类或哪个方法来处理这个请求

  • 可使用在类上和方法上,假如修饰的是类的话,访问地址是类➕方法。假如修饰的是方法的话,访问地址就是方法

  1. 类:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/hello")
public class Hello {@RequestMapping("/Spring")public String sayHello() {System.out.println("Hello, Spring!");return "Hello, Spring!";}
}

地址:http://localhost:8080/hello/Spring

  1. 方法:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class Hello {@RequestMapping("/Spring")public String sayHello() {System.out.println("Hello, Spring!");return "Hello, Spring!";}
}

地址:http://localhost:8080/Spring

@RequestMapping是post还是get请求

  • @RequestMapping默认是get请求,可以使用Postman进行测试
    在这里插入图片描述
  • 如何接收post请求?
 @RequestMapping(value = "/message", method = RequestMethod.POST)public String message(String name, int age) {return "Hello " + name + " " + age;}
  • @GetMapping和@PostMapping
  1. get
// 写法1
@RequestMapping("/index")// 写法2
@RequestMapping(value = "/index",method = RequestMethod.GET)// 写法3
@GetMapping("/index")
  1. post
// 写法1
@RequestMapping(value = "/index",method = RequestMethod.POST)// 写法2
@PostMapping("/index")

获取参数

  1. 传递单个参数
@RequestMapping("/m1")
public Object method_1(String name){System.out.println("参数 name: "+name);return "/index.html";
}
  1. 传递对象
@Data  
public class Person {  private int id;  private String name;  private String password;  
}@RequestMapping("/m2")
public Object method_2(Person p){System.out.println("对象中的 name: "+p.getName());System.out.println("对象中的 password: "+p.getPassword());return "/index.html";
}
  1. 表单参数传递/传递多个对象
@RequestMapping("/m3")
public Object method_3(String name, String pwd) {System.out.println("name 参数: " + name);System.out.println("pwd 参数: " + pwd);return "/index.html";
}
  1. 后端参数重命名(后端参数映射)
  • 某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传递了一个 time 给后端,而后端又是有 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值
@RequestMapping(value = "/password", method = RequestMethod.POST)public String password(@RequestParam("word") String password) {return "password " + password;}
  1. 参数是否必传
    使用required为true/false,决定是否可传
@RequestMapping(value = "/user",  method = RequestMethod.GET)public String user(@RequestParam(name = "name", required = true) String name, int age,String password) {return "user " + name + " " + age + " " + password;}
  1. @RequestBody接收JSON对象
@RequestMapping(value = "/transfer",  method = RequestMethod.POST)public String transfer(@RequestBody Person person) {return "transfer " + person.getName() + " " + person.getAge() + " " + person.getPassword();}
  1. 获取URL中的参数@PathVariable
@RequestMapping("/HHHH/{name}/{age}")public String HHHH(@PathVariable("name") String name, @PathVariable("age") int age) {return "HHHH " + name + " " + age;}
  1. 上传文件@RequestPart
@RequestMapping("/OOOO")public String OOOO(String name,@RequestPart("myfile") MultipartFile file) throws IOException {String fileName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));String filePath = ClassUtils.getDefaultClassLoader().getResource("static").getPath() + UUID.randomUUID() + fileName;file.transferTo(new File(filePath));return "OOOO " + fileName;}
  1. 获取Cookie/Session/header
@RequestMapping("/cookie")public String cookie(@CookieValue("bite")  String bite) {return "bite " + bite;}@RequestMapping("/header")public String header(@RequestHeader("bite") String bite) {return "bite " + bite;}@RequestMapping("/seesion")public String seesion(@SessionAttribute String bite) {return "bite " + bite;}

返回数据

  1. 返回静态页面
@Controller
@RequestMapping("/p")
public class PersonController {@RequestMapping("/index")public Object index(){// 执行业务...// 返回view -> index.htmlreturn "/index.html";}
}
  1. 返回text/html
@RequestMapping("/m7")
@ResponseBody
public String method_7() {return "<h1>Hello,HTML</h1>";
}
  1. 返回JSON对象
@RequestMapping("/m8")
@ResponseBody
public HashMap<String, String> method_8() {HashMap<String, String> map = new HashMap<>();map.put("Java", "Java Value");map.put("MySQL", "MySQL Value");map.put("Redis", "Redis Value");return map;
}
  1. 请求转发或请求重定向
    forward vs redirect
  • return可以返回一个视图,还可以实现跳转,跳转方式有两种:
  • forward:请求转发
  • redirect:请求重定向
// 请求重定向
@RequestMapping("/index")
public String index(){return "redirect:/index.html";
}// 请求转发
@RequestMapping("/index2")
public String index2(){return "forward:/index.html";
}

二者具体区别:

  1. 请求重定向 (redirect) 将请求重新定位到资源,请求转发 (forward) 服务器端转发

  2. 请求重定向地址发生变化,请求转发地址不发生变化。

  3. 请求重定向与直接访问新地址效果一致,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问

注意⚠️:

  • 请求转发资源必须在同一目录下,否则可能无法访问
  • 但是假如使用重定向则可以访问

@ResponseBody 说明

@ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成 application/json 返回给前端。

@ResponseBody 可以用来修饰方法或者是修饰类,修饰类表示类中的所有方法都会返回 html 或者 json,而不是视图。

组合注解:@RestController

@RestController = @Controller + @ResponseBody


文章转载自:

http://OiiQyhfF.wdskL.cn
http://nkiUOddA.wdskL.cn
http://9MoEt4vk.wdskL.cn
http://fPx2lGRv.wdskL.cn
http://cNPWu1Vt.wdskL.cn
http://40WP4zQ2.wdskL.cn
http://pkcfedjn.wdskL.cn
http://OTJhQT9m.wdskL.cn
http://uXUYGxGb.wdskL.cn
http://Gf7qiq2W.wdskL.cn
http://T63L7XYb.wdskL.cn
http://DyvVMEjE.wdskL.cn
http://5jiztHps.wdskL.cn
http://8OEM5biP.wdskL.cn
http://RplYkCk5.wdskL.cn
http://kUS93Noe.wdskL.cn
http://SPiut926.wdskL.cn
http://LgZP0NUD.wdskL.cn
http://4RYUJ3ak.wdskL.cn
http://ows4Q2IF.wdskL.cn
http://oi84dTeR.wdskL.cn
http://xOnx7jNC.wdskL.cn
http://9XGmwYpU.wdskL.cn
http://mdzX8h9E.wdskL.cn
http://z6eedQdY.wdskL.cn
http://GFCq8l2c.wdskL.cn
http://SfnHJs0V.wdskL.cn
http://8PExybUN.wdskL.cn
http://2EOPG0WX.wdskL.cn
http://ro1Xamn1.wdskL.cn
http://www.dtcms.com/a/373423.html

相关文章:

  • 深入理解 Linux hostname 命令:从日常操作到运维实战
  • SN码追溯技术全景解析:AI时代的数字身份革命
  • AI 小白入门:探索模型上下文协议(MCP)及其前端应用
  • 代码随想录70期day5
  • Vue3源码reactivity响应式篇之reactive响应式对象的track与trigger
  • GitHub高星标项目:基于大数据的心理健康分析系统Hadoop+Spark完整实现
  • Google Guice @Inject、@Inject、@Singleton等注解的用法
  • 【MATLAB组合导航代码,平面】CKF(容积卡尔曼滤波)作为融合方法,状态量8维,观测量4维,包含二维平面上的严格的INS推导。附完整代码
  • Go Style 代码风格规范
  • Java 16 中引入的 record的基本用法
  • uni-app iOS 性能监控全流程 多工具协作的实战优化指南
  • shell 中 expect 详解
  • 告别低效:构建健壮R爬虫的工程思维
  • Ubuntu中显示英伟达显卡的工具软件或者指令
  • 银行卡号识别案例
  • 【golang学习笔记 gin 】1.2 redis 的使用
  • AI提示词(Prompt)基础核心知识点
  • VTK开发笔记(五):示例Cone2,熟悉观察者模式,在Qt窗口中详解复现对应的Demo
  • Excel 表格 - Excel 减少干扰、专注于内容的查看方式
  • Vue3 + Ant Design Vue 全局配置中文指南
  • CSS in JS 的演进:Styled Components, Emotion 等的深度对比与技术选型指引
  • 哈士奇vs网易高级数仓:数据仓库的灵魂是模型、数据质量还是计算速度?| 易错题
  • Windows 命令行:cd 命令2,切换到多级子目录
  • C++ 8
  • GD32入门到实战45--LVGL开发(Code::Blocks)之创建控件
  • 算法题(202):乌龟棋
  • 国产化服务注册与发现工具nacos安装
  • WordPress 性能优化:从插件到 CDN 的全方位缓存设置指南
  • 所有微服务部署都使用一个git地址,并且通过docker部署各个服务的情况下,如何编写mvn指令来处理各个服务。
  • 【AI】乡村振兴计划书:AI智能农业与设备研发销售一体化项目