SpringMVC基础(5): SpringMVC常用注解

2023-10-28

目录

1、handler method 参数绑定常用注解

2、常用注解

1、 @PathVariable 

2、 @RequestHeader、@CookieValue

3、@Re Body

5、@RequestBody和@RequestParam区别

6、@RequestParam,@PathParam,@PathVariable等注解区别


1、handler method 参数绑定常用注解

我们根据他们处理的Request的不同分为四类:

  1. 处理request uri 部分(这里指uri template中variable,不含queryString部分)的注解:                                                                     @PathVariable,@ReqeustParam;
  2. 处理request header部分的注解:   @RequestHeader, @CookieValue;
  3. 处理request body部分的注解:@RequestParam,  @RequestBody;
  4. 处理attribute类型的注解: @SessionAttributes, @ModelAttribute;

2、常用注解

1、 @PathVariable 

当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。

示例代码:10.25.240.193:8080//owners/Hello/risk

则Hello绑定到ownerId,risk绑定到petId上

@Controller  
@RequestMapping("/owners/{ownerId}")  
public class RelativePathUriTemplateController {  
  
  @RequestMapping("/pets/{petId}")  
  public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {      
    // implementation omitted  
  }  
}  

        上面代码把URI template 中变量 ownerId的值和petId的值,绑定到方法的参数上。若方法参数名称和需要绑定的uri template中变量名称不一致,需要在@PathVariable("name")指定uri template中的名称。




2、 @RequestHeader、@CookieValue

@RequestHeader 注解:可以把Request请求header部分的值绑定到方法的参数上。

这是一个Request 的header部分:

Host                    localhost:8080  
Accept                  text/html,application/xhtml+xml,application/xml;q=0.9  
Accept-Language         fr,en-gb;q=0.7,en;q=0.3  
Accept-Encoding         gzip,deflate  
Accept-Charset          ISO-8859-1,utf-8;q=0.7,*;q=0.7  
Keep-Alive              300  
@RequestMapping("/show")  
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,  
                              @RequestHeader("Keep-Alive") long keepAlive)  {  
  //...  
}  

        上面的代码,把request header部分的 Accept-Encoding的值,绑定到参数encoding上了, Keep-Alive header的值绑定到参数keepAlive上。

@CookieValue  可以把Request header中关于cookie的值绑定到方法的参数上。

例如有如下Cookie值:

JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84  

@RequestMapping("/displayHeaderInfo.do")  
public void displayHeaderInfo(@CookieValue("JSESSIONID") String cookie)  {  
  //...  
}  

即把JSESSIONID的值绑定到参数cookie上。




3、@Re Body

@RequestParam

A) 常用来处理简单类型的绑定,通过Request.getParameter() 获取的String可直接转换为简单类型的情况( String--> 简单类型的转换操作由ConversionService配置的转换器来完成);因为使用request.getParameter()方式获取参数,所以可以处理get 方式中queryString的值,也可以处理post方式中 body data的值;

B)用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST;

C) 该注解有两个属性: value、required; value用来指定要传入值的id名称,required用来指示参数是否必须绑定;

示例代码:

Get
download?poiId=1&shopName=hello

@RequestMapping(value = "/download", method = RequestMethod.GET)
    public ResponseEntity download(HttpServletRequest request,@RequestParam(value = "poiId") Long poiId, @RequestParam(value = "shopName") String shopName) {
        
}

@RequestBody

该注解常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等

它是通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。

因为配置有FormHttpMessageConverter,所以也可以用来处理 application/x-www-form-urlencoded的内容,处理完的结果放在一个MultiValueMap<String, String>里,这种情况在某些特殊需求下使用,详情查看FormHttpMessageConverter api;

示例代码:

 @ResponseBody
 @RequestMapping(value = "/query", method = RequestMethod.POST)
 public Map queryTaskByConditions(@RequestBody TaskVo taskVo) {
      ...
}
封装对象
public class TaskVo {
    /**
     * 当前页码
     */
    @NotNull
    private Integer pageNo;
    /**
     * 每页大小
     */
    @NotNull
    private Integer pageSize;

    /**
     *名称
     */
    private String shopName;

    /**
     * poi
     */
    @Pattern(regexp = "[0-9]*$")
    private String shopId;

    @Pattern(regexp = "[0-9]*$")
    private String taskIdStr;
}
或
 @ResponseBody
 @RequestMapping(value = "/query", method = RequestMethod.POST)
 public Map queryTaskByConditions(@RequestBody Map<String,Object params) {
      ...
}

