我们知道,URI
抽象结构:[scheme:][//authority][path][?query][#fragment]
其中:
authority
为[user-info@]host[:port]
query
就是参数列表,形式为parameter1=value1¶meter2=value2&...¶meterN=valueN
Spring MVC
中通过函数参数与@RequestParameter
绑定进行获取参数。
@RequestParameter
的定义如下:
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Map;
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
/**
* The name of the request parameter to bind to.
*/
String value() default "";
/**
* Whether the parameter is required.
* <p>Default is {@code true}, leading to an exception thrown in case
* of the parameter missing in the request. Switch this to {@code false}
* if you prefer a {@code null} in case of the parameter missing.
* <p>Alternatively, provide a {@link #defaultValue() defaultValue},
* which implicitly sets this flag to {@code false}.
*/
boolean required() default true;
/**
* The default value to use as a fallback when the request parameter value
* is not provided or empty. Supplying a default value implicitly sets
* {@link #required()} to false.
*/
String defaultValue() default ValueConstants.DEFAULT_NONE;
}
从定义可以看出来,@RequestParameter
只能使用在函数的参数上。并且有三个参数:
value用于指定要绑定的URL上的参数;
required用于指明这个参数是否是必须的。注意他的默认值是true,也就是这个参数是必须的。如果没有值就会抛出404错误。
defaultValue指的是当URL中没有绑定的参数的时候,使用此参数指定的值。
示例:
假设,我们要获取书的信息,传统风格的接口可能会是下面这样的:
GET http://localhost:8080/book?id=26298935
GET http://localhost:8080/book?id=26298936
GET http://localhost:8080/book?id=26298937
这时候,我们的实现如下:
package com.fpliu.newton.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public final class BookController {
@RequestMapping(value = "/book/{id}", method = RequestMethod.GET)
public String getInfo(@PathVariable("id") String id, Model model) {
//调用Service查询书的信息
return "book";
}
}
这里的例子是URL
里面只有一个参数,实际上可以有很多个参数,只要用@RequestParameter
绑定对应的URL
中的参数即可。