SpringMVC获取请求数据:

DispatcherServlet底层中获取请求数据并传递给单元方法使用。

DispatcherServlet会根据请求动态调用对应的单元方法处理,而请求先被DispatcherServlet接收,意味着DispatcherServlet中拥有此次请求相关的请求数据,那么就需要DispatcherServlet将请求数据传递给处理调用的单元方法,需要在单元方法中声明对应的形参接收请求数据。

紧耦方式获取请求数据:

使用:在单元方法中声明request形参,直接接收此次请求的request对象来获取请求数据;

缺点:需要使用request对象获取请求数据,需要类型转换或者对象的封装。

@RequestMapping("demoRequest")
public String demoRequest(HttpServletRequest request){
//获取请求数据
String uname=req.getParameter("uname");
int age= Integer.parseInt(req.getParameter("age"));
//处理请求数据
System.out.println("紧耦方式是,使用request对象获取:"+uname+age);
//响应处理结果
return "requestc.jsp";
}

解耦方式获取请求数据:

方式一:使用单元方法形参直接获取对应的请求数据;形参名和请求数据的键名一致;

好处是不用自己获取请求数据,会自动进行类型转换;

本质:DispatcherServlet底层会使用单元方法的形参名为键名获取此次的请求数据并赋值给单元方法使用;

注意:如果请求中不存在对应的请求数据,会将null值传递给单元方法,所以如果涉及到类型转换会出现转换异常;

@RequestMapping("demoParam")
public String demoParam(String uname,int age){
//处理请求
System.out.println("解耦方式一使用形参获取:"+uname+age);
//响应处理结果
return "param.jsp";
}

解耦方式二:使用形参别名获取请求数据

方式一存在的问题:使用单元方法的形参名和请求数据的键名一致可以获取请求数据,那么如果形参名和请求数据的键名不一致,会造成请求数据无法获取,就需要我们修改形参名让它与键名一致,但是不管怎么修改都会涉及到调用代码的修改,此时使用形参别名比较方便,别名的值和请求数据的键名一致;

使用:在单元方法的形参声明前使用@RequestParam(配置信息),声明别名;

本质:如果我们使用单元方法的别名,则DispatcherServlet底层会使用别名作为键名获取请求数据

@RequestParam注解的使用:

  • value属性:值为形参的别名;
  • defaultValue属性:设置形参的默认值,当请求中没有对应的请求数据时,则将默认值传递给单元方法的形参;
  • required属性:设置根据别名必须能够获取到对应的请求数据,如果请求中没有则报400异常,不能和defaultValue属性同时使用;
@RequestMapping("demoParam2")
public String demoParam2(@RequestParam(value="uname",required = true) String uname2,@RequestParam(value="age") int age2){
//处理请求
System.out.println("解耦方式二使用形参别名获取:"+uname2+age2);
//响应处理结果
return "param2.jsp";
}

解耦方式三:使用对象获取请求数据

使用:在单元方法上声明实体类类型的形参,来获取请求数据,DispatcherServlet会将请求数据封装到形参类型的对象中,然后将对象传递给单元方法;实体类的属性名必须和请求数据的键名一致;

@RequestMapping("demoParam4")
public String demoParam4(String uname,User user){
//处理请求数据
System.out.println(user+":"+uname);
return "param4.jsp";
}

restful风格的请求数据获取:

传统的请求数据风格:localhost:8080/Sprint03/as?username=zhangsan&pwd=123

问题:传统方式会将请求数据以键值对的形式发送给后台使用,后台根据键名获取即可,但是键名是声明在前台代码的,造成后台代码和前台之间有了之间的联系,如果需要修改键名会造成后台的代码也需要修改;

解决:在请求中不声明键名,直接发送数据给后台,但是请求数据必须按照指定的规则来发送。

实现:使用restful规则

要求请求数据要直接在请求路径中附带,不使用问号拼接,但是数据在请求路径中的顺序必须按照指定的顺序声明,不能随便声明,因为后台会按照顺序获取路径中的请求数据;

eg: localhost:8080/project/as/zhangsan/123

SpringMVC获取restful路径中的数据:

  • 在单元方法的别名中使用{键名}的方式进行参数占位;
  • 在单元方法的形参声明前使用注解@PathVariable("占位的键名")将数据赋值给形参;
@RequestMapping("demoRest/{un}/{pw}")
public String demoRest(@PathVariable("un") String username, @PathVariable("pw") String pwd){
//处理请求数据
System.out.println(uname+":"+pwd);
return "rest.jsp";
}

