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. 在Linux平台下使用.NET Core访问Access数据库读取mdb文件数据

    在 Linux平台下使用 .NET Core 访问 Access数据库 读取 mdb文件 数据 今天有群友在群里问 C# 能不能在 Linux 下访问 Access数据库? 我觉得这很有趣,因此研究折 ...

  2. iOS APP包分析工具

    介绍 分享一款用于分析iOSipa包的脚本工具,使用此工具可以自动扫描发现可修复的包体积问题,同时可以生成包体积数据用于查看.这块工具我们团队内部已经使用很长一段时间,希望可以帮助到更多的开发同学更加 ...

  3. 理解Mysql索引原理及特性

    作为开发人员,碰到了执行时间较长的sql时,基本上大家都会说"加个索引吧".但是索引是什么东西,索引有哪些特性,下面和大家简单讨论一下. 1 索引如何工作,是如何加快查询速度 索引 ...

  4. mybatis_高级

    注解方式: 不需要配置文件 @select等注解直接放在接口mapper里 多表操作: @Select("select * from user1") @Results({ @Res ...

  5. C和C++练习

    要点: 1.数组 2.冒泡排序BubbleSort 3.带指针的结构体(malloc,free) 4.字符串操作(拷贝.逆序.比较) 5.格式化输出printf,sprintf 6.格式化输入,sca ...

  6. ES集群搭建和Kibana管理集群

    搭建实例 先复制2份解压后的完整目录,将里面的data和log删除. elasticsearch-6.8.23-node2 elasticsearch-6.8.23-node3 修改3个实例的配置文件 ...

  7. 【fmjava】 面试题突击训练-Java基础语法篇01

    JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称, Java 开发工具包, 提供了 Java 的开发环境和运行环境. JRE:Java Runtime Env ...

  8. Python——第二章:替换和切割

    strip() 用法: .strip() 是字符串方法之一,在 Python 中用于移除字符串开头和结尾的空白字符(包括空格.制表符 \t.换行符\n等).这个方法返回一个新的字符串,原始字符串本身不 ...

  9. 【csharp】抽象类与接口有哪些不同?什么时候应该使用抽象类?

    抽象类与接口有哪些不同? 抽象类和接口是在面向对象编程中两个不同的概念,它们有一些重要的区别.以下是抽象类和接口的主要不同点: 抽象类(Abstract Class): 成员类型: 抽象类可以包含抽象 ...

  10. 前端系列:正则表达式RegExp详解

    目录 正则创建 匹配方法 元字符 字符集合 边界 分组 数量词汇 匹配模式 RegExp 方法特性 正则创建 字面量创建 const str = 'asdf123sds3234' const rege ...