天天看點

bboss mvc參數綁定注解RequestParam使用說明

bboss mvc參數綁定注解RequestParam使用說明

@RequestParam作為控制器方法參數、bean對象屬性的注解,可以起到以下5個作用:

1.指定方法參數與request請求參數名稱的映射關系

方法參數-當方法參數名稱yournames和request參數名稱name不一緻時,則需要RequestParam注解來指定映射關系

public String sayHelloArray(
			@RequestParam(name = "name") String[] yournames, ModelMap model)      

bean屬性-當屬性名稱favovate 和request參數名稱favovate_ddd不一緻時,則需要RequestParam注解來指定映射關系

@RequestParam(name="favovate_ddd")
	private int favovate ;      

這個隻是最簡單的映射方式,bboss mvc還支援帶變量的參數名稱映射方式:

@RequestParam(name="favovate${id}")
	private int favovate ;      

這裡@RequestParam(name="favovate${id}")中的name屬性的值為favovate${id},其中的${id}部分的含義是request參數的名稱由favovate加上另外一個request參數id的值組合而成,也就是是這個參數名稱根據id參數的值來動态生成,這種情況适用于集合參數綁定場景(簡單的參數映射也可以使用):

表單代碼,輸入兩個人的姓名和興趣喜好,送出後綁定成List<ExampleBean> yourname參數

<tr><td>
						<input name="id" type="hidden" value="0">
							請輸入您的名字:
						<input name="name" type="text">
						</td>
					</tr>
					<tr><td>喜好:
						<input name="favovate0" type="radio" checked="true"  value="0"> 乒乓球
						<input name="favovate0" type="radio" value="1"> 籃球
						<input name="favovate0" type="radio" value="2"> 排球
						</td>
					</tr>
					
					<tr><td>
						<input name="id" type="hidden" value="1">
							請輸入您的名字:
						<input name="name" type="text">
						</td>
					</tr>
					<tr><td>喜好:
						<input name="favovate1" type="radio" checked="true"  value="0"> 乒乓球
						<input name="favovate1" type="radio" value="1"> 籃球
						<input name="favovate1" type="radio" value="2"> 排球
						</td>
					</tr>      

控制器方法:

public String sayHelloBeanList(List<ExampleBean> yourname, ModelMap model)
	{

		model.addAttribute("serverHelloListBean", yourname);

		return "path:sayHello";
	}      

ExampleBean類的favovate屬性分别對應于表單中的favovate0和favovate1,也就是說每條記錄對應一組radio的名稱都不一樣,由favovate+記錄id的值組成:

public class ExampleBean
{
	private String id;
	private String name = null;
	private String sex = null;
	@RequestParam(name="favovate${id}")
	private int favovate ;
}      

那麼在背景就可以通過favovate${id}來指定request參數和屬性favovate的映射關系

@RequestParam(name="favovate${id}")

private int favovate ;

目前變量參數名中隻能指定一個變量,這個變量在參數名稱中的位置可以任意有以下形式:

favovate${id}:假設請求參數id的值為1,那麼最終的映射參數名稱為favovate1

fav${id}ovate:假設請求參數id的值為1,那麼最終的映射參數名稱為fav1ovate

${id}favovate:假設請求參數id的值為1,那麼最終的映射參數名稱為1favovate

也可以隻有變量:

${id}:假設請求參數id的值為1,那麼最終的映射參數名稱為1

變量參數中如果請求參數id的值為null或者""時,變量id對應的名稱部分将被忽略,是以一般需要注意這一點。

在控制器方法參數上簡單的使用參數變量的示例:

public String sayHelloStringVar(@RequestParam(name = "name${id}") String yourname,
			ModelMap model)      

2.指定參數的解碼字元集

@RequestParam( decodeCharset = "UTF-8")

private String name;

3.指定日期格式

示例如下:

@RequestParam( dateformat="yyyy-MM-dd") java.util.Date[] d12

4.指定參數的預設值

@RequestParam(defaultvalue="0") int ynum

5.指定參數值轉換器

Editor

如果請求參數和要綁定的參數類型不能直接轉換時需要通過Editor來實作自定義的參數綁定和類型轉換,下面是一個執行個體:

public String sayHelloEditors(@RequestParam(editor="org.frameworkset.mvc.ListStringArrayEditor") List<String[]> name,ModelMap model)      

轉換器org.frameworkset.mvc.ListStringArrayEditor定義如下:

public class ListStringArrayEditor implements ArrayEditorInf<List<String[]>> {

	@Override
	public List<String[]> getValueFromObject(Object fromValue) {
		if(fromValue == null)
			return null;
		if(fromValue instanceof String[])
		{
			String[] datas = (String[])fromValue; 
			if(datas.length<=0)
				return null;
			List<String[]> ret = new ArrayList<String[]>();
			
			for(String data :datas)
			{
				String[] tt = data.split(",");
				ret.add(tt);
			}
			return ret;
		}
		return null;
		
	}

	@Override
	public List<String[]> getValueFromString(String fromValue) {
		return null;
	}
}      

mvc架構參數綁定時,如果指定了類型為ArrayEditorInf的屬性編輯器, 則要求mvc架構傳入的參數為參數數組,否則隻能傳入單個值。這個轉換器有點複雜,可以看一個簡單一點的轉換器:

public class ListEditor implements EditorInf<List<String>> {

	public List<String> getValueFromObject(Object fromValue) {
		if(fromValue == null || fromValue.equals(""))
			return null;
			
		return getValueFromString(String.valueOf( fromValue));
		
	}

	public List<String> getValueFromString(String fromValue) {
		List<String> ret = new ArrayList<String>();
		String[] datas = fromValue.split(","); 
		for(String data :datas)
		{
			
			ret.add(data);
		}
		return ret;
	
	}


}      

EditorInf類型的editor專門處理單個參數值的轉換,ArrayEditorInf類型的editor專門處理數組參數轉換;通過這兩種類型的editor我們可以實作複雜的參數類型轉換。

更多詳細資訊請參考bboss mvc的參數綁定測試用例:

HelloWord.java hello.jsp