Spring MVC—— 获取请求参数

我们知道,URI抽象结构:[scheme:][//authority][path][?query][#fragment]

其中:

authority[user-info@]host[:port]

query就是参数列表,形式为parameter1=value1&parameter2=value2&...&parameterN=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中的参数即可。