【Spring MVC】Spring MVC基于注解的程序开发

这篇具有很好参考价值的文章主要介绍了【Spring MVC】Spring MVC基于注解的程序开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、什么是Spring MVC

 二、Spring MVC项目的创建和使用

1、实现客户端和服务器端之间的连接

1.1、RequsestMapping注解

1.2、@RequestMapper的简单使用 

1.3、使用@GetMapping和@POSTMapping注解来实现HTTP连接

三、获取参数

1、实现获取单个参数

2、实现获取对象

3、后端参数重命名(@RequestParam参数映射)

 4、@RequestParam参数必传设置

 5、接收JSON对象(@RequestBody)

6、获取URL中参数(@PathVariable)

 7、上传文件(@RequestPart)

8、获取Cookie/Session/header

四、返回数据

1、返回一个静态页面

 2、返回一个数据

 3、返回text/html

4、请求转发和请求重定向


一、什么是Spring MVC

官方的描述为Spring Web MVC是基于Servlet API的原始Web框架,从一开始就包含在Spring框架中。它的正式名称Spring Web MVC”来自它的源模块(Spring -webmvc)的名称,但它更常被称为“Spring MVC”。

理解Web框架

Web框架(Web framework)是用来进行Web应用开发的一个软件架构。主要用于动态网络开发,Web应用框架提供了一套开发和部署网站的方式。开发者基于框架实现自己的业务逻辑。使用Web框架很多的业务逻辑的功能不需要自己去完善,而是使用框架已有的功能就可以。

✨什么是MVC 

MVC是Model View Controller的缩写,它是软件工程中的一种软件件架构模式,他将一个项目分为三部分:View(试图),Controller(控制器),Model(模型)。MVC是一种思想

  • Model(模型):项目中用于处理程序数据逻辑的部分,负责在数据库中查找和存储数据。
  • View(试图):是项目中将得到的数据进行处理之后,显示给用户一个界面的部分。
  • Controller(控制器):是项目中处理用户交互的部分,负责读取用户的请求,向模型提价请求,读取模型的响应,将数据交给View部分。

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

✨MVC和Spring MVC的关系

MVC是一种思想,Spring MVC是对MVC思想的具体实现。

Spring MVC是一个实现了MVC模式,并继承了Servlwt API的Web框架。

 二、Spring MVC项目的创建和使用

Spring MVC项目的创建步骤和Spring Boot的创建步骤是相同的,我们之前创建的Spring Boot项目就相当于是一个Spring Web项目,我们在添加Spring Boot框架的时候,已经引入了Spring MVC。

下图中spring-boot-starter-web表示的就是Spring MVC框架。

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

1、实现客户端和服务器端之间的连接

1.1、RequsestMapping注解

@ResquestMapping是Spring Web应用程序中最常用到的注解之一,他是用来注册接口的的路由映射的。

路由映射:所谓的路由隐射指的就是,当用户访问一个URL时,将用户的请求对应到程序中某个类的某个方法的过程就叫做路由映射。

✨ @RequestMapping注解的参数

  • value:指定请求的实际访问地址,value属性是@RequestMapping注解的默认属性,如果只有唯一一个属性,则可以省略value字段,如果参数中有多个属性,则必须写上value属性名。
  • path:与value同义,他们在源码中相互引用,value和path都是用来作为映射使用的。
  • method:用来指定请求的类型,当在一个方法的注解@RequestMapping的参数中写道method = RequestMethod.GET表示这个方法只支持GET请求。
  • params:该属性指定,请求中必须包含params属性指定的参数时,才能执行该请求。
  • headers:该属性指定,请求中必须包含某些指定的header值,才能够让该方法处理请求。
  • consumes:指定处理请求的提交内容类型(Content-Type),才能让该方法处理请求
  • produces:指定返回的内容类型,返回的内容类型必须时request请求头中所包含的类型。这个属性还可以指定返回值的编码。

1.2、@RequestMapper的简单使用 

  • @RequestMapping既可以修饰类,也可以修饰方法,当同时修饰类和方法时,类上的@ResquestMapping注解的参数value/path,表示的是URL中的一级路由,方法上的参数的value/path表示的是URL的二级路由。
  • @RequestMapper注解默认情况下支持GET和POST请求。

