本章案例基于上一章spring-mvc入门程序案例。
本章主要讲解Spring mvc获取请求参数的几种方式和类型

  • 使用HttpServletRequest对象获取参数
  • 简单数据类型绑定–获取简单数据参数
  • @RequestParam映射
  • 使用自动机制将参数绑定为POJO对象
  • 自定义参数绑定
  • 获取多个同类型参数绑定为数组
  • 获取多个参数绑定List集合

1)使用HttpServletRequest对象获取参数

老方法,简单易懂,但是需要自己处理数据类型转化
例:

@Controller
public class HelloController {//请求的url路径@RequestMapping("/hello.do")public ModelAndView hello(HttpServletRequest request){System.out.println("Hello Controller!");String param=request.getParameter("param");System.out.println(param);//返回视图return new ModelAndView("jsp/hello");}
}

注意:如果想获得Request对象只需要在Controller类方法的形参中添加一个参数即可。SpringMVC框架会自动把Request对象传递给方法。这就是SpringMVC框架默认支持的参数类型。
浏览器访问:

SpringMVC框架默认支持的参数类型

处理器形参中添加如下类型的参数,处理适配器会默认识别并进行赋值。

  • HttpServletRequest:通过request对象获取请求信息。

  • HttpServletResponse:通过response处理响应信息。

  • HttpSession:通过session对象得到session中存放的对象。

  • Model/ModelMap:ModelMap是Model接口的实现类(后面详细介绍)。

    • 如果使用Model接口则可以不使用ModelAndView对象,Model对象可以向页面传递数据(model是框架给我们传递过来的对象,所以这个对象不需要我们返回),View对象则可以使用String返回值替代。不管是Model还是ModelAndView,其本质都是使用Request对象向jsp传递数据。

2)简单数据类型绑定–获取简单数据参数

当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。**Spring会自动将表单参数注入到方法参数,不需要做任何处理。**从Request获取参数的方法可以进一步简化
例:

@RequestMapping("/demo.do")
public ModelAndView demo(Integer id,String name){System.out.println(id+":"+name);//返回视图return new ModelAndView("jsp/hello");
}

SpringMVC框架支持的数据类型

  • 整形:Integer、int

  • 字符串:String

  • 单精度:Float、float

  • 双精度:Double、double

  • 布尔型:Boolean、boolean

注意:参数类型推荐使用包装数据类型,因为基础数据类型不可以为null。


3)@RequestParam映射

当请求的参数名称和处理器形参名称不一致时可以使用@RequestParam注解映射,参数类型自动转换,但可能出现类型转换异常
例:

@RequestMapping("/demo01.do")
public ModelAndView demo01(@RequestParam(value="id",defaultValue="1",required=true)Integer demoId,String name){System.out.println(demoId+":"+name);//返回视图return new ModelAndView("jsp/hello");
}

使用@RequestParam注解常用于处理简单类型的绑定。

  • value:参数名字,即入参的请求参数名字,如value=“id”表示请求的参数区中的名字为id的参数的值将传入。

  • required:是否必须,默认是false,为true时表示请求中一定要有相应的参数,否则将报如下错误:

  • defaultValue:默认值,表示如果请求中没有同名参数时的默认值。


形参名称为demoId,但是这里使用value=”id”限定请求的参数名为id,所以页面传递参数的名称必须为id。
这里通过required=true限定id参数为必须传递,如果不传递则报400错误,可以使用defaultvalue设置默认值,即使required=true也可以不传id参数值。


4)使用自动机制将参数绑定为POJO对象

如果提交的参数很多,或者提交的表单中的内容很多的时候可以使用pojo接收数据。要求pojo对象中的属性名和表单中input的name属性一致。 即pojo的属性名与请求参数名称一致。
先定义一个Demo类型

public class Demo{private Integer id;private String name;//getter setter方法略写
}

form表单:

<form action="demo02.do" method="post">编号id:<input type="text" name="id">姓名name:<input type="text" name="name"><input type="submit" value="提交">
</form>

Controller中参数绑定在POJO中:

@RequestMapping("/demo02.do")
public ModelAndView demo02(Demo demo){System.out.println(demo);//返回视图return new ModelAndView("jsp/hello");
}

请求的参数名称和pojo的属性名称一致,会自动将请求参数赋值给pojo的属性。注意:提交的表单中不要有日期类型的数据,否则会报400错误。如果想提交日期类型的数据需要用到后面的自定义参数绑定的内容。


5)自定义参数绑定

