springMVC笔记系列(8)——RequestParam注解

Easter79
• 阅读 551

前面的文章介绍过注解@PathVariable,它能够为Rest风格的URL用占位符的方式传递一个参数,但是这个参数并不是真正意义上的请求参数。请求参数怎么处理是本文的主要内容。

Spring MVC 通过分析处理方法的签名,将 HTTP 请求信息绑定到处理方法的相应人参中。

Spring MVC 对控制器处理方法签名的限制是很宽松的,几乎可以按喜欢的任何方式对方法进行签名。

必要时可以对方法及方法入参标注相应的注解(@PathVariable、 @RequestParam、 @RequestHeader 等)、 SpringMVC 框架会将 HTTP 请求的信息绑定到相应的方法入参中,并根据方法的返回值类型做出相应的后续处理。

(本文出自:http://my.oschina.net/happyBKs/blog/417032)

在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法

– value:参数名

– required:是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常

控制器类和处理函数如下:

package com.happyBKs.springmvc.handlers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@RequestMapping("class")
@Controller
public class RPTestHandler {
    
    String page="successrm";
    
    @RequestMapping("student")
    public String handle(@RequestParam(value="username") String un, @RequestParam(value="age") int age)
    {
        System.out.println("a student's request has come. username: "+un+", age: "+age);
        return page;
    }
    
    

}

这里使用@RequestParam注解的value属性值来映射请求参数。

请求页面index8.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<a href="class/student?username=happyBKs&age=100">class/student?username=happyBKs&age=100</a>
</body>
</html>

好,运行过程如下:

springMVC笔记系列(8)——RequestParam注解

点击超拦截请求:

springMVC笔记系列(8)——RequestParam注解

控制台此时输出:

a student's request has come. username: happyBKs, age: 100

也可以直接在浏览器地址栏输入http://localhost:8080/mymvc/class/student?username=happyBKs&age=101

控制台显示   a student's request has come. username: happyBKs, age: 101

问题1:如果我们的请求少一个参数age,会怎么样?

springMVC笔记系列(8)——RequestParam注解

这个问题该如何解决呢?

这里需要用到@RequestParam注解的required属性或defaultValue属性。

required属性标注这个参数是否是必需大的,默认是true,如果想让它可以不存在,那么就设置为false。但是请注意,required设置成false的参数对应的处理函数的参数类型必须是对象类型,否则回报错500!

例如这里我们如果将控制器类改成:

package com.happyBKs.springmvc.handlers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@RequestMapping("class")
@Controller
public class RPTestHandler {
    
    String page="successrm";
    
    @RequestMapping("student")
    public String handle(@RequestParam(value="username") String un, @RequestParam(value="age",required=false) int age)
    {
        System.out.println("a student's request has come. username: "+un+", age: "+age);
        return page;
    }
    
    

}

结果会报错,因为age虽然设置了required为false,请求参数可以不包含age,但是在处理函数中对应的参数类型是int,int是基本数据类型,无法为空,所以报错。解决办法是将int改为Integer。

运行结果:

springMVC笔记系列(8)——RequestParam注解

控制台输出:

a student's request has come. username: happyBKs, age: null

如果我们仍然想用基本类型作为参数类型,那么可以用到@RequestParam注解的defaultValue属性来指定默认值。

package com.happyBKs.springmvc.handlers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@RequestMapping("class")
@Controller
public class RPTestHandler {
    
    String page="successrm";
    
    @RequestMapping("student")
    public String handle(@RequestParam(value="username") String un, @RequestParam(value="age",required=false, defaultValue="0") int age)
    {
        System.out.println("a student's request has come. username: "+un+", age: "+age);
        return page;
    }
    
    

}

运行结果:

springMVC笔记系列(8)——RequestParam注解

控制台 a student's request has come. username: happyBKs, age: 0

最后,做个总结:(@RequestParam注解是很常用的,所以很重要)

* @RequestParam 来映射请求参数

* value值 即请求参数名

* required 该参数是否必需。默认为true

* defaultValue请求参数的默认值

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
虾米大王 虾米大王
1年前
java代码012
code012.jspInserttitlehere<%JSP内置对象1.request用于处理HTTP请求中的各项参数。如,删除可以通过request对象的getParameter()方法获取如,request.getParameter("id")在请求转发时,需要把一些数据传递到转发后的页面处理。就需要用到request的se
Easter79 Easter79
2年前
SpringFramework之ContentNegotiation内容协商
  Spring版本5.1.4.release.  内容协商是用在Springmvc返回Controller方法结果序列化时使用,而不是解析mvc参数时使用。    Springmvc支持4种内容协商,拓展名、固定值、Http的头部Accept、请求参数format,那Springmvc中怎么实现的呢,怎么使用已经有很多人分析了,这里来分析下
Stella981 Stella981
2年前
Spring Boot 406(type=Not Acceptable, status=406)异常解决办法
使用SpringBoot,Controller请求返回的参数类型是ResponseBody,如果请求的时候使用使用配置的默认请求扩展名,例如.html,SpringMVC会抛出一个typeNotAcceptable,status406错误,如下:WhitelabelErrorPageThisapplica
Stella981 Stella981
2年前
Spring MVC 解读——@RequestMapping (2)
SpringMVC解读——@RequestMapping    上一篇文章中我们了解了Spring如何处理@RequestMapping注解,并将请求映射信息保存到系统中以处理客户端发送来的请求,但是Spring是怎样接受请求,并根据请求URL来匹配正确的处理器方法呢,更重要的是Sprin
Easter79 Easter79
2年前
SpringMVC学习(二)@Requestmapping映射和Rest风格
1、@RequestMapping1.1、@RequestMapping映射请求注解在SpringMVC中使用@RequestMapping注解可以为控制器指定处理哪些URL请求可以用于类上或者方法上类定义处:提供初步的请求映射信息。相对于WEB应用
Stella981 Stella981
2年前
SpringBoot2 学习10 Controller接收参数的方式
地址传值@PathVariable获取路径参数。即url/{id}这种形式。?传值@RequestParam获取查询参数。即url?name这种形式用注解@RequestParam绑定请求参数到方法入参当请求参数username不存在时会有异常发生,可以通过设置属性requiredfalse解决,例如:@R
Easter79 Easter79
2年前
SpringBoot2 学习10 Controller接收参数的方式
地址传值@PathVariable获取路径参数。即url/{id}这种形式。?传值@RequestParam获取查询参数。即url?name这种形式用注解@RequestParam绑定请求参数到方法入参当请求参数username不存在时会有异常发生,可以通过设置属性requiredfalse解决,例如:@R
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k