Springmvc——Controller接受各類請求引數
url傳送過來的請求攜帶的引數多種多樣,SpringMVC提供了諸多註解來解析引數。期目的就是 把控制器從複雜的Servlet API中剝離開來,解耦合,這樣就可以在非web容器環境中重用控制器,也方便測試。
請求引數大致可分為5種:
- 普通請求引數
- 需要@RequestParam註解指定獲取引數
- 使用URL路徑傳遞引數
- 傳遞JSON資料引數
- 列表資料引數及表單序列化
假設有Controller如下:
@Controller
@RequestMapping("/params")
public class ParamsController {
//...
}
分述如下:
接受普通請求引數
SpringMVC比較智慧化,若傳遞過來的引數名和HTTP保持一致,那麼無需任何註解也可以獲取引數
表單提交如下:
<form id="form" action="./params/commonParams.do" method="get">
角色名稱:<input id="roleName" type="text" name="roleName" value="">
備註資訊:<input id="note" type="text" name="note" value="" >
</form>
controller層程式碼如下:
@RequestMapping("/commonParams")
public ModelAndView commonParams(String roleName, String note){
System.out.println("roleName->" + roleName);
System.out.println("note->" + note);
ModelAndView mv = new ModelAndView();
mv.setViewName("index" );
return mv;
}
這裡,C層就可以直接獲取到提交的引數,前提是引數名稱必須和HTTP請求的引數名稱保持一致,不一致無法獲取;
這種方式允許引數為空
——————————————————————
若是引數很多,可以將引數包裝成一個POJO(必有setter和getter方法),只要屬性名與引數一一對應,SpringMVC就能夠識別
form表單不需要改動,新增POJO接受引數:
public class RoleParams{
private String roleName;
private String note;
//---------getter & setter------------
}
則相應的C中程式碼改為:
@RequestMapping("/commonParams")
public ModelAndView commonParams(RoleParams roleParams){
System.out.println("roleName->" + roleParams.getRoleParams());
System.out.println("note->" + roleParams.getNote());
ModelAndView mv = new ModelAndView();
mv.setViewName("index");
return mv;
}
可以看出,提交的表單資料被自動包裝成了RoleParams 物件
使用@RequestParams獲取引數
第一種情況適用於請求引數和C中的方法形參一一對應,若有不對應時,springMVC無法識別,這時需要人為指定,使用@RequestParams註解
如HTTP引數名稱從roleName改為了role_name,則C中可作如下處理:
@RequestMapping("/commonParams")
public ModelAndView commonParams(@RequestParams("role_name") String roleName, String note){
System.out.println("roleName->" + roleName);
System.out.println("note->" + note);
ModelAndView mv = new ModelAndView();
mv.setViewName("index");
return mv;
}
若引數被@RequestParams註解,則預設不能為空,可以使用如下控制:
@RequestParams(value="role_name",required=false) String roleName
使用URL傳遞引數
使用URL傳遞引數,符合RESTful風格,比如想獲取id=1的角色,url可寫成“/params/getRole/1”,其中 1 就代表id,
Controller中的可以如下處理:
@Controller
@RequestMapping("/params")
public class ParamsController {
@Autowired
RoleServiceImpl roleService;
@RequestMapping("/getRole/{id}")
public ModelAndView pathVariable(@PathVariable("id") Long id){
Role role = roleService.getRole(id);
ModelAndView mv = new ModelAndView();
//繫結資料模型
mv.addObject(role);
//設為Json檢視,返回Json型別的資料給前臺
mv.setViewName(new MappingJackson2JsonView());
return mv;
}
}
{id}代表了處理器需要接受一個由URL組成的引數,引數名為id,方法中的@PathVariable(“id”)就代表取出url中的id引數;
@PathVariable允許對應引數為空
傳遞JSON型別引數
若客戶端傳遞過來是JSON物件引數,則使用@RequestBody註解獲取,引數依然要一一對應
假設客戶端使用JQuery向服務端傳遞JSON:
$(document).ready(function() {
//JSON資料和RoleParams一一對應
var data = {
roleName: 'role',
note: 'note_message'
}
//向後臺傳送請求
$.post({
url: ".params/findRoles.do",
//這裡必須告知傳遞型別為JSON
contentType: "application/json",
//HTTP只能傳遞字串,必須將JSON轉為字串形式
data: JSON.stringify(data),
success: function(result){}
});
});
則處理器中使用@RequestBody獲取JSON引數,包裝為一個POJO處理:
@RequestMapping("/findRoles")
public ModelAndView findRoles(@RequestBody RoleParams roleParams){
System.out.println("roleName->" + roleParams.getRoleParams());
System.out.println("note->" + roleParams.getNote());
ModelAndView mv = new ModelAndView();
mv.addObject(role);
mv.setViewName(new MappingJackson2JsonView());
return mv;
}
接受列表資料引數及表單序列化
用Java的集合或者陣列來接受JSON傳來的陣列型別
前臺程式碼:
$(document).ready(function() {
//JSON資料和RoleParams一一對應
var roleList = [
{roleName: 'abc', note: 'abc_note'},
{roleName: 'ABC', note: 'ABC_note'},
{roleName: 'xyz', note: 'xyz_note'},
]
//向後臺傳送請求
$.post({
url: ".params/findRoles.do",
//這裡必須告知傳遞型別為JSON
contentType: "application/json",
//HTTP只能傳遞字串,必須將JSON轉為字串形式
data: JSON.stringify(roleList ),
success: function(result){}
});
});
後臺處理:
@RequestMapping("/addRoles")
public ModelAndView addRoles(@RequestBody List<Role> roleList){
ModelAndView mv = new ModelAndView();
int totle = roleService.addRoles(roleList)
mv.addObject("totle", totle);
mv.setViewName(new MappingJackson2JsonView());
return mv;
}
提交序列化表單:
$(document).ready(function() {
$("#commit").click(function(){
var str = $("form").serialize();
$.post({
url: "./params/comonParamPojo2.do",
//序列化後,資料將以 roleName=xxx&¬e=yy 的形式傳遞
data: $("form").serialize(),
success: function(result){}
});
});
});