4、@SessionAttributes, @ModelAttribute

@SessionAttributes:

该注解用来绑定HttpSession中的attribute对象的值,便于在方法中的参数里使用。

该注解有value、types两个属性,可以通过名字和类型指定要使用的attribute 对象;

@Controller  
@RequestMapping("/editPet.do")  
@SessionAttributes("pet")  
public class EditPetForm {  
    // ...  
}  

@ModelAttribute

该注解有两个用法,一个是用于方法上,一个是用于参数上;

用于方法上时:  通常用来在处理@RequestMapping之前,为请求绑定需要从后台查询的model;

用于参数上时: 用来通过名称对应,把相应名称的值绑定到注解的参数bean上;要绑定的值来源于:

A) @SessionAttributes 启用的attribute 对象上;

B) @ModelAttribute 用于方法上时指定的model对象;

C) 上述两种情况都没有时,new一个需要绑定的bean对象,然后把request中按名称对应的方式把值绑定到bean中。

用到方法上@ModelAttribute的示例代码:

@ModelAttribute  
public Account addAccount(@RequestParam String number) {  
    return accountManager.findAccount(number);  
}  

这种方式实际的效果就是在调用@RequestMapping的方法之前,为request对象的model里put(“account”, Account);

用在参数上的@ModelAttribute示例代码:

@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)  
public String processSubmit(@ModelAttribute Pet pet) {  
     
}  

首先查询 @SessionAttributes有无绑定的Pet对象,若没有则查询@ModelAttribute方法层面上是否绑定了Pet对象,若没有则将URI template中的值按对应的名称绑定到Pet对象的各属性上

5、@RequestBody和@RequestParam区别

原文链接:https://blog.csdn.net/weixin_38004638/article/details/99655322

6、@RequestParam,@PathParam,@PathVariable等注解区别

@RequestParam,@PathParam,@PathVariable等注解区别_一年e度的夏天的专栏-CSDN博客_@pathvariable

