springMVC(3)方法入参灵活绑定

在原生Servlet中,我们通过在doGet和doPost方法绑定web资源访问接口:HttpServletRequest和HttpServletResponse到入参来进一步通过request.getParameter()等方法获取我们的web资源。在SpringMVC中,我们一样可以将HttpServletRequest和HttpServletResponse绑定到入参中使用,但除此之外,SpringMVC还能进一步分析我们处理方法的入参信息,将各类请求资源绑定到我们的方法入参上,并将数据类型转化为我们定义的类型,为我们可以节省了大量的参数获取、初始化工作。

简单名称对应绑定参数

最基本的数据绑定是通过参数名对应完成绑定,如下例

@RequestMapping("test")
public void test8(Integer id ){
    System.out.println(id);
}

下面我们访问root/test?id=111(后面示例项目根路径默认使用“root”表示,),会发现控制台打印“111”,即控制台轻松的帮我们完成了入参绑定,这里我们定义id为Integer,如果我们定义String类型,spring也会帮我们完成相应的类型转换。而如果我们直接访问root.test,即不带任何参数,则方法入参id找不到对应的请求参数名,就为null了。

但现在,我们尝试访问root/test?id=aaa则服务器会响应400错误。这是因为类型转换异常“aaa”不能转换java.lang.Integer。

在这里,我们谈到的是基本类型绑定,但实际上,springMVC还可以帮我们完成很多复杂类型的数据绑定,如:自定义对象User,数组User[],List,Set,Map等,这些都会在我后面的文章提到,敬请关注

使用@RequestParam绑定参数

方法入参上使用注解@RequestParam能为我们完成更灵活的参数绑定工作,在上一个实例中,我们通过名称对应简单地完成了参数绑定,假如我们现在有需求:

1. 某个关键参数必须传入(比如登陆,我们要求必须有用户名和密码)

2. 某个参数可以不传,但必须要有默认值。

针对这些需求,我们来看下面实例:

@RequestMapping("login")
public void login(@RequestParam(value = "userName",required = true) String userName,//绑定userName,要求必须
        @RequestParam(value = "password",required = true) String pwd){//绑定password,因为在value上对应了,所以方法入参名称可以为其他字符串
    System.out.println(userName + "-" + pwd);
}
@RequestMapping("list")
public void list(@RequestParam(value = "pageNow",required = false , defaultValue = "1") Integer pageNow){//模拟分页查询,当前页码可以不传,默认为第一页
    System.out.println(pageNow);
}

@RequestParam涉及三个参数:

参数 说明
value 参数名
required 是否必须,一旦使用了@RequestParam注解,默认为true,如果不存在对应请求参数会出现异常:HTTP Status 400 - Required String parameter ‘userName‘ is not present
defaultValue 默认参数值

根据项目需求合理地使用以上三个参数值,能在实际开发中为我们带来一定的便利。

使用@CookieValue绑定cookie

在一般情况下,我们要获取cookie信息,需要使用request.getHeader("cookie")request.getCookies()等方法来获取,而使用@CookieValue能将我们需要的特定cookie信息绑定到方法入参中。

@RequestMapping("cookie")
public void cookie(@CookieValue(value = "JSESSIONID",required = false) String cookie ){
    System.out.println(cookie);
}

value指定了对应cookie的名称,required设置为false表示非必须的,它还有一个属性defaultValue设置不存在时的默认值

使用@RequestHeader绑定头信息

我们先来看一个完整的的头信息组成

Accept text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8

Accept-Encoding gzip, deflate

Accept-Language en-US,en;q=0.5

Connection keep-alive

Host localhost:8080

User-Agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0

在springMVC中,我们可以使用@RequestHeader来获取上述头信息的相应数值,如下面实例

@RequestMapping("headerInfo")
public void headerInfo(@RequestHeader("Accept-Encoding") String Encoding,
        @RequestHeader("Accept-Language") String Language,
        @RequestHeader("Cache-Control") String Cache,
        @RequestHeader("Connection") String Connection,
        @RequestHeader("Cookie") String Cookie,
        @RequestHeader("Host") String Host,
        @RequestHeader("User-Agent") String Agent
        ){
    System.out.println(Language);
    System.out.println(Cache);
    System.out.println(Connection);
    System.out.println(Cookie);
    System.out.println(Host);
    System.out.println(Agent);
}

访问/root/headerInfo,控制台打印:

en-US,en;q=0.5

max-age 0

keep-alive

JSESSIONID=854678F41A231776AFB366DE8A90A356

localhost:8080

Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0

需要注意的是,如果我们这里缺少对应的头信息,而尝试获取的话,而抛出异常类似: Missing header ‘xxxxx’ of type [java.lang.String]

使用IO对象作为入参

在HttpServlet中,我们可以通过request.getReader()方法读取请求信息,使用response.getOutputStream(),getWriter()方法输出响应信息,通样的,在springMVC中,我们可以将上述IO对象绑定到方法入参中使用。我们来看代码实例

