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