🍂下面我们创建一个类,来实现客户端和Spring程序的连接,使用postman模拟客户端发送请求。验证@RequsetMapper注解既可以修饰类也可以修饰方法和@RequestMapper注解默认支持GET和POST请求。

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";
    }
}

 我们使用URL为127.0.0.1:8080/test/sayHi

1️⃣我们使用POST请求,可以收到响应。

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 2️⃣我们使用GET方法发送请求,也可以收到响应

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 🍂当然我们可以设置@RequestMapping注解的Method属性值为RequeatMethod.POST,表示这个方法只支持POST请求

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {
    //当这个注解中的参数有多个的时候,就需要添加属性名称
    @RequestMapping(value = "/sayHi",method = RequestMethod.POST)
    public String sayHi(){
        return "你好 Spring MVC";
    }
}

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 🍂@RequestMapper支持设置多级目录

@RequestMapping("/sayHi/mvc")

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 


1.3、使用@GetMapping和@POSTMapping注解来实现HTTP连接

@GetMapping注解只能实现GET请求的连接,@POSTMapping注解只能实现POST请求的连接。

🍂@GetMapping注解

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.RestController;

@RestController
@RequestMapping("/test")
public class TestController {
    @GetMapping("sayhi2")
    public String sayHi2(){
        return "你好,世界";
    }
}

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java 

 🍂@PostMapping注解

package com.example.demo.controller;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {
    @PostMapping("sayhello")
    public String sayHi2(){
        return "你好,世界";
    }
}

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 


三、获取参数

1、实现获取单个参数

1️⃣使用servlet的写法(getParameter)来实现获取单个参数


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("/test2")
public class TestController2 {
    @RequestMapping("/getname")
    public String getName(HttpServletRequest request){
        return "Name:"+ request.getParameter("name");
    }
}

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 2️⃣使用更简单的获取单个参数的方法

package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test2")
public class TestController2 {
   
    @RequestMapping("/getname2")
    public String getName2(String name){
        return "Name: "+name;
    }
}

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 


2、实现获取对象

上面获取单个参数的方式,当参数个数固定的时候可以使用,但是如果参数个数不确定,随时都需要添加参数的时候,我们这个时候可以使用获取对象的方式获取参数,前端没有对象的概念,传递的都是对象的属性,后端代码中需要创建一个(用户)类的对象,用来接收前端传过来的属性的值。

package com.example.demo.model;

import lombok.Data;

@Data
public class User {
    private int id;
    private String name;
    private String password;
    private int age;
}


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("/user")
public class UserController {

    @RequestMapping("/add")
    public User add(User user){
        return user;
    }
}

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 当前端的属性和后端中类的属性对应不全的时候,如果后端没有相应的属性,那么前端的属性赋值不到后端的代码中,如果前端没有相应的后端代码中的属性,那么后端中类的属性的值就是默认值。


3、后端参数重命名(@RequestParam参数映射)

特殊情况下,前端传递的参数key和我们后端接收的key可以不一致,比如前端传递了一个n给后端,而后端使用的时name参数来接收的,这个时候就会出现参数接收不到的问题,我们可以使用@RequestParam注解来重命名前后端的参数。


import com.example.demo.model.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/name")
    public String name(@RequestParam ("n") String name){
        return name;
    }
}

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 4、@RequestParam参数必传设置

使用@RequestParam注解之后,那么这个属性就变成了必传的参数了,不传这个参数就会报错,原因是因为@RequestParam注解中有一个required属性等于true,表示这个参数为必传的,我们只需要设置这个属性为false即可解决必传的问题。

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

    @RequestMapping("/name")
    public String name(@RequestParam (value="n",required = false) String name){
        return name;
    }

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 5、接收JSON对象(@RequestBody)

这里只需要使用@RequestBody就可以拿到前端传递的JSON对象

    @RequestMapping("/add_json")
    public User addByJson(@RequestBody User user){
        return user;
    }

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 


6、获取URL中参数(@PathVariable)

之前我们是通过URL中的查询字符串的部分获取的参数,也就是name="xxx"&id=123的部分。但是有点网站不是通过这样的方式传递参数的,就像掘金一样。访问它的有些页面时URL是这样的https://juejin.cn/user/61228381386487。他没有通过查询字符串的方式传递。

1️⃣从前端获取一个参数

    @RequestMapping("/detial/{id}")
    public Integer detail(@PathVariable("id") Integer id){
        return id;
    }

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 这里表示前端要传递的参数为id,所以这里需要使用一个{}将这个参数括起来