@RequestMapping("IO")
public void IO(BufferedReader reader,PrintWriter printWriter ){
    System.out.println(reader);//输出[email protected]
    System.out.println(printWriter);//输出[email protected]
}
@RequestMapping("IO2")
public void IO2(InputStream inputStream,OutputStream outputStream){
    System.out.println(inputStream);//输出[email protected]
    System.out.println(outputStream);//输出[email protected]
}
@RequestMapping("IO3")
public void IO3(InputStream inputStream,BufferedReader reader){
    System.out.println(inputStream);
    System.out.println(reader);
    //报错java.lang.IllegalStateException: getInputStream() has already been called for this request
}
@RequestMapping("IO4")
public void IO4(PrintWriter printWriter ,OutputStream outputStream){
    System.out.println(printWriter);
    System.out.println(outputStream);
    //报错java.lang.IllegalStateException: getWriter() has already been called for this response
}

从这里我们看到,spring会帮我们完成IO**包装和绑定**,输入输出各一个,如果同类超过一个,就会报错

时间: 2024-08-04 16:07:37

springMVC(3)方法入参灵活绑定的相关文章

Spring Assert断言 (方法入参检测工具类-断言)

Web 应用在接受表单提交的数据后都需要对其进行合法性检查,如果表单数据不合法,请求将被驳回.类似的,当我们在编写类的方法时,也常常需要对方法入参进行合 法性检查,如果入参不符合要求,方法将通过抛出异常的方式拒绝后续处理.举一个例子:有一个根据文件名获取输入流的方法:InputStream getData(String file),为了使方法能够成功执行,必须保证 file 入参不能为 null 或空白字符,否则根本无须进行后继的处理.这时方法的编写者通常会在方法体的最前面编写一段对入参进行检测

Mybatis方法入参处理

1,在单个入参的情况下,mybatis不做任何处理,#{参数名} 即可,甚至连参数名都可以不需要,因为只有一个参数,或者使用 Mybatis的内置参数 _parameter. 2,多个入参: 接口方法定义:public Employee getEmpByIdAndName(Integer id,String name); 取值:#{id},#{name} mybatis抛出异常:org.apache.ibatis.binding.BindingException:Paramter 'id' no

Spring Assert(方法入参检测工具类-断言)

Web 应用在接受表单提交的数据后都需要对其进行合法性检查,如果表单数据不合法,请求将被驳回.类似的,当我们在编写类的方法时,也常常需要对方法入参进行合 法性检查,如果入参不符合要求,方法将通过抛出异常的方式拒绝后续处理.举一个例子:有一个根据文件名获取输入流的方法:InputStream getData(String file),为了使方法能够成功执行,必须保证 file 入参不能为 null 或空白字符,否则根本无须进行后继的处理.这时方法的编写者通常会在方法体的最前面编写一段对入参进行检测

方法入参和返回值介绍

JAVA方法入参和返回类型 方法入参 基础数据类型 引用数据类型 修饰符 返回类型 方法名(参数类型 参数名,参数类型 参数名...){//方法体return} 方法返回类型 return xxx 具体类型 如果不用返回,则方法返回类型上写void 修饰符 void ?方法名(参数类型 参数名,参数类型 参数名...){//?方法体} 例子 1 package study2day;public class Student1 { 2 private int age; 3 public void s

HandlerMethodArgumentResolver(一):Controller方法入参自动封装器(将参数parameter解析为值)【享学Spring MVC】

HandlerMethodArgumentResolver(一):Controller方法入参自动封装器(将参数parameter解析为值)[享学Spring MVC] 原文地址:https://www.cnblogs.com/hfultrastrong/p/12618488.html

iview组件select之默认展示label,并传空value做方法入参

要求: 默认查询操作日期在当日的数据:(打开页面时默认选中时间.全部) 后台约定:选定“全部”这个条件,传的值是空"" 综上:使用select选择框的v-model绑定数据,使用:value :label 展示默认数据 ,数组和单个字段. 遇到的问题: 直接在data里面定义{value: '',label: '全部'}失败,当下拉点全部的时候,因为value是空,所以选择框里点“全部”时选不上.传值到接口也失败了. 所以,先赋值value为0,给接口包一层,先判断入参值是否为0,若是

springmvc学习笔记(11)-springmvc注解开发之简单参数绑定

springmvc学习笔记(11)-springmvc注解开发之简单参数绑定 springmvc学习笔记11-springmvc注解开发之简单参数绑定 spring参数绑定过程 默认支持的类型 简单类型 pojo绑定 自定义参数绑定实现日期类型绑定 springmvc和struts2的区别 本文主要介绍注解开发的简单参数绑定,包括简单类型.简单pojo以及自定义绑定实现类型转换 spring参数绑定过程 从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到contro

springmvc学习笔记(13)-springmvc注解开发之集合类型参数绑定

springmvc学习笔记(13)-springmvc注解开发之集合类型参数绑定 springmvc学习笔记13-springmvc注解开发之集合类型参数绑定 数组绑定 需求 表现层实现 list绑定 需求 表现层实现 map绑定 本文主要介绍注解开发的集合类型参数绑定,包括数组绑定,list绑定以及map绑定 数组绑定 需求 商品批量删除,用户在页面选择多个商品,批量删除. 表现层实现 关键:将页面选择(多选)的商品id,传到controller方法的形参,方法形参使用数组接收页面请求的多个商

SpringMVC 完美解决PUT请求参数绑定问题(普通表单和文件表单)

一 解决方案 修改web.xml配置文件 将下面配置拷贝进去(在原有的web-app节点里面配置 其它配置不变) <!-- 处理PUT提交参数(只对基础表单生效) --> <filter> <filter-name>httpPutFormContentFilter</filter-name> <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filt