1. 程式人生 > >Java註解之@RequestParam

Java註解之@RequestParam

上節內容回顧:

1、針對@RequestMapping的學習,需要了解它的使用位置和功能,包含的方法。

位置用於類或方法之上,提供訪問路徑及引數的設定。另外包含的引數和方法有8中,name, value , path ,produces, consumes, method , headers, params.

針對每個引數的不同所起到的作用不同,詳細內容參考:@RequestMapping

2、@RequestParam學習記錄

@RequestParam也是一個介面,其中定義的介面方法value,name, required和defaultValue。

作用:將請求引數區資料對映到功能處理方法的引數上。

下面是該介面的原始碼。

2.1、原始碼:

package org.springframework.web.bind.annotation;

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {

	/**
	 * Alias for {@link #name}.
	 */
	@AliasFor("name")
	String value() default "";

	/**
	 * The name of the request parameter to bind to.
	 * @since 4.2
	 */
	@AliasFor("value")
	String name() default "";

	boolean required() default true;

	String defaultValue() default ValueConstants.DEFAULT_NONE;
}

2.2、value() 和 name()

這兩個方法的作用是一樣的,和@RequestMapping中的valeu()和path()是一樣,知識起了一個別名方法。

方法的作用:表示引數的名字,即入參的請求引數名字。

如下是xiaocui資訊查詢方法,其中包含的引數均是用@RequestParam實現的,預設的方法是value.

@RequestMapping(value = "/xiaocui/info",method = RequestMethod.GET)
@ResponseBody
public void XiaoCuiInfoQuery(@RequestParam String name, @RequestParam Integer age, @RequestParam String school){
  System.out.println("name:"+name+",age:"+age+",school:"+school);
}

在前臺可以直接傳入下面的引數等:

<input type="text" name="name" />
<input type="text" name="age" />

注:springMVC在使用過程中會根據引數名字來注入,因此,在使用Value時必須保證名字一致,不然入會注入。

拓展:如果和前臺的引數不一致了,則處理方法如下所示:

@RequestMapping(value = "/xiaocui/info",method = RequestMethod.GET)
@ResponseBody
public void XiaoCuiInfoQuery(@RequestParam(name="xiaocuiname") String name, @RequestParam(name="xiaocuiage") Integer age, @RequestParam String school){
  System.out.println("name:"+name+",age:"+age+",school:"+school);
}

在前臺需要傳入的引數如下:

<input type="text" name="xiaocuiname" />
<input type="text" name="xiaocuiage" />

2.3、required()

作用:要求前端配置的前端引數是否一定要傳。預設是true,表示請求中一定要有相應的引數,否則將報404錯誤碼;

如果設定為false,則在請求過程中可以忽略引數,不去考慮。

@RequestMapping(value = "/xiaocui/name",method = RequestMethod.GET)
@ResponseBody
public void XiaoCuiInfoQuery(@RequestParam(name="xiaocuiname",required=true) String name){
  System.out.println("name:"+name);
}

上述程式碼表示請求需要引數的傳入。

另外,如果required設定為false,則預設為引數賦值為null。

2.4、defaultVale()

defaultValue:預設值,表示如果請求中沒有同名引數時的預設值,預設值可以是SpEL表示式,如“#{systemProperties['java.vm.version']}”。

 方法呼叫的是常量值ValueConstants.DEFAULT_NONE.

檢視該常量的資訊如下:

public interface ValueConstants {

	/**
	 * Constant defining a value for no default - as a replacement for
	 * {@code null} which we cannot use in annotation attributes.
	 * <p>This is an artificial arrangement of 16 unicode characters,
	 * with its sole purpose being to never match user-declared values.
	 * @see RequestParam#defaultValue()
	 * @see RequestHeader#defaultValue()
	 * @see CookieValue#defaultValue()
	 */
	String DEFAULT_NONE = "\n\t\t\n\t\t\n\uE000\uE001\uE002\n\t\t\t\t\n";
}

注:其唯一目的是永遠不匹配使用者宣告的值。

採用該方法後就不會有使用者匹配到該值。(小概率事件)