提交的表单中不要有日期类型的数据,否则会报400错误。如果想提交日期类型的数据需要用到后面的自定义参数绑定的内容。所以要真正解决这个需求,就必然要用到自定义参数绑定的内容。
由于日期数据有很多种格式,SpringMVC没办法把字符串转换成日期类型。所以需要自定义参数绑定。
前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。在SpringMVC中可以在处理器适配器上自定义Converter进行参数绑定。

自定义Converter

/*** SpringMVC转换器* Converter<S, T>  S:source源数据类型,T:target目标数据类型*/
public class DateConverter implements Converter<String, Date> {@Overridepublic Date convert(String source) {try {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = simpleDateFormat.parse(source);return date;} catch (ParseException e) {e.printStackTrace();}return null;}}

配置Converter

<!-- 配置一个注解驱动,如果配置此标签,那么就可以不用配置处理器映射器和处理器适配器 -->
<mvc:annotation-driven conversion-service="conversionService" />
<!-- 转换器的配置 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"><property name="converters"><set><bean class="com.oak.converter.DateConverter"/></set></property>
</bean>

Controller:

@RequestMapping("/demo03.do")
public ModelAndView demo03(Date time){System.out.println(time);//返回视图return new ModelAndView("jsp/hello");
}

网页url:

测试,控制台输出:

Thu Nov 15 09:56:55 CST 2018

6)获取多个同类型参数绑定为数组

假设form表单中有如下input:

<form action="demo04.do" method="post">编号id:     <input type="text" name="id">姓名name:    <input type="text" name="name">爱好interest:游泳:<input type="checkbox" name="hobby" value="游泳">打球:<input type="checkbox" name="hobby" value="打球">打架:<input type="checkbox" name="hobby" value="啪啪"><input type="submit" value="提交">
</form>


页面选中多个checkbox向Controller类的方法中传递。Controller类方法中可以用String[]接收,或者pojo的String[]属性接收。两种方式任选其一即可。

1)使用String [ ]接收

controller方法为:

@RequestMapping("/demo04.do")
public ModelAndView demo04(String [] hobby){System.out.println(Arrays.toString(hobby));//返回视图return new ModelAndView("jsp/hello");
}

2)使用pojo的String [ ]属性接收。

在Demo中添加属性和getter setter方法

private String [] hobby;public String[] getHobby() {return hobby;
}
public void setHobby(String[] hobby) {this.hobby = hobby;
}

Controller方法改为:

@RequestMapping("/demo04.do")
public ModelAndView demo04(Demo demo){System.out.println(Arrays.toString(demo.getHobby()));//返回视图return new ModelAndView("jsp/hello");
}

分别测试即可


7)获取多个参数绑定List集合

需求:
假设现在已经访问查询所有的列表界面,要批量修改数据

案例

重新修改Demo为:

package com.oak.controller;public class Demo {private Integer id;private String name;//getter setter 构造 toString方法
}

新建一个QueryVo类,定义一个泛型为Demo的list集合作为属性:

public class QueryVo {private List<Demo> demoList;//getter setter 构造 toString方法
}

controller中定义查询所有demo的方法

@RequestMapping("/demoList.do")
public ModelAndView list(){List<Demo> list=new ArrayList<Demo>();list.add(new Demo(1,"张三"));list.add(new Demo(2,"李四"));list.add(new Demo(3,"王五"));//返回视图ModelAndView modelAndView=new ModelAndView("jsp/demo_list");modelAndView.addObject("list",list);return modelAndView;
}

使用input输入项的name属性必须是包装pojo的list属性+下标+元素属性。
可以使用< c:forEach >标签中的varStatus属性:

  • ${status.index}:输出行号,从0开始。

  • ${status.count}:输出行号,从1开始。

  • ${status.current}:当前这次迭代的(集合中的)项。

  • ${status.first}:判断当前项是否为集合中的第一项,返回值为true或false。

  • ${status.last}:判断当前项是否为集合中的最后一项,返回值为true或false。

  • begin、end、step分别表示:起始序号,结束序号,跳跃步伐。

   <form action="demoUpdate.do" method="post"><c:forEach items="${list }" var="demo" varStatus="s">编号id:<input type="text" name="demoList[${s.index }].id" value="${demo.id }" readonly="readonly"/>姓名name:<input type="text" name="demoList[${s.index }].name" value="${demo.name }"><br/></c:forEach><input type="submit" value="提交"/></form>

定义能接收数据的Controller方法:

