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. CF1881C Perfect Square 题解

    思路 简单滴很,对于每一组 \((i,j)\) 找出其对应的三个点,减一减就完了. 对应的点是哪三个呢?显然是 \((n-i+1,n-j+1)\),\((j,n-i+1)\) 以及 \((i,n-j+ ...

  2. 【Android】做一个简单的每日打卡app-day01【还没做好】

    任务: 第一阶段目标: 1.用户注册:用户注册信息包括用户ID(学号).用户名(姓名),手机号码,用户单位(班级),用户班级四项基本信息,用户第一次注册后,用户姓名不用每次输入 . 2.每日总结打卡: ...

  3. Codeforces Round 894 (Div. 3)

    Codeforces Round 894 (Div. 3) A. Gift Carpet 题意:判断一列一个字母有没有"vika" 思路:挨个枚举每一列 #include<b ...

  4. [GDOIpj221B] 数列游戏

    第二题 数列游戏 提交文件: sequence.cpp 输入文件: sequence.in 输出文件: sequence.out 时间空间限制: 1 秒, 256 MB 有一个长度为 \(n\) 的序 ...

  5. 【UniApp】-uni-app-CompositionAPI传递数据

    前言 好,经过上个章节的介绍完毕之后,了解了一下 uni-app-传递数据 那么了解完了uni-app-传递数据之后,这篇文章来给大家介绍一下 uni-app-CompositionAPI传递数据 首 ...

  6. Net 高级调试之十四:线程同步的基础知识和常见的同步原语

    一.介绍 今天是<Net 高级调试>的第十四篇文章,这篇文章我们主要介绍和线程相关的内容,当然不是教你如何去写多线程,更不会介绍多线程的使用方法和API,今天,我们主要讲一下锁,一说到多线 ...

  7. 实现 Raft 协议

    文章地址 简介 Raft 是一个分布式共识算法,用于保证所有机器对一件事达成一个看法.本文用于记录实现 Raft 选举和日志复制的代码细节. 选举 节点启动时首先是跟随者状态,如果到达选举超时时间就尝 ...

  8. 【Python】【OpenCV】【NumPy】图像数据的访问

    接上一随笔,这次学习针对图像数据的访问(Numpy.array) 在OpenCV中,使用 imread() 方法可以访问图像,其返回值是一个数组,而根据传入的不同图像,将会返回不同维度的数组. 针对返 ...

  9. 神经网络优化篇:详解归一化输入(Normalizing inputs)

    归一化输入 训练神经网络,其中一个加速训练的方法就是归一化输入.假设一个训练集有两个特征,输入特征为2维,归一化需要两个步骤: 零均值 归一化方差: 希望无论是训练集和测试集都是通过相同的\(μ\)和 ...

  10. LLM增强LLM;通过预测上下文来提高文生图质量;Spikformer V2;同时执行刚性和非刚性编辑的通用图像编辑框架

    文章首发于公众号:机器感知 LLM增强LLM:通过预测上下文来提高文生图质量:Spikformer V2:同时执行刚性和非刚性编辑的通用图像编辑框架 LLM Augmented LLMs: Expan ...