【JavaEE进阶】SpringMVC中的常用注解和用法

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

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

目录

学习Spring MVC

建立连接

@RequestMapping 注解介绍

@RequestMapping 使用

传参介绍

传递单个参数

传递多个参数

传递对象

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

非必传参数设置

传递数组

传递集合

传递JSON数据

获取URL中参数@PathVariable

上传文件@RequestPart

获取Cookie/Session

响应

返回静态页面

返回数据@ResponseBody

返回HTML代码片段

返回JSON

设置状态码

设置Content-Type

总结


学习Spring MVC

当我们在浏览器中输入了url之后, Spring MVC项目就可以感知到用户的请求, 并给予响应.

学习Spring MVC, 重点也就是学习如何通过浏览器和用户程序进行交互.

主要分以下三个方面:

1.建立连接:  将用户(浏览器)和 java 程序连接起来,也就是访问一个地址能够调用到我们的Spring     程序。
2.请求: 用户请求的时候会带一些参数,在程序中要想办法获取到参数,所以请求这块主要是获取参     数的功能.
3.响应: 执行了业务逻辑之后,要把程序执行的结果返回给用户,也就是响应.

建立连接

Spring MVC中使用 @RequestMapping 来实现URL路由映射,也就是浏览器连接程序的作用
我们先来看看代码怎么写
创建一个UserController类,实现用户通过浏览器和程序的交互,具体实现代码如下:

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

@RestController
public class UserController {
    @RequestMapping("sayHi")
    public String hello() {
        return "Hello SpringMVC!";
    }
}

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

@RequestMapping 注解介绍

@RequestMapping Spring Web MVC 应用程序中最常被用到的注解之一, 它是用来注册接口的路由映射的.
表示服务收到请求时, 路径为 /sayHi 的请求就会调用 sayHi 这个方法的代码.
路由映射: 当用户访问一个URL时,将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射.

既然 @RequestMapping  已经可以达到我们的⽬的了, 我们为什么还要加 @RestController 呢? 我们把 @RestController 去掉, 再来访问⼀次:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

可以看到, 程序报了404, 找不到该页⾯.

这就是 @RestController 起到的作用.

一个项目中,会有很多类,每个类可能有很多的方法, Spring 程序怎么知道要执行哪个方法呢?
Spring 会对所有的类进行扫描,如果类加了注解 @RestController , Spring 才会去看这个类里面的方法有没有加 @RequestMapping  这个注解, 当然他的作用不止这一点,我们先学会用.

@RequestMapping 使用

@RequestMapping 既可修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是类路径+方
法路径.
@RequestMapping 标识一个类: 设置映射请求的请求路径的初始信息
@RequestMapping 标识一个方法: 设置映射请求请求路径的具体信息

@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("sayHi")
    public String hello() {
        return "Hello SpringMVC!";
    }
}

访问地址:http://127.0.0.1:8080/user/sayHi

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

注意: @RequestMappingURL 路径最前面加不加 / (斜杠)都可以, Spring 程序启动时,会进行判断,如果前面没有加 / , Spring会拼接上一个 / , 通常情况下, 我们加上/     

@RequestMappingURL 路径也可以是多层路径, 最终访问时, 依然是 类路径 + 方法路径

@RequestMapping 既支持Get请求,又支持Post请求.同理,也支持其他的请求方式.

那如何指定GET或者POST类型呢?

我们可以显示的指定@RequestMapping来接收POST的情况,如下所示: 

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

@RestController
public class UserController {
    @RequestMapping(value = "/getRequest",method= RequestMethod.POST)
    public String sayHi(){
        return "get request...";
    }
}

传参介绍

在测试传参时, 我们需要借助一个后端开发常用的接口测试工具 Postman , 这里就不对其进行过多的介绍了.

下载连接: https://www.postman.com/downloads/

为了方便演示, 下面的传参只放了其中核心部分的代码, 如下图红色框内部分:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

传递单个参数

接收单个参数,在Spring MVC中直接用方法中的参数就可以,比如以下代码:

    @RequestMapping("/r1")
    public String r1(String name) {
        return "接收到参数, name= " + name;
    }

使用 Postman 进行传参测试:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

也可使用浏览器发送请求并传参: http://127.0.0.1:8080/request/r1?name=zhangsan

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

可以看到,后端程序正确拿到了name参数的值.

Spring MVC会根据方法的参数名,找到对应的参数,赋值给方法
@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud如果参数不一致, 是获取不到参数的. 比如:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

注意事项