@RequestMapping("/demoUpdate.do")
public ModelAndView update(QueryVo queryVo){System.out.println(queryVo.getDemoList());//返回视图return new ModelAndView("jsp/hello");
}

注意:接收List类型的数据必须是pojo的属性,方法的形参为List类型无法正确接收到数据。
测试即可。

spring mvc Cotroller获取请求参数相关推荐

  1. 3.spring boot Controller获取请求参数的值

    2019独角兽企业重金招聘Python工程师标准>>> 1.获取连接中的参数,使用倒的关键词@PathVariable @RestController public class He ...

  2. 拦截器获取请求参数post_SpringBoot拦截器如何获取http请求参数

    1.1.获取http请求参数是一种刚需 我想有的小伙伴肯定有过获取http请求的需要,比如想 前置获取参数,统计请求数据 做服务的接口签名校验 敏感接口监控日志 敏感接口防重复提交 等等各式各样的场景 ...

  3. spring mvc 如何传递集合参数(list,数组)

    spring mvc 可以自动的帮你封装参数成为对象,不用自己手动的通过request一个一个的获取参数,但是这样自动的参数封装碰碰到了集合参数可能就需要点小技巧才可以了. 一.基础类型和引用类型有什 ...

  4. Spring MVC 异步处理请求,提高程序性能

    原文:http://blog.csdn.net/he90227/article/details/52262163 什么是异步模式 如何在Spring MVC中使用异步提高性能?一个普通 Servlet ...

  5. postman发送post请求,用request.getParameter()获取请求参数

    1.接口代码 @RequestMapping("notifyUrl")   public void notifyUrl(HttpServletRequest request, Ht ...

  6. 在拦截器中获取请求参数,[Ljava.lang.String; cannot be cast to java.lang.String报错

    Map<String,Object> parametersmap=invocation.getInvocationContext().getParameters();//获取请求参数    ...

  7. Spring MVC中获取当前项目的路径

    Spring MVC中获取当前项目的路径 在web.xml中加入以下内容 <!--获取项目路径--><context-param><param-name>webAp ...

  8. 示例Express中路由规则及获取请求参数

    本次给大家分享一篇基于express中路由规则及获取请求参数的方法,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. express中常见的路由规则 ...

  9. 获取请求参数通用方式|| 中文乱码问题||请求转发

    1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数 1. String getParameter(String name):根据参数名称获取参数值    use ...

  10. Request_获取请求参数中文乱码问题处理

    * 中文乱码问题:                 * get方式:tomcat 8 已经将get方式乱码问题解决了                 * post方式:会乱码              ...

最新文章

  1. 阿里云服务器ecs绑定域名,端口的问题,不用80端口
  2. 每次都觉得很神奇的JS
  3. Spring MVC入门示例教程--静态页面跳转
  4. word2vec原理_Word2vec详细整理(1)—权重更新原理
  5. Pool construction UVA - 1515 最小割模型
  6. 使用Mockito测试Spring组件
  7. python bokeh_提升视觉效果:使用Python和Bokeh制作交互式地图
  8. pytorch 命令行运行_PyTorch简介与相关安装
  9. 两万字详细爬虫知识储备,数据采集与清洗基础习题(一)头歌参考答案
  10. C语言为何到现在都是热门语言?原因很简单,程序员大牛都知道
  11. python怎么另起一行继续输入_python如何换行继续输入
  12. 创建索引时,键列位置的重要性
  13. ltp-ddt的makefile结构
  14. java jsp交友系统_Jsp+Servlet+Javabean网络交友程序设计+源代码
  15. 虚拟机NAT模式无法上网
  16. B站视频下载 bilibili 哔哩哔哩
  17. List中remove()方法的陷阱,开发谨记!
  18. 微软 android启动器,微软启动器Mirosoft Launcher
  19. Synopsys Formality 2018操作流程
  20. 悼念贝娜齐尔#183;布托

热门文章

  1. smartMeter
  2. 计算机操作系统详细学习笔记(四):设备管理 —— I/O 管理
  3. 特征值,特征向量,特征多项式
  4. Gargamel:信息安全取证工具
  5. Posta:跨文档信息安全搜索工具
  6. 服务器获取真实客户端 IP [ X-Forwarded-For ]
  7. 微信小程序 获取cookie 以及设置 cookie
  8. [您有新的未分配科技点][BZOJ3545BZOJ3551]克鲁斯卡尔重构树
  9. javascript 原型链实现继承简单例子
  10. 关于oracle的笔记