参考:https://blog.csdn.net/kobejayandy/article/details/12690161?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control&dist_request_id=1332049.10072.16194223294386453&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringMVC基础(5): SpringMVC常用注解 的相关文章

  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • 将不同类型的参数传递给 jdbctemplate 查询

    我正在尝试使用带有少量不同类型参数的 where 子句从数据库中检索记录 这是我编写的简单方法 我将breedId和性别作为参数传递 public List
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 【AI人工智能】 你如果要使用最强大的语言模型,你还要有最精美的浏览器标签页iTab (2)

    个人主页 极客小俊 作者简介 web开发者 设计师 技术分享博主 希望大家多多支持一下 我们一起进步 如果文章对你有帮助的话 欢迎评论 点赞 收藏 加关注 iTab 安装插件 这也是一款很不错的标签页插件 我使用过一段时间 很不错 并且里面
  • ideal使用maven将源码包和jar一起打包并上传到私服

    在公司中同事将代码提交到私服 下载jar包后却看不到注释 此时是因为同事没有将源码打包并上传到私服 配置方法如下
  • 在CentOS 7上安装Caffe

    简介 Caffe 是一个广泛使用的清晰 高效 模块化的深度学习框架 是贾扬清 Yangqing Jia 在UC Berkeley 读博期间建立的项目 由伯克利AI实验室 Berkeley AI Research BAIR 及社区贡献者开发
  • DC基础学习(六)Verilog语言结构到门级的映射2

    Design Compiler 以下简称DC 是Synopsys公司用于做电路综合的核心工具 可以将HDL描述的电路转换为基于工艺库的门级网表 本系列主要介绍综合相关的知识以及DC工具的使用 Verilog编码效率的高低是综合后电路性能高低
  • 微信网页开发:微信内h5使用wx-open-launch-weapp打开小程序,微信内h5使用wx-open-launch-app打开App的方案

    需求场景 当我们需要使用在微信客户端打开的h5页面 在页面上打开微信小程序或者唤起App时 我们需要使用微信js sdk提供的开放标签能力 这其中 使用wx open launch weapp标签打开微信小程序 使用wx open laun
  • 将“Encountered an improper argument“ 问题有效解决

    其错误提示为 Encountered an improper argument 错误原因 错误原因其实是因为我们在调试完结束时候 有断点 红色圆点 还没有去掉 所以我们一点击停止调试之后 keil就会马上弹出这个错误 然后你就会发现你的ke
  • 夏普ar2048s打印机驱动安装_驱动人生 下载安装打印机驱动的方法

    驱动人生 安装打印驱动的方法 支持USB 网络 注 电脑需要连接互联网 某些新款机型或可能不支持 不支持的型号请用自带驱动安装 或者到品牌官网下载驱动 注 下载 驱动人生 请到官网下载 请不要在第三方下载 第三方可能绑定有应用程序 安装时可
  • Sqlilabs-26

    来到了 Sqlilabs 大魔王的第 26 关关卡 来到页面就看到大大的 你的所有空格和过滤符都属于我们 这难得到机智的你吗 在此说下常见的绕过方法有 本来这应该在 25 关卡就说的 忘了 双写绕过 大小写绕过 编码绕过 如 hex URL
  • 通过这12张手绘图,搞懂什么是微服务架构

    点击上方 阿拉奇学Java 选择 置顶或者星标 优质文章第一时间送达 来源 juejin im post 5c0ba2bef265da614d08fefe 推荐阅读 SpringBoot中异步请求和异步调用 看这一篇就够了 下文 你将看到业
  • 【Linux成长史】Linux权限的详细讲解

    博客主页 博主链接 本文由 M malloc 原创 首发于 CSDN 学习专栏推荐 LeetCode刷题集 数据库专栏 初阶数据结构 欢迎点赞 收藏 留言 如有错误敬请指正 未来很长 值得我们全力奔赴更美好的生活 文章目录 本章详情 Lin
  • 算法效率分析基础-算法四

    主要内容 介绍研究算法效率的通用框架 介绍三种符号 O 读作O 读作omega 和 读作theta 这些数学借来的符号已经成为讨论算法效率的特定语言 使用通用框架系统对非递归算法进行分析 这种分析主要的工具是先定义一个代表算法运行时间的求和
  • QT信号槽的5种连接方式Qt::ConnectionType

    参考 QT信号槽的5种连接方式 非常溜 Qt QueuedConnection例子 666 Qt信号槽的五种连接方式 简洁清晰 Qt UniqueConnection 防止重复连接 综合 例子 updatethread h ifndef U
  • Python入门

    一 进制 1 什么是进制 进制就是进位的制度 一种进位的方式 2 常见的进制 二进制 0和1 0 1 十进制 0 9的整数 0 1 2 3 4 5 6 7 8 9 八进制 0 7的整数 用数字0开头 0 1 2 3 4 5 6 7 十六进制
  • ipconfig不是内部或外部命令

    错误背景 windows r 输入cmd dos命令输入ipconfig 出现不是内部或外部命令 解决方案 1 电脑 系统属性 环境变量 找到path 在末尾处 如没有分号就添加c windows system32 确定 windows r
  • Qt5 信号槽连接 函数重载、参数不一致问题

    Qt5中使用以下方式代替Qt4的信号槽连接 在编译时即对连接的函数指针进行检测 提高了安全性 而Qt4的连接方式是基于字符串的 只能在运行时进行检测 在Qt4的connect方法上右键 Refactor gt Convert connect
  • [数据库系统]第7讲 关系模式的优化知识点整理

    第1节 关系模型的好坏 ER模型转换的关系是否就是最优的关系 不一定 关系模型潜在的问题 添加异常 修改异常 删除异常 数据冗余 冗余 当数据的某些部分能由其他部分推导出来 就意味着存在冗余 冗余的存在是因为存在完整性约束 如何解决冗余问题
  • Transformer学习笔记

    The Illustrated Transformer Jay Alammar Visualizing machine learning one concept at a time jalammar github io 上面是图片出处 是否
  • CSS列表与表格

    目录 编辑 HTML 列表和 CSS 列表属性 不同的列表项目标记 实例 图像作为列表项标记 实例 定位列表项标记 实例 删除默认设置 实例 列表 简写属性 实例 设置列表的颜色样式 实例 更多实例 所有 CSS 列表属性 表格边框 实例
  • python PDF转docx库的安装与使用

    python PDF转docx库的安装与使用 下载 使用 三种方法 效果 下载 anaconda中直接通过anaconda prompt下载pdf2docx库 pip install pdf2docx 使用 三种方法 可以直接通过命令行使用
  • SpringMVC基础(5): SpringMVC常用注解

    目录 1 handler method 参数绑定常用注解 2 常用注解 1 PathVariable 2 RequestHeader CookieValue 3 Re Body 5 RequestBody和 RequestParam区别 6