服務端數據到客戶端
返回頁面,Controller中方法返回String,String對應的是view的位置,如果需要攜帶數據通過model(相當於一個Map)傳遞到view, view中使用jstl的EL表達式來綁定model帶來的數據。
Java代碼
@RequestMapping(value="/getPojoView", method=RequestMethod.GET)
public String getPojoView(Model model){
Pojo pojo = new Pojo();
pojo.setPojoName("testName");
pojo.setPojoValue("testValue");
model.addAttribute(pojo);
return"sample/pojoView";
}
返回Json對象,利用@ResponseBody來實現。
Java代碼
@RequestMapping(value="/getPojoJson", method=RequestMethod.GET)
public @ResponseBody Pojo getPojoJson(){
Pojo pojo = new Pojo();
pojo.setPojoName("testName");
pojo.setPojoValue("testValue");
return pojo;
}
註:spring mvc自動將java對象轉化成瞭json對象傳回瞭客戶端,返回對象可以是Pojo也可以是List
直接操作Response自己實現想要的效果。
Java代碼
@RequestMapping(value="/getCustomResponse", method=RequestMethod.GET)
public void getCustomResponse(HttpServletResponse response){
//操作response…
}
註:response為spring根據方法的type類型註入的
客戶端數據到服務端
通過URL傳回參數:
view
Html代碼
<script type="text/javascript"src="jquery-1.4.min.js"></script>
<h1>button與鏈接效果一致</h1>
<a href="simple?name=text&age=28">simple</a><button onclick="simple()">simple</button><br/>
<script type="text/javascript">
function simple(){
$.getJSON("simple",{"name":"nameJsonTest","age":"100"},function(){});
}
</script>
<a href="list?names[]=aaaa&names[]=bbbb">list</a><button onclick="list()">list</button><br/>
<script type="text/javascript">
function list(){
$.getJSON("list",{"names":["name1","name2","name3"]},function(){});
}
</script>
<a href="pojo?pojo[pojoName]=hahaha&pojo[pojoValue]=kkkkkk">pojo</a><button onclick="pojo()">pojo</button><br/>
<script type="text/javascript">
function pojo(){
$.getJSON("pojo",{"pojo":{"pojoName":"testName","pojoValue":"testValue"}},function(){});
}
</script>
<a href="rest/10/2">rest</a><button onclick="rest()">rest</button><br/>
<script type="text/javascript">
function rest(){
var pageSize = 20;
var pageNo = 3;
$.getJSON("rest/"+pageSize+"/"+pageNo,{},function(){});
}
</script>
controller
Java代碼
package sample;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping(value="/urlparam")
public class UrlParamController {
@RequestMapping(value="/", method=RequestMethod.GET)
public String index(){
return"urlparam/index";
}
@RequestMapping(value="/simple", method=RequestMethod.GET)
public void simple(@RequestParam String name, @RequestParam Integer age){
System.out.println("name:"+name);
System.out.println("age:"+age);
}
//list內不能放POJO對象
@RequestMapping(value="/list", method=RequestMethod.GET)
public void list(@RequestParam("names[]") String[] names){
//也可以用List<String> names來接收
for(String name : names){
System.out.println("name:"+name);
}
}
//單URL目前還不支持POJO對象,隻能支持鍵值對,希望spring以後有所改善
@RequestMapping(value="/pojo", method=RequestMethod.GET)
public void pojo(@RequestParam("pojo[pojoName]") String name, @RequestParam("pojo[pojoValue]") String value){
System.out.println("name:"+name);
System.out.println("value:"+value);
}
@RequestMapping(value="/rest/{pageSize}/{pageNo}", method=RequestMethod.GET)
public void rest(@PathVariable Integer pageSize, @PathVariable Integer pageNo){
System.out.println("pageSize:"+pageSize);
System.out.println("pageNo:"+pageNo);
}
}
通過POST表單傳回參數:
方式同與url的是一致的,需要將method=RequestMethod.POST,不過有中文的話一般都用post來避免轉碼。一般ajax的時候用$.post而不能使用jQuery插件json的$.postJSON。下面會講到。
通過使用jQuery插件json的$.postJSON傳回參數:
$.postJSON返回的是:application/json,
$.post返回的是: application/x-www-form-urlencoded
spring會將postJSON傳回的json字符串轉換成對象再將對象丟給帶有@RequestBody的形參。 由於json字符串直接轉換為對象,所以@RequestBody隻能接收一個對象還需要屬性一一對應,不能多傳參數。此方式可以傳POJO,也可以傳List<POJO>。
Js代碼
$.postJSON('url', {"name":"testName","age":"28"},function(){});
Java代碼
<span style="font-family: Arial,Arial,Helvetica,sans-serif; font-size: 18px; white-space: normal;"><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 12px; white-space: pre;">class Pojo{
</span></span> private Long id;
private String name;
private Integer age;
//get,set…
}
Java代碼
@RequestMapping(value="pojo", method=RequestMethod.POST)
publicvoid sentPojo(@RequestBody Pojo pojo){
System.out.println(pojo.getPojoName());
System.out.println(pojo.getPojoValue());
}
註:目前對於一對象,附帶幾個簡單參數的解決辦法是將簡單參數通過為REST的url路徑參數來傳送。
直接拿到Request來操作:
Java代碼
@RequestMapping(value="/", method=RequestMethod.GET)
public String withRequest(HttpServletRequest request){
//操作request…
return"someview";
}
以上controller內的方法的形參, 除瞭@RequestBody和@RequestParam不能同時聲明外,都可以進行組合來滿足各種需求。
小結:spring mvc3充分利用瞭annotation的好處將參數傳遞過程中的轉換全部變為瞭透明,這樣省去瞭程序員對參數進行一些無聊的轉換,這肯定能提高不少效 率。另一方面想說的是spring的@RequestBody還可以做的更好,如果能允許多個對象同時傳送,那這個東西就十分好瞭。