SpringMVC 获取请求参数(精简版)的更多相关文章

  1. SpringMVC 获取请求参数

    1.获取Request response对象 在SpringMVC的注解开发中,可以选择性的接收Request和Response对象来使用 2.获取request对象请求参数 a.通过request对 ...

  2. SpringMVC获取请求参数-POJO类型参数

    1.Controller中的业务方法的POJO参数的属性名与请求参数一致,参数值会自动映射匹配 1.创建POJO类 public class User { private String usernam ...

  3. SpringMVC获取请求参数-基本类型

    1.Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配 (json形式) <dependency> <groupId>com.faste ...

  4. SpringMVC获取请求参数-集合类型

    1.创建User实体类 ```java public class User { private String username; private int age; public String getU ...

  5. 学习SpringMVC——如何获取请求参数

    @RequestParam,你一定见过:@PathVariable,你肯定也知道:@QueryParam,你怎么会不晓得?!还有你熟悉的他(@CookieValue)!她(@ModelAndView) ...

  6. springMvc源码学习之:spirngMVC获取请求参数的方法2

    @RequestParam,你一定见过:@PathVariable,你肯定也知道:@QueryParam,你怎么会不晓得?!还有你熟悉的他 (@CookieValue)!她(@ModelAndView ...

  7. SpringMVC之请求参数的获取方式

    转载出处:https://www.toutiao.com/i6510822190219264516/ SpringMVC之请求参数的获取方式 常见的一个web服务,如何获取请求参数? 一般最常见的请求 ...

  8. 【SpringMVC】获取请求参数

    通过ServletAPI获取 test.html <a th:href="@{/testServletAPI(username='admin',password=123456)}&qu ...

  9. springMVC(spring)+WebSocket案例(获取请求参数)

    开发环境(最低版本):spring 4.0+java7+tomcat7.0.47+sockjs 前端页面要引入: <script src="http://cdn.jsdelivr.ne ...

  10. 学习SpirngMVC之如何获取请求参数

    学习SpringMVC——如何获取请求参数   @RequestParam,你一定见过:@PathVariable,你肯定也知道:@QueryParam,你怎么会不晓得?!还有你熟悉的他(@Cooki ...

随机推荐

  1. numpy数组基础

    目录 创建数组 多维数组切片 数组属性 使用数组 数组特殊运算符 索引进阶 花式索引 创建数组 在numpy中,创建数组有很多种方法,例如如下的例子: import numpy as np sws_1 ...

  2. C语言,可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶,有的时候一次爬三个台阶。如果这个楼梯有n个台阶,小明一共有多少种爬法呢?n值从键盘输入。

    /* 开发者:慢蜗牛 开发时间:2020.5.28 程序功能:小明爬楼梯 */ #include<stdio.h> int taijie(int n); long taijie(int n ...

  3. tableau用数值呈现条形图的总计

    创建计算字段 创建计算字段:销售额总计,键入函数: IF Size()=1 THEN 0 ELSE Sum([销售额]) END 创建视图 将度量"销售额"拖放至列,将维度&quo ...

  4. Java并发(十六)----线程八锁

    所谓的"线程八锁" 其实就是看 synchronized 锁住的是哪个对象 情况1:12 或 21都是有可能的,就看cpu先调度哪个线程 @Slf4j(topic = " ...

  5. P8594 「KDOI-02」一个仇的复 题解

    我会组合数! 首先发现同一列只有被不同的横块填或被一个相同的竖块填,且用竖块填完1列之后,会分成两个封闭的长方形,而长方形内部则用横块来填充. 先考虑一个子问题,某个 \(2 \times n\) 长 ...

  6. ASP.NET Core 8 在 Windows 上各种部署模型的性能测试

    ASP.NET Core 8 在 Windows 上各种部署模型的性能测试 我们知道 Asp.net Core 在 windows 服务器上部署的方案有 4 种之多.这些部署方案对性能的影响一直以来都 ...

  7. Mybatis-Flex之增、删、改

    方法全解 (1) INSERT BaseMapper 的接口提供了 insert 和 insertBatch 方法,用于新增数据: insert(entity):插入实体类数据,不忽略 null 值. ...

  8. MybatisPlus自定义枚举映射

    1.问题的由来 在平时开发中多多少少肯定会遇到一些例如status...等特殊含义的字段值,虽然传递10:ADMIN,20:NORMAL可以解决业务需求,但是不是很直观 2.使用MP自定义枚举解决 U ...

  9. 阿里云AnalyticDB基于Flink CDC+Hudi实现多表全增量入湖实践

    湖仓一体(LakeHouse)是大数据领域的重要发展方向,提供了流批一体和湖仓结合的新场景.阿里云AnalyticDB for MySQL基于 Apache Hudi 构建了新一代的湖仓平台,提供日志 ...

  10. 低代码之光!轻量级 GUI 的设计与实现

    前言 每当提起低代码,很多人都会下意识的出现过激反应,吐槽低代码都是**,唯恐避之不及.可能大部分人觉得低代码就是替代手写代码,对于程序员来说这是不可接受的.其实低代码表述的含义非常宽泛,我相信很多人 ...