使用基本类型来接收参数时,参数必须传(boolean类型),否则会报500错误
类型不匹配时,会报400错误.

传递多个参数

如何接收多个参数呢?
和接收单个参数一样,直接使用方法的参数接收即可.使用多个形参.

    @RequestMapping("/r4")
    public String r4(String name, Integer age) {
        return "接收到参数, name= " + name + ", age = " + age;
    }

 使用 Postman 测试:@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置是不影响后端获取参数的结果.
 

传递对象

如果参数比较多时,方法声明就需要有很多形参. 并且后续每次新增一个参数, 也需要修改方法声明. 我们不妨把这些参数封装为一个对象.

SpringMVC 也可以自动实现对象参数的赋值,比如Student对象:

class Student {
    private Integer id;
    private String name;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

传递对象代码实现: 

    @RequestMapping("/r5")
    public String r5(Student student) {
        return "接收到参数: " + student.toString();
    }

  使用 Postman 测试:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

Spring 会根据参数名称自动绑定到对象的各个属性上, 如果某个属性未传递, 则赋值为 null (基本类型则赋值为默认初识值, 比如 int类型的属性, 会被赋值为 0)

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

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传递了一个 name 给后端,而后端是使用 username 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值.

    @RequestMapping("/r6")
    public String r6(@RequestParam("name") String username, Integer age) {
        return "接收到参数, name= " + username + ", age = " + age;
    }

  使用 Postman 测试:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

可以看到, Spring 可以正确的把浏览器传递的参数 time 绑定到了后端参数 caretetime 参数. 上
此时,如果使用 caretetime 进行参数传递呢?

使用 Postman 测试:
@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

错误日志信息为:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

控制台打印日志显示:请求参数 'username' 不存在

可以得出结论:

1.使用 @RequestParam 进行参数重命名时,请求参数只能和 @RequestParam 声明的名称一
   致,才能进行参数绑定和赋值.

2.使用 @RequestParam 进行参数重命名时,参数就变成了必传参数.
 

非必传参数设置

如果我们的实际业务前端的参数是一个非必传的参数, 针对上述问题, 如何解决呢?

先来了解下参数必传的原因,我们查看 @RequestParam 注解的实现细节就可以发现端倪,注解实现如下:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

可以看到 required 的默认值为 true ,表示含义就是:该注解修饰的参数默认为必传, 既然如此, 我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错.
具体实现如下:

    @RequestMapping("/r7")
    public String r7(@RequestParam(value = "name", required = false) String name) {
        return "接收到参数, name= " + name;
    }

可以看到,添加 required=false 之后,time 前面也加了 key ,变成了 value = "time"

注解属性赋值时,没有指明 key 的话,默认为 value 属性.

如果需要有多个属性进行赋值时,需要写上 key

传递数组

Spring MVC 可以自动绑定数组参数的赋值

后端实现代码:

    @RequestMapping("/r8")
    public String r8(int[] array) {
        return "接收到参数" + Arrays.toString(array);
    }

 使用 Postman 测试:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

传递集合

集合参数:和数组类似,同一个请求参数名有为多个,且需要使用 @RequestParam 绑定参数关系

默认情况下,请求中参数名相同的多个值,是封装到数组.如果要封装到集合,要使用@RequestParam 绑定参数关系

请求方式和数组类似:

后端接收代码:

    @RequestMapping("/r9")
    public String r9(@RequestParam List<String> list) {
        return "接收到参数" + list;
    }

 使用 Postman 测试:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

传递JSON数据

JSON的语法:

  1. 数据在键值对 (Key/Value)
  2. 数据由逗号分隔
  3. 对象用 { } 表示
  4. 数组用 [ ] 表示
  5. 值可以为对象, 也可以为数组,数组中可以包含多个对象

JSON的两种结构

1.对象: 大括号 { } 保存的对象是一个无序的键值对集合. 一个对象以左括号 { 开始,右括号 } 结束。每个"键"后跟一个冒号 : ,键值对使用逗号分隔

2.数组: 中括号 [ ] 保存的数组是值(value) 的有序集合.一个数组以左中括号 [ 开始,右中括号 ] 结束,值之间使用逗号分隔。
 

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

传递JSON对象

接收JSON对象,需要使用 @RequestBody 注解

RequestBody: 请求正文,意思是这个注解作用在请求正文的数据绑定,请求参数必须在写在请求正文中.

后端实现:

    @RequestMapping("/r10")
    public String r10(@RequestBody Student student) {
        return "接收到参数: " + student.toString();
    }

使用 Postman 来发送 json 请求参数:
@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

可以看到,后端正确接收了

通过 Fiddler 观察一下请求参数:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

如果去除掉 @RequestBody , 后端会无法给 Student 对象赋值. 这里就不给大家演示了. 
 

获取URL中参数@PathVariable

path variable: 路径变量

和字面表达的意思一样,这个注解主要作用在请求 URL 路径上的数据绑定

默认传递参数写在 URL 上,SpringMVC 就可以获取到

后端实现代码:

    @RequestMapping("/article/{articleId}/{name}")
    public String r12(@PathVariable("articleId") Integer articleId, @PathVariable("name") String name) {
        return "接收到参数, articleId:" + articleId + " , name: " + name;
    }

 使用 Postman 测试:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

可以看到,后端正确获取到了URL中的参数

参数对应关系如下:
@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

如果方法参数名称和需要绑定的 URL 中的变量名称一致时,可以简写,不用给 @PathVariable 的属性赋值,如上述例子中的 articleId 变量

如果方法参数名称和需要绑定的 URL 中的变量名称不一致时, 需要 @PathVariable 的属性 value赋值,如上述例子中的 articleName 变量.

上传文件@RequestPart

后端实现代码:

    @RequestMapping("/r13")
    public String r13(@RequestPart("file") MultipartFile imgFile) {
        String originalFilename = imgFile.getOriginalFilename();
        return "接收到文件, 文件名: " + originalFilename;
    }

使用 Postman 测试:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

获取Cookie/Session

这部分的内容比较多, 详细介绍在下一篇文章.

响应

在我们前面的代码例子中,都已经设置了响应数据, Http响应结果可以是数据,也可以是静态页面,也可以针对响应设置状态码, Header 信息等.
 

返回静态页面

创建前端页面index.html(注意路径)
@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

后端代码:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

运行结果:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

结果却发现,页面未正确返回, http 响应把 " / index. html" 当做了 http 响应正文的数据

Spring MVC 如何才能识别出来 index.html 是一个静态页面,并进行返回呢?

我们需要把 @RestController 改为@Controller

正确代码如下:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

 发现页面正确展示了:

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

@RestController和@Controller有着什么样的关联和区别呢?

咱们前面讲了MVC模式,后端会返回视图,这是早期时的概念
@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

随着互联网的发展,目前项目开发流行"前后端分离"模式, Java主要是用来做后端项目的开发,所以也就不再处理前端相关的内容了

MVC 的概念也逐渐发生了变化,View 不再返回视图,而是返回显示视图时需要的数据.

所以前面使用的 @RestController 其实是返回的数据.

@RestController = @Controller + @ResponseBody

@Controller: 定义一个控制器, Spring 框架启动时加载,把这个对象交给 Spring 管理.
@ResponseBody: 定义返回的数据格式为非视图,返回一个 text/html 信息

如果想返回视图的话, 只需要把 @ResponseBody 去掉就可以了,也就是 @Controller

返回数据@ResponseBody

我们上面讲到, @ResponseBody 表示返回数据.

@ResponseBody 既是类注解,又是方法注解

如果作用在类.上,表示该类的所有方法,返回的都是数据,如果作用在方法上,表示该方法返回的是数据.

也就是说: 在类上添加 @ResponseBody 就相当于在所有的方法上添加了 @ResponseBody 注解.

同样,如果类.上有@RestController 注解时:表示所有的方法上添加了 @ResponseBody 注解,也就是当前类下所有的方法返回值做为响应数据

如果一个类的方法里,既有返回数据的,又有返回页面的,就把 @ResponseBody 注解添加到对应的方法上即可.

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

返回HTML代码片段

后端返回数据时,如果数据中有HTML代码,也会被浏览器解析

    @ResponseBody
    @RequestMapping("/indexData2")
    public String indexData2() {
        return "<h1>我是中国人</h1>";
    }

 运行结果:@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

通过Fiddler观察响应结果,Content-Type为text/html
@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

响应中的 Content-Type 常见取值有以下几种:

text/html|: body数据格式是 HTML
text/css : body数据格式是 CSS
application/j avascript : body 数据格式是 JavaScript
application/json : body 数据格式是 JSON

返回JSON

Spring MVC 也可以返回 JSON

后端方法返回结果为对象

    @ResponseBody
    @RequestMapping("/getMap")
    public HashMap<String,String> getMap() {
        HashMap<String,String> map = new HashMap<>();
        map.put("k1","v1");
        map.put("k2","v2");
        map.put("k3","v3");
        map.put("k4","v4");
        return map;
    }

运行结果: 

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

设置状态码

Spring MVC 会根据我们方法的返回结果自动设置响应状态码,程序员也可以手动指定状态码通过Spring MVC 内置对象 HttpServletResponse 提供的方法来进行设置