2️⃣表示从前端获取多参数

    @RequestMapping("/detial/{id}/{name}")
    public String detail(@PathVariable("id") Integer id,@PathVariable("name") String name){
        return "id: "+id+" "+"name: "+name;
    }

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 7、上传文件(@RequestPart)

@RequestPart用于将multiparty/form-data类型的数据映射到控制器处理方法的参数中。

    @RequestMapping("/upload")
    public String upload(@RequestPart("myfile") MultipartFile file) throws IOException {
        String path = "D:/img.png";
        file.transferTo(new File(path));
        return path;
    }
}

这里@RequestPart("file")表示从请求中获取名为"file"的文件,长传的文件将被存储在file对象中,我们可以是以哦那个file对象的方法类处理上传的文件。

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 在D盘中获取到了这个图片文件,并将图片名字改为了img

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

但是这样编写的后端代码存在问题,就是客户端每次访问服务器程序,服务器返回的图片名字都是一样的,那么在D盘中,后面获取的图片会将之前获取的覆盖掉,这是不完善的,如果在客户端点击上传的图片不同,最终服务器将不同的图片名字改成一样的,两张不同的照片只能保存其中一个。

✨下面我们来解决这个问题

这里将路径中的文件名通过生成一个全球唯一id得到的,文件类型是截取原文件的。

    @RequestMapping("/upload")
    public String upload(@RequestPart("myfile") MultipartFile file) throws IOException {
        //1、生成一个唯一的id(UUID就是全球唯一ID,他是由MAC地址+随机数+加密算法组成的,保证生成的id是全球唯一ID)
        String name = UUID.randomUUID().toString().replace("-","");
        //2、得到源文件的后缀名
        name += file.getOriginalFilename().
                substring(file.getOriginalFilename().lastIndexOf("."));
        String path = "D:/"+name;
        //将文件保存在path路径中
        file.transferTo(new File(path));
        return path;
    }

可以看见每次获取的文件名称都是不一样的,也不会将之前获取的文件覆盖掉。

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 


8、获取Cookie/Session/header

 通过@CookieValue获取Cookie

    @RequestMapping("/getcookie")
    public String getCookie(@CookieValue("java")String ck){
        return ck;
    }

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 通过@CookieValue注解类获取Session

    @RequestMapping("/getsess")
    //这里的value指的是session的名字
    public String getSess(@SessionAttribute(value="username",required = false) String username){
        return username;
    }

通过@RequestHeader获取Header

// @RequestHeader 获取 header
@RequestMapping("/header")
public String header(@RequestHeader("User-Agent") String userAgent) {
    return "User-Agent: " + userAgent;
}

四、返回数据

1、返回一个静态页面

在项目中创建一个静态的html页面。使用@Controller注解默认的是返回一个页面

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController3 {
    @RequestMapping("/hello")
    public String index(){
        return "hello.html";
    }

}

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 

 2、返回一个数据

使用@ResponseBody和@Controller注解搭配使用,让返回的值是一个数据,也可以使用组合注解@RestController注解

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
@ResponseBody
public class TestController3 {
    @RequestMapping("/hello")
    public String index(){
        return "hello.html";
    }
}

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

 3、返回text/html

可以使用组合注解@RestController也可以使用@Controller和@ResponseBody搭配使用

@RestController
public class TestController3 {
    @RequestMapping("method")
    public String method(){
        return "<h1>hello,world!</h1>";
    }

【Spring MVC】Spring MVC基于注解的程序开发,Spring,spring,mvc,java

4、请求转发和请求重定向

return不仅可以返回一个试图,还可以实现跳转,跳转的方式有两种:

  • forward是请求转发;
  • redirect是请求重定向。
// 请求重定向
@RequestMapping("/index1")
public String index1() {
    return "redirect:/index.html";
}
// 请求转发
@RequestMapping("/index2")
public String index2() {
    return "forward:/index.html";
}

✨请求重定向和请求转发的区别文章来源地址https://www.toymoban.com/news/detail-642231.html

