Singerw's Repository Singerw's Repository
首页
  • 相关文章

    • HTML相关文章
    • CSS相关文章
    • JavaScript相关文章
  • 学习笔记

    • JavaScript笔记
    • ES6笔记
    • Vue笔记
  • 相关文章

    • Spring相关文章
    • SpringBoot相关文章
    • MyBatis相关文章
    • MySQL相关文章
  • 学习笔记

    • SpringBoot笔记
    • Spring笔记
    • MyBatis笔记
    • MySQL笔记
    • JavaWeb笔记
    • JavaCore笔记
  • 学习笔记

    • Linux笔记
    • Git笔记
    • 技术文档
  • 偏门技术

    • GitHub技巧
    • 博客搭建
    • 科学上网
  • 安装教程

    • JDK
    • MySQL
    • Node.js
    • Linux
  • 终身学习
  • 面试人生
  • 心情杂货
  • 生活随笔
  • 归档
  • 标签
GitHub (opens new window)

Singerw

谁能够凭爱意将富士山私有
首页
  • 相关文章

    • HTML相关文章
    • CSS相关文章
    • JavaScript相关文章
  • 学习笔记

    • JavaScript笔记
    • ES6笔记
    • Vue笔记
  • 相关文章

    • Spring相关文章
    • SpringBoot相关文章
    • MyBatis相关文章
    • MySQL相关文章
  • 学习笔记

    • SpringBoot笔记
    • Spring笔记
    • MyBatis笔记
    • MySQL笔记
    • JavaWeb笔记
    • JavaCore笔记
  • 学习笔记

    • Linux笔记
    • Git笔记
    • 技术文档
  • 偏门技术

    • GitHub技巧
    • 博客搭建
    • 科学上网
  • 安装教程

    • JDK
    • MySQL
    • Node.js
    • Linux
  • 终身学习
  • 面试人生
  • 心情杂货
  • 生活随笔
  • 归档
  • 标签
GitHub (opens new window)
  • 后端学习笔记

  • MySQL文章

  • SpringBoot相关文章

  • Spring文章

    • SpringMVC控制器中的注解介绍
      • 1、@RequestMapping🥇
        • @RequestMapping("/article")
        • @RequestMapping{"/article","/art"}
        • @RequestMapping六个属性
      • 2、@Controller⚡️
      • 3、@ResponseBody 👆
      • 4、@RequestBody 👆
      • 5、@RestController🍕
      • 6、@GetMapping 👿
      • 7、@PostMapping👿
      • 8、@RequestParam🎉
      • 9、@PathVariable🎉
        • 【示例1】传递参数
        • 【示例2】传递参数
        • 【示例3】传递参数
      • 10、@CookieValue❌
        • 【示例1】
        • 【示例2】
      • 11、@RequestHeader🍬
      • 12、@ModelAttribute
        • 【示例1】
        • 【示例2】
      • 13、@SessionAttributes
        • 【示例1】Session原始添加方法:
        • 【示例2】Session添加方法2:
      • 14、@SessionAttribute
    • 文件上传+SpringMVC+富文本编辑器
    • Post请求中文乱码问题
  • MyBatis文章

  • 常用jar包和工具类

  • 后端
  • Spring文章
Singerw
2021-08-26

SpringMVC控制器中的注解介绍

# SpringMVC控制器中的注解介绍

# 1、@RequestMapping🥇

@RequestMapping(method = RequestMethod.GET),这行代码即说明@GetMapping就是@RequestMapping附加了请求方法。同时,可以看到@GetMapping这个注解 是spring4.3版本引入,同时引入的还有@PostMapping、@PutMapping、@DeleteMapping和@PatchMapping,一共5个注解。

所以,一般情况下用@RequestMapping(method = RequestMethod. XXXX)即可。

# @RequestMapping("/article")

【示例】单个地址,可以在类上使用,也可以在方法上使用

@Target({ElementType.TYPE, ElementType.METHOD})
1
@Controller
@RequestMapping("/article")
public class ArticleController {

