SpringMvc两种映射规则

1.spring mvc 默认参数映射规则:名字一致  自动映射
2.spring mvc自定义映射规则:可以通过注解来实现=>  @RequestParam

传递基本数据类型

@RequestParam,POST和GET均支持

注解定义

@Target({ElementType.PARAMETER}) // 只能作用于参数上
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {// 定义参数名称,默认和名字一致@AliasFor("name")String value() default "";// 定义参数名称,默认和名字一致@AliasFor("value")String name() default "";// 默认必填,一旦加上该注解,前台必须传递此参数boolean required() default true;// 定义默认值String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

关于@AliasFor注解说明:标识2个属性作用一致

在Spring的众多注解中,经常会发现很多注解的不同属性起着相同的作用,比如@RequestParam 的value属性和name属性,这就需要做一些基本的限制,比如value和path的值不能冲突,比如任意设置value或者设置path属性的值,都能够通过另一个属性来获取值等等。为了统一处理这些情况,Spring创建了@AliasFor标签。

@RequestMapping注解中也有应用。

注解使用示例

@RequestMapping("demo")
public String demo(Model model// 走默认装配规则,参数名称和名字一致,选传,String name// 参数名称和名字默认一直,必传参数,不传报错,@RequestParam String name0// 通过value属性定义名称,必传参数,不传报错,@RequestParam(value = "name1") String name1// 通过name属性定义,非必传参数,@RequestParam(name = "name2",required = false) String name2// 通过value属性定义,必传参数,有默认值,可以不传自动赋值,@RequestParam(value = "name3",defaultValue = "t3") String name3// 自定义参数名字,不必加name或者value属性,必传,@RequestParam("name444") String name4
){System.out.println("name:"+name);System.out.println("name0:"+name0);System.out.println("name1:"+name1);System.out.println("name2:"+name2);System.out.println("name3:"+name3);System.out.println("name4:"+name4);return "hello";
}

请求连接:

/demo?name=t&name0=t0&name1=t1&name2=t2&name444=t44

结果展示

必传参数name1,不传会报400错误,如下:

@PathVariable,POST和GET均支持

注:和@RequestParam注解使用相同的地方简述

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PathVariable {// 定义参数名称,默认和名字一致@AliasFor("name")String value() default "";// 定义参数名称,默认和名字一致@AliasFor("value")String name() default "";// 默认必填,一旦加上该注解,前台必须传递此参数boolean required() default true;
}

注解使用示例

@RequestMapping(value={"demo1/{name1}/{name2}/{name3}"// 配合name3选传,此种场景应用较少,一般使用此注解均为必传参数,"demo1/{name1}/{name2}"
})
public String demo1(Model model//注意,没加注解,使用问号后追加参数请求,String name// 必传,@PathVariable String name1// 必传,@PathVariable("name2") String name2// 选传,@PathVariable(value = "name3",required = false) String name3
){System.out.println("name:"+name);System.out.println("name1:"+name1);System.out.println("name2:"+name2);System.out.println("name3:"+name3);return "hello";
}

请求连接:

/demo1/t1/t2?name=t0

/demo1/t1/t2/t3

/demo1/t1 ===> 404地址找不到

结果展示

如果是使用注解@PathVariable必传的参数类型,不加参数会报404。

总结:参数传递时,可以使用@RequestParam和@PathVariable传递参数,也可以走Spring Mvc默认的装配规则,根据实际使用场景来选择即可。 

传递普通对象

对象参数名称不影响参数传递

非JSON请求

前台

localhost:8080/demo2?name=1&number=2

后台

@ResponseBody
@RequestMapping("demo2")public Demo demo2(Demo demo){System.out.println("demo:"+demo);return demo;
}

结果展示

JSON请求

这里使用了postman

后台

@ResponseBody
@PostMapping("demo22")
public Demo demo22(@RequestBody Demo demo){System.out.println("demo:"+demo);return demo;
}

传递数组

非JSON请求

前台

localhost:8080/demo3?ids=1&ids=2&ids=3

localhost:8080/demo3?ids=1,2,3

后台

@ResponseBody
@RequestMapping("demo3")
public Long[] demo3(Long[] ids){System.out.println("ids:"+ids.length);return ids;
}

JSON请求

前台

后台

@ResponseBody
@RequestMapping("demo33")
public Long[] demo33(@RequestBody Long[] ids){System.out.println("ids:"+ids.length);return ids;
}

传递集合List

非JSON请求

前台

localhost:8080/demo4?idList=1&idList=2

http://localhost:8080/demo4?idList=1,2,3

后台(@RequestParam注解不可缺少)

@ResponseBody
@RequestMapping("demo4")
public List<Long> demo4(@RequestParam List<Long> idList){System.out.println("ids:"+idList);return idList;
}

JSON请求

前台

后台

@ResponseBody
@RequestMapping("demo5")
public List<Long> demo5(@RequestBody List<Long> idList){System.out.println("ids:"+idList);return idList;
}

对象+List同时接收

场景

  1. rbac更新某个角色的权限信息=> 角色id + List idList
  2. 考试答题:个人信息 + 每道题的唯一标识 和 所选答案

非JSON请求=>不是content-type:application/json

前台 html

<form action="/demo2" method="POST">name:<input type="text" name="name"/><br/>number:<input type="text" name="number"/><br/><!-- 以下部分可以动态添加 -->nickname:<input type="text" name="demoCList[0].nickname"/>number:<input type="text" name="demoCList[0].number"/><br/>nickname:<input type="text" name="demoCList[1].nickname"/>number:<input type="text" name="demoCList[1].number"/><br/>nickname:<input type="text" name="demoCList[2].nickname"/>number:<input type="text" name="demoCList[2].number"/><br/>nickname:<input type="text" name="demoCList[3].nickname"/>number:<input type="text" name="demoCList[3].number"/><br/><button type="submit">提交</button>
</form>

请求地址

http://localhost:8080/demoBefore

前台

后台

@ResponseBody
@RequestMapping("demo6")
public Demo demo6(Demo demo){System.out.println("demo:"+demo);return demo;
}
==============================================
public class Demo {private String name;private String number;private List<DemoC> demoCList;....省略get set方法....
}

JSON请求=>content-type:application/json

前台

后台

@ResponseBody
@RequestMapping("demo7")
public Demo demo7(@RequestBody Demo demo){System.out.println("demo:"+demo);return demo;
}

源码

@Controller
@RequestMapping  // 默认 /
public class DemoController {protected Logger logger = LoggerFactory.getLogger(getClass());@Autowiredprivate HttpSession httpSession;/****    1.spring mvc 默认参数映射规则:名字一致  自动映射*    2.自定义映射规则:可以通过注解来实现=>  @RequestParam*    所有的注解的效果  都由解析的地方来决定用*** @param model* @param name* @param name0* @param name1* @param name2* @param name3* @param name4* @return*/@RequestMapping(path= "demo")  // demo :   ip+端口 +项目根路径 +  / + demo@ResponseBody // 返回类型是一个对象:可以是字符串、对象、List等等;不是一个页面public String demo(// 走默认装配规则,参数名称和名字一致,选传String name// 参数名称和名字默认一直,必传参数,不传报错 required =true, @RequestParam String name0// 通过value属性定义名称,必传参数,不传报错  required =true, @RequestParam(value = "name1") String name1// 通过name属性定义,非必传参数, @RequestParam(name = "name2",required = false) String name2// 通过value属性定义,必传参数,有默认值,可以不传自动赋值  required =true &   defaultValue =》 required =false, @RequestParam(value = "name3",defaultValue = "t3") String name3// 自定义参数名字,不必加name或者value属性,必传, @RequestParam("name444") String name4){// 0不能作为被除数
//        int c= 1 / 0;//        for (int i = 0; i < 100; i++) {
//            System.out.println("name:"+name);
//            System.out.println("name:"+name);
//            System.out.println("i:"+i);
//            if(i == 56){
//                int c = i/0;
//            }
//        }System.out.println("name:"+name);System.out.println("name0:"+name0);System.out.println("name1:"+name1);System.out.println("name2:"+name2);System.out.println("name3:"+name3);System.out.println("name4:"+name4);return "hello";}@RequestMapping(value={"demo1/{name1}/{name2}/{name3}"// 配合name3选传,此种场景应用较少,一般使用此注解均为必传参数,"demo1/{name1}/{name2}"})@ResponseBodypublic String demo1(Model model//注意,没加注解,使用问号后追加参数请求, String name// 必传, @PathVariable String name1// 必传, @PathVariable("name2") String name2// 选传, @PathVariable(value = "name3",required = false) String name3){System.out.println("name:"+name);System.out.println("name1:"+name1);System.out.println("name2:"+name2);System.out.println("name3:"+name3);return "hello";}private String test(){return "";}//    @RequestMapping("demoBefore")//    @GetMapping("demoBefore")@RequestMapping(method = {RequestMethod.GET,RequestMethod.POST},value = "demoBefore")public String demoBefore(){
//        if(httpSession.getAttribute("user") == null){
//            return "login";
//        }return "demo";}// form表单传参/***      添加、修改  都是以对象作为参数;*      查询时以对象为参数,查询条件变动时,同理* @param demo* @return*/@ResponseBody  //返回是一个对象 不是渲染页面@RequestMapping("demo2")
//    @RequestMapping(value = "demo2",
//            method = {RequestMethod.GET,RequestMethod.POST})
//    @GetMapping("demo2")
//    @PostMapping("demo2")public Demo demo2(Demo demo){System.out.println("demo:"+demo);return demo;}/*** @RequestBody  要求前台通过json格式传递参数  header:   content-type : application/josn* @param demo* @return*/@ResponseBody@PostMapping("demo22") // 只允许使用post方式
//    @GetMapping
//    @RequestMapping(
//            method = {RequestMethod.POST},value = "demo22"
//    )public Demo demo22(@RequestBody Demo demo){System.out.println("demo:"+demo);return demo;}@ResponseBody@RequestMapping("demo3")public Long[] demo3(Long[] ids){System.out.println("ids:"+ids.length);return ids;}@ResponseBody@RequestMapping("demo33")public Long[] demo33(@RequestBody Long[] ids){System.out.println("ids:"+ids.length);return ids;}@ResponseBody@RequestMapping("demo4")public List<Long> demo4(@RequestParam List<Long> idList){// 0不能作为被除数
//        int c= 1/ 0;System.out.println("ids:"+idList);return idList;}@ResponseBody@RequestMapping("demo5")public List<Long> demo5(@RequestBody List<Long> idList){System.out.println("ids:"+idList);return idList;}@ResponseBody@RequestMapping("demo6")public Demo demo6(Demo demo){System.out.println("demo:"+demo);return demo;}@ResponseBody@RequestMapping("demo7")public Demo demo7(@RequestBody Demo demo){System.out.println("demo:"+demo);return demo;}}

SpringMvc参数传递相关推荐

  1. 使用SpringMVC参数传递时,解决get请求时中文乱码的问题

    问题描述: 使用SpringMVC参数传递时, 遇到get请求中文信息时,页面应答会显示中文乱码. 解决办法: 一, 我们需要把request.getParameter("参数名" ...

  2. 用SpringMVC参数传递时,解决get请求时中文乱码的问题

    问题描述: 使用SpringMVC参数传递时, 遇到get请求中文信息时,页面应答会显示中文乱码 解决办法: 方法一 把request.getParameter("参数名")获取到 ...

  3. springMVC参数传递(三)

    2019独角兽企业重金招聘Python工程师标准>>> 第一步:web.xml文件是一个工程必不可少的配置文件. <!-- lang: xml --> <?xml ...

  4. SpringMVC的参数传递

    一.SpringMVC参数传递(三种方式) 项目结构: pojo: package com.jt.pojo;import com.baomidou.mybatisplus.annotation.IdT ...

  5. JavaWeb学习之路——SSM框架之SpringMVC(八)

    SpringMVC参数传递:把内容写到方法(HandlerMethod)参数中,SpringMVC只要有这个内容,则会注入,在这里使用注解的方式来传递参数 前提使用springmvc注解功能,相应配置 ...

  6. spring框架_IOC_DI_AOP_MVC

    本文注解总结:注解收录集 Spring框架 一.Spring介绍 二.Spring-`IOC` 2.1 IOC调用原理图 2.2 Spring-IOC 配置文件方式 2.2.1 准备Dog类 2.2. ...

  7. CGB2103-day01

    1.SpringMVC 1.1 框架的作用 接收前端传递的数据,与用户进行交互. 1.2 SpringMVC参数传递的格式 1.2.1 简单参数传值 <input type="text ...

  8. 【视频教程免费领取】聚焦Python分布式爬虫必学框架Scrapy 打造搜索引擎

    领取方式 关注公众号,发送Python0407获取下载链接. 扫码关注公众号,公众号回复 Python0407 获取下载地址 目录结构 目录:/读书ReadBook [57.6G] ┣━━48G全套J ...

  9. CGB2107-Day07-实现前后端调用

    CGB2107-Day07-实现前后端调用 1. 框架整理 1.1 展现Sql日志 #语法: 1.key:(空格)value结构 # 2.注意层级缩进 server:port: 8090#整合1.数据 ...

最新文章

  1. HTML5 模板推荐
  2. 理解 Delphi 的类(十) - 深入方法[28] - 递归函数实例: 搜索当前目录下的所有嵌套目录...
  3. Activity的使用(七):activity的返回值
  4. Spring的Bean的初始化
  5. cleaning selected projects has encountered a problem errors occurred during build
  6. nodeJS 的 path.resolve() 用法解析
  7. Vue根据菜单json数据动态按需加载路由Vue-router
  8. 【HDU - 1116】【POJ - 1386】Play on Words(判断半欧拉图,欧拉通路)
  9. 【Flink】The class WC is an instance class, meaning it is not a member of a toplevel object
  10. python sorted下标_初学者掌握python 列表需要知道的操作
  11. Mobile Widget是一种新的手机应用形式吗
  12. 201671030126 词频统计软件项目报告
  13. HIKSDK/大华SDK协议视频融合平台EasyCVR移动侦测录像功能无法在后台显示优化过程
  14. LaTeX:大于等于号,小于等于号,大于号,小于号
  15. matlab用摄像头拍照,matlab调用摄像头拍照
  16. 自己的邮箱还有在用吗,还安全吗?
  17. day06 Elasticsearch搜索引擎2
  18. 前端导出Excel表格
  19. SAP中采购合同与采购计划协议关联性分析(续)
  20. 1、大道至简的数据处理工具-(Microsoft Power Query入门)

热门文章

  1. 使用 MFC 编写打印程序
  2. 海康工业摄像头调用(linux基于python和opencv)
  3. 黑苹果常见问题博文及网页部分集锦
  4. 从一线码农到阿里技术合伙人 P11的少林扫地僧多隆,人家牛逼是种习惯
  5. CSS基础(11)- 浮动
  6. 09 模型的增删查改《ThinkPHP6 入门到电商实战》
  7. 从IT开发人员到IT行业专家的IT职业规划
  8. 永远的圣斗士—曾经的光辉岁月
  9. 天猫实时销量接口用于商品数据分析,超详细的接口介绍
  10. Mac OS X 10.9.5系统下创建quick3.3final项目出现问题