    @ResponseBody
    @RequestMapping("/setStat")
    public String setStatus(HttpServletResponse response) {
        response.setStatus(500);
        return "设置状态码";
    }

状态码不会影响页面展示, 通过 FIddler 来观察设置的结果: 

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

设置Content-Type

我们通过设置 produces 属性的值,设置响应的报头Content-Type

@RequestMapping(value = "/returnJson2",produces = "application/json")
@ResponseBody
public String returnJson2() {
 return "{\"success\":true}";
}

 

总结

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud

@requestmapping配置content-type,JavaEE进阶,java-ee,java,网络,spring,maven,spring boot,spring cloud文章来源地址https://www.toymoban.com/news/detail-850807.html

到了这里,关于【JavaEE进阶】SpringMVC中的常用注解和用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • SpringMVC之@RequestMapping注解

    @RequestMapping注解 (1)@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。 (2)SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。 (3)在SpringMVC中如何被使用:浏览器发送请求,若请求地址符合前端控

    2024年02月12日
    浏览(52)
  • 详解 SpringMVC 的 @RequestMapping 注解

    @RequestMapping是一个用于映射HTTP请求到处理方法的注解,在Spring框架中使用。它可以用于控制器类和处理方法上,用来指定处理不同URL路径的请求,并定义请求的方法(GET、POST等)、请求参数、请求头等。 @RequestMapping注解的常用属性包括 : value:用于指定URL路径,可以是单个

    2024年02月11日
    浏览(37)
  • 3、SpringMVC之RequestMapping注解

    创建名为spring_mvc_demo的新module,过程参考2.1节 细节请参考2.6节 从注解名称上可以看出,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系; SpringMVC 的前端控制器(DispatcherServlet)接收到请求后,就会在映射关系中找到对应的控制器方法来处

    2024年02月08日
    浏览(39)
  • SpringMVC中@RequestMapping注解的详细说明

    @RequestMapping 是Spring MVC中一个用于映射HTTP请求和控制器方法之间关系的注解。它用于定义控制器方法如何响应特定的HTTP请求,包括GET、POST、PUT、DELETE等。以下是 @RequestMapping 注解的详细说明: 基本用法: @RequestMapping 用于注解一个控制器方法,指定该方法应该处理的请求路径

    2024年02月07日
    浏览(42)
  • SpringMVC进阶:常用注解、参数传递和请求响应以及页面跳转

    目录 一、常用注解 1.1.@RequestMapping 1.2.@RequestParam 1.3.@ModelAttribute 1.4.@SessionAttributes 1.5.@RequestBody 1.6.@RequestHeader 1.7.@PathVariable 1.8.@CookieValue 二、参数传递 2.1.基础类型+String 2.2.复杂类型 2.3.@RequestParam 2.4.@PathVariable 2.5.@RequestBody 2.6.@RequestHeader 三、返回值 3.1.void 3.2.String 3.3.String+Mod

    2024年02月09日
    浏览(42)
  • Spring MVC中的常用注解及其用法

    @RequestMappering可以作用在类上(类注解)、也可以作用在方法上(方法注解)。 @RequestMappering后面的括号中:双引号的值会赋值给value这个属性。只有一个属性且属性名为value时这个属性名可以省略不写。 @RequestMappering默认支持get/post请求,可以使用method属性来限制请求方式。 从请求

    2024年01月19日
    浏览(44)
  • javaee springMVC数字类型转换之通过注解的方式

    在属性上增加注解 @NumberFormat(pattern = “#,#.#”) 添加mvc:annotation-driven/mvc:annotation-driven

    2024年02月09日
    浏览(40)
  • javaee springMVC日期类型转换之通过注解的方式

    在spring配置文件中增加mvc:annotation-driven/mvc:annotation-driven 在属性上添加注解 @DateTimeFormat(pattern = “yyyy-MM-dd”) private Date birthday;

    2024年02月09日
    浏览(57)
  • 【JavaEE进阶】SpringMVC

    SpringMVC 是基于Java的 Web应用程序开发框架 ,它是Spring Framework的一部分。它提供了一种基于 模型-视图-控制器 (Model-View-Controller,MVC)架构的方式来开发灵活、可扩展的Web应用程序。 SpringMVC框架通过将请求的处理流程划分为三个核心组件来实现MVC架构: 模型(Model):模型表

    2024年02月12日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包