    @Autowired
    private ArticleService articleService;

    @GetMapping("/getarticle")
    public ResponseData<ArticleAndTypeDto> getAllArticle(){
        ...
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

此时@RequestMapping("/article")表示的是该控制器通用前缀名为 上下文/article.即,当我们访问getAllArticle方法的时候,不能直接使用http://localhost:8080/getarticle,而是要使用:http://localhost:8080/article/getarticle

# @RequestMapping{"/article","/art"}

【示例】可以采用这种形成编写多个地址,可以在类上使用,也可以在方法上使用

@Target({ElementType.TYPE, ElementType.METHOD})
1
@Controller
@RequestMapping{"/article","/art"}
public class ArticleController {

    @Autowired
    private ArticleService articleService;

    @GetMapping("/getarticle")
    public ResponseData<ArticleAndTypeDto> getAllArticle(){
        ...
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

此时RequestMapping{"/article","/art"}表示的是该控制器通用前缀名为多个上下文/article,/art,即当我们访问getAllArticle方法的时候:

可以使用:http://localhost:8080/article/getarticle

也可以使用:http://localhost:8080/art/getarticle

# @RequestMapping六个属性

  • value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
  • method: 指定请求的method类型, GET、POST、PUT、DELETE等;
  • consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
  • produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
  • params: 指定request中必须包含某些参数值是,才让该方法处理。
  • headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

# 2、@Controller⚡️

在默认不做其他处理的情况下,没有返回ajax请求,就是普通的转发跳转,则使用@Controller注解。

测试返回这个字符串并不是数据内容,而是一个视图!

@Controller
public class BlogController {
    @GetMapping("blog")
    public String getBlgo() {
        return "blog: id = 1 ,title = 测试";
        //return "blogList";
    }
}
1
2
3
4
5
6
7
8

# 3、@ResponseBody👆

  • 作用: 在控制器层使用 @ResponseBody返回数据 ,可以设置返回格式 application/json;
  • 如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
  • 如果方法加上了@ResponseBody注解,Spring返回值到响应体。如果这样做的话,Spring将根据请求中的 Content-Type header(私下)使用 HTTP Message converters 来将domain对象转换为响应体。
@Controller  
@RequestMapping(value = "/user/{userId}", method = RequestMethod.GET, produces="application/json")  
@ResponseBody  
public User getUser(@PathVariable String UserId, Model model) {      
    // implementation omitted  
} 
1
2
3
4
5
6

# 4、@RequestBody👆

  • 使用@RequestBody是将json格式的数据传递给方法;请求参数对象;
  • 将视图资源传递给控制器, @RequestBody控制器只接收json格式的数据
@PostMapping("/addarticle")
public AjaxOperateResponse addArticle(@RequestBody ArticleEntity article) {
    AjaxOperateResponse response = new AjaxOperateResponse(200, articleService.addArticle(article) ? "增加成功" : "增加失败");
    return response;
}
1
2
3
4
5

# 5、@RestController🍕

  • 如果希望这个控制器中所有的方法返回值都是ajax = > json,则使用@RestController注解
  • **@RestController**注解相当于@ResponseBody+@Controller合在一起的作用。
  • 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是return里的内容。
  • 如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
@RestController
public class ArticleController {

    @Autowired
    private ArticleService articleService;

    @DeleteMapping("/delarticle/{articleID}")
    public ResponseData deleteArticleByID(@PathVariable("articleID") int articleID) {
        ResponseData responseData = articleService.deleteArticleByID(articleID);
        return responseData;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 6、@GetMapping 👿

@GetMapping用于将HTTP get请求映射到特定处理程序的方法注解 具体来说,@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。该注解将HTTP Get映射到 特定的处理方法上。

@GetMapping("/getarticle")
public ResponseData<ArticleAndTypeDto> getAllArticle(
    @RequestParam(name = "page", required = true, defaultValue = "1") int page,
    @RequestParam(name = "limit", required = true, defaultValue = "10") int limit,
    @RequestParam(name = "keywords", required = true, defaultValue = "") String keywords) {
    ResponseData<ArticleAndTypeDto> articleList = articleService.getArticleList(page, limit, keywords);
    return articleList;
}
1
2
3
4
5
6
7
8

# 7、@PostMapping👿

@PostMapping用于将HTTP post请求映射到特定处理程序的方法注解 具体来说,@PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。

@PostMapping("/addarticle")
public AjaxOperateResponse addArticle(@RequestBody ArticleEntity article) {
    AjaxOperateResponse response = new AjaxOperateResponse(200, articleService.addArticle(article) ? "增加成功" : "增加失败");
    return response;
}
1
2
3
4
5

# 8、@RequestParam🎉

  • @RequestParam用于将请求参数区数据映射到功能处理方法的参数上
  • @RequestParam只能在参数位置使用
@Target(ElementType.PARAMETER)
1
@GetMapping("/getarticle")
public ResponseData<ArticleAndTypeDto> getAllArticle(
    @RequestParam(name = "page", required = true, defaultValue = "1") int page,
    @RequestParam(name = "limit", required = true, defaultValue = "10") int limit,
    @RequestParam(name = "keywords", required = true, defaultValue = "") String keywords) {
    ResponseData<ArticleAndTypeDto> articleList = articleService.getArticleList(page, limit, keywords);
    return articleList;
}
1
2
3
4
5
6
7
8
  • 通过@RequestParam("name = "?")明确告诉Spring Web MVC使用name进行入参。value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;

  • required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报400错误码;如果设置了required=true,同时提供defaultValue的话,此时不传递参数,方法也能正常执行,默认值就是参数的值.

  • defaultValue:默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式.此时 如果没有传递参数过来 ,方法不能正常正常执行,必须要传递参数name才可以

# 9、@PathVariable🎉

  • RestFul通用风格
  • @PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。
  • @PathVariable该注释只能在参数位置使用
@Target(ElementType.PARAMETER) 元素类型.参数
1

# 【示例1】传递参数

@RequestMapping(value="/add3/{userId}/{userName}/a")
public String requestParam3(@PathVariable(value="userId") int userId,@PathVariable("userName") String userName)
{
    System.out.println("userId :"+userId+" ,userName :"+userName);
    return "add";
}
1
2
3
4
5
6

说明:当浏览器地址栏输入: http://localhost:8080/SpringMvcDemo03/hc5/add3/888/laowang/a

可以访问到该方法:同时控制台可以得到:

userId :888

userName :laowang

即通过访问该方法同时传递参数userId :888 ;userName :laowang

# 【示例2】传递参数

@PutMapping("/updatest/{articleStatus}/{articleID}")
public ResponseData updateArticleStatus(
    @PathVariable("articleStatus") int articleStatus,
    @PathVariable("articleID") int articleID) {
    ResponseData responseData = articleService.updateArticleStatus(articleID, articleStatus);
    return responseData;
}
1
2
3
4
5
6
7

说明:当浏览器地址栏输入: http://localhost:8080/updatest/1/0

可以访问到该方法:同时控制台可以得到:

articleStatus:0

articleID:1

即通过访问该方法同时传递参数articleStatus:0,articleID:1可修改文章ID为1的文章状态为0

# 【示例3】传递参数

@DeleteMapping("/delarticle/{articleID}")
public ResponseData deleteArticleByID(@PathVariable("articleID") int articleID) {
    ResponseData responseData = articleService.deleteArticleByID(articleID);
    return responseData;
}
1
2
3
4
5

说明:当浏览器地址栏输入: http://localhost:8080/delarticle/1

可以访问到该方法:同时控制台可以得到:

articleID:1

即通过访问该方法同时传递参数articleID:1,并删除ID为1的这篇文章

# 10、@CookieValue❌

@CookieValue用于将请求的Cookie数据映射到功能处理方法的参数上.

# 【示例1】

将本地存储的cookie的Value读取到控制器的方法中来.

当我们访问网站某个页面成功之后,会有一个sessionId:然后再次请求下面的地址会有一个jsessionId:

@GetMapping("c1")
public String cookietest(@CookieValue(name = "jsessionId") String jsessionId) {
    System.out.println("jsessionId");
    return "test";
}
1
2
3
4
5
@GetMapping("c2")
public String cookietest(@CookieValue(name = "jsessionId") Cookie jsessionId) {
    System.out.println("jsessionId");
    return "test";
}
1
2
3
4
5

说明:参数类型可以是string也可以是一个cookie对象

# 【示例2】

添加Cookie,并将本地存储的cookie读取到控制器的方法中来.


@GetMapping("/c3")
public String addCookie(HttpServletResponse response) {
    Cookie cookie = new Cookie("c","singerw");
    response.addCookie(cookie);
    return "test";
}
1
2
3
4
5
6
7
@GetMapping("c4")
public String cookietest2(@CookieValue(name = "c") String c) {
    System.out.println("jsessionId");
    return "test";
}
1
2
3
4
5

# 11、@RequestHeader🍬

@RequestHeader用于将请求的头信息区数据映射到功能处理方法的参数上

@RequestMapping("/requestHeader")
public String requestHeader(
    @RequestHeader(name = "Accept") String accept,
    @RequestHeader(name = "Cookie") String cookie,
    @RequestHeader(name = "Host") String host) {
    System.out.println(accept);
    System.out.println(cookie);
    System.out.println(host);
    return "requestHeader";
}
1
2
3
4
5
6
7
8
9
10

输出结果:

accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9

cookie:Idea-b90d7303=353c5347-21f4-4305-8ba9-e1e67fa3f21e; JSESSIONID=08520270A158EE46B2DA7A5A785D9B18

host:localhost:8080

# 12、@ModelAttribute

  • @ModelAttribute绑定请求参数到命令对象
  • 可以用在方法上,也可以用在方法的参数上面。
@Target({ElementType.PARAMETER, ElementType.METHOD})
1
  • @ModelAttribute具有如下三个作用:
    • 定请求参数到命令对象:放在功能处理方法的入参(某个控制器的方法参数)上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;此时,和(Model model) 写法的功能相同
    • 暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;
    • 暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。

# 【示例1】

当我们访问任何带@ReqyestMapping的方法的时候,之前都会执行这个getArticle这个方法,并返回一个article对象.。

@ModelAttribute(value = "/article")
public ArticleEntity getArticle() {
    ArticleEntity article = new ArticleEntity("测试标题", "测试内容", 2);
    return article;
}
1
2
3
4
5

这个加了@ModelAttribute(value = "/article")之后,会将对象的信息存储在request属性的范围内起来,当有@RequestMapping(@GetMapping,@PostMapping...)就会先执行这个方法。

所有存储起来的信息就可以使用了

${article}
${requestScope.article}
1
2

# 【示例2】

一般来说,return一个view或者return一个ModeAndView,但是下面方法return了一个 Arrays.asList(article1,article2),也是可以跳转到对应视图上,如下方法默认的跳转视图是和请求的@RequestMapping(value = "/article")一样的,会转发到article.jsp的页面上去,但是也是遵循视图解析器中的配置的。

@RequestMapping(value = "/article")
@ModelAttribute(value = "/articlelist")
public List<ArticleEntity> getArticleList() {
    ArticleEntity article1 = new ArticleEntity("测试标题1", "测试内容1", 1);
    ArticleEntity article2 = new ArticleEntity("测试标题2", "测试内容2", 2);
    return Arrays.asList(article1,article2);
}
1
2
3
4
5
6
7
<!--视图解析器配置-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/blog/"/>
    <property name="suffix" value=".jsp"/>
</bean>
1
2
3
4
5

# 13、@SessionAttributes

  • @SessionAttributes绑定命令对象到session

  • @SessionAttributes在类上使用

@Target({ElementType.TYPE})
1

​ 有时候我们需要在多次请求之间保持数据,一般情况需要我们明确的调用HttpSession的API来存取会话数据,如多步骤提交的表单。Spring Web MVC提供了@SessionAttributes进行请求间透明的存取会话数据。

# 【示例1】Session原始添加方法:

@GetMapping("/session")
public String sessionArticle(HttpServletRequest request, HttpSession session, SessionStatus status) {
    // 如果session还在,让旧的session过期
    if (!status.isComplete()) {
        status.setComplete();
    }
    ArticleEntity article = new ArticleEntity("测试", "测试", 2);
    // 1通过request添加属性
    request.getSession().setAttribute("session1", article);
    // 2直接通过session对象添加
    session.setAttribute("session2", article);
    return "test";
}
1
2
3
4
5
6
7
8
9
10
11
12
13

在hello_session.jsp就可以直接访问:

${sessionScope.session1}
${sessionScope.session2}
1
2

# 【示例2】Session添加方法2:

@ModelAttribute(value = "/articlelist")与@SessionAttributes(value = "articlelist")结合使用。将@ModelAttribute(value = "/articlelist")的value = "/articlelist",写到@SessionAttributes(value = "articlelist")中,访问页面的时候,会将数据存储到session范围内中。

@Controller
@SessionAttributes(value = "articlelist")
public class TesModelAndSessionController {


    @RequestMapping(value = "/article")
    @ModelAttribute(value = "/articlelist")
    public List<ArticleEntity> getArticleList() {
        ArticleEntity article1 = new ArticleEntity("测试标题", "测试内容", 2);
        ArticleEntity article2 = new ArticleEntity("测试标题", "测试内容", 2);
        return Arrays.asList(article1,article2);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13

此时,我的请求范围,和session范围都能获取到articlelist中的数据

${sessionScope.articlelist}
1

@SessionAttributes基本原理:

  • 首先根据@SessionAttributes注解信息查找会话内的对象放入到模型数据中;
  • 执行@ModelAttribute注解的方法:
    • 如果模型数据中包含同名的数据,则不执行@ModelAttribute注解方法进行准备表单引用数据,而是使用①步骤中的会话数据;
    • 如果模型数据中不包含同名的数据,执行@ModelAttribute注解的方法并将返回值添加到模型数据中.

# 14、@SessionAttribute

如果session中绑定多个数据对象:此时使用方法参数

@Controller
@SessionAttributes(value={"list","article"})
public class SessionAttrbuteController {
    
    @RequestMapping("forward105")
    public ArrayList<ArticleEntity> forward105(@ModelAttribute(value = "list") ArrayList list) {
        ArticleEntity article1 = new ArticleEntity("测试标题", "测试内容", 2);
        ArticleEntity article2 = new ArticleEntity("测试标题", "测试内容", 2);
        list.add(article1);
        list.add(article2);
        return list;
        //这里没有设置视图的信息 将会跳转到哪里: /WEB-INF/jsp/forward105.jsp
    }

    @ModelAttribute("list")
    public ArrayList initArrayList() {
        return new ArrayList();
    }

    @RequestMapping("forward106")
    public ArticleEntity forward106(@ModelAttribute(value = "article") ArticleEntity article) {

        article.setArticle_id(1);
        article.setArticle_title("一点都不好玩~");
        return article;
        //这里没有设置视图的信息 将会跳转到哪里: /WEB-INF/jsp/forward106.jsp
    }

    @ModelAttribute("article")
    public ArticleEntity initArticle() {
        return new ArticleEntity();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
编辑 (opens new window)
#SpringMVC
yaml语言教程
文件上传+SpringMVC+富文本编辑器

← yaml语言教程 文件上传+SpringMVC+富文本编辑器→

最近更新
01
Maven资源导出问题终极版
10-12
02
《MyBatis-Plus》学习笔记
10-07
03
MyBatis-Plus—配置日志
10-07
更多文章>
Theme by Vdoing | Copyright © 2020-2021 版权所有 | repository.singerw.com
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×