  • 请求转发是一种服务器行为,客户端只有一次请求,服务器接收到客户端的请求之后,会先将请求转发给目标地址,在将目标地址返回的结果转发给客户端。客户端对这一切毫无感知。这就像A找B借钱,B没有,B向C借到之后,将钱给了A,整个过程A就直借了一次钱。B向C借钱A不知道。
  • 请求重定向是指服务器端接收到客户端的请求之后,会给客户端返回一个临时相应头,这个响应头中记录了,客户端需要再次发送请求(重定向)的URL地址,客户端收到地址之后,会将请求发送到新的地址上,这就是请求重定向。就像A找B借钱,B没有,但是B知道C有,B对A说C有,让A 去C哪里借,然后A去找C去借,这个过程就是请求重定向。

到了这里,关于【Spring MVC】Spring MVC基于注解的程序开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring MVC程序开发(JavaEE进阶系列3)

    目录 前言: 1.什么是Spring MVC 1.1MVC的定义 1.2MVC和Spring MVC的关系 1.3为什么要学习Spring MVC 2.Spring MVC项目的创建 3.Spring MVC框架的使用 3.1连接的功能 3.1.1@RequestMapping 3.1.2@GetMapping  3.1.3@PostMapping 3.2获取参数的功能 3.2.1获取单个参数 3.2.2获取对象 3.2.3上传文件 3.2.4获取Cookie 3.2

    2024年02月07日
    浏览(32)
  • Java EE 突击 11 - Spring MVC 程序开发 (2)

    这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架 JavaEE 进阶专栏 Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在 接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点 并且带领大家进行环境的配置 , 让大家真正用好

    2024年02月13日
    浏览(54)
  • Java EE 突击 10 - Spring MVC 程序开发 (1)

    这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架 JavaEE 进阶专栏 Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在 接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点 并且带领大家进行环境的配置 , 让大家真正用好

    2024年02月13日
    浏览(37)
  • Spring MVC 三 :基于注解配置

    Servlet3.0 Servlet3.0是基于注解配置的理论基础。 Servlet3.0引入了基于注解配置Servlet的规范,提出了可拔插的ServletContext初始化方式,引入了一个叫ServletContainerInitializer的接口。 An instance of the ServletContainerInitializer is looked up via the jar services API by the container at container / application sta

    2024年02月11日
    浏览(25)
  • 【Spring MVC】Spring MVC的功能使用和相关注解介绍

    Spring MVC主要有三个功能: 连接 获取参数 输出数据 对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了Spring MVC。 连接的功能:将⽤户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的Spring 程序。 先创建一个SpringMVC项目,过程和SpringBoot项目创建相

    2024年02月16日
    浏览(27)
  • 【Spring】— Spring MVC的注解

    1.DispatcherServlet DispatcherServlet的全名: org.Springframework.web.servlet.DispatcherServlet 它在程序中充当着前端控制器的角色。 【示例】在使用DispatcherServlet时,只需将其配置在项目的web.xml文件中,其配置代码如下。 在上述代码中, load-on-startup 元素和 init-param 元素都是可选的。如果 lo

    2024年02月10日
    浏览(24)
  • 【Spring MVC】快速学习使用Spring MVC的注解及三层架构

    💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【Spring MVC】快速学习使用Spring MVC的注解及三层架构 🎉欢迎大家点赞👍评论📝收藏⭐文章 SpringWebMVC是基于ServletAPI构建的原始Web框架,从⼀开始就包含在Spring框架中。它的正式名称“SpringWebMVC”来⾃其源模块的名称(Spri

    2024年04月17日
    浏览(30)
  • Spring MVC常用注解

    @PathVariable、@RequestBody和@RequestParam @PathVariable、@RequestBody和@RequestParam是Spring MVC框架中用于处理请求参数的注解。 @PathVariable:用于处URL路径中的 占位符参数 。例如,对于URL /users/{id} ,其中的 {id} 是一个占位符,可以使用@PathVariable注解将其绑定到方法的参数上,如下所示:

    2024年02月09日
    浏览(28)
  • SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第五天)MyBatis的注解开发

    ​ 昨天我们深入学习了 MyBatis多表之间的关联映射,了解掌握了一对一关联映射,一对多关联映射,嵌套查询方式以及嵌套结果方式,掌握了缓存机制的一级缓存,二级缓存等概念,也使用了代码进行复现理解 。但是都是基于XML配置文件的方式来实现的,现在我们要学习一下

    2024年02月11日
    浏览(41)
  • Spring MVC 的RequestMapping注解

    作用:用于建立请求URL和处理请求方法之间的对应关系。 出现位置: 类上: 请求 URL的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的 URL 可以按照模块化管理,例如: 账户模块: /account /add /account /update /account

    2024年02月02日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包