spring mvc3提高生产力之——利用annotation使前后台数据交互更透明

http://houniao.iteye.com/blog/678974


这周花了点时间弄了一下spring mvc3,打算整理一个cheatsheet出来,方便后来者快速上手。


服务端数据到客户端
  1. 返回页面,Controller中方法返回String,String对应的是view的位置,如果需要携带数据通过model(相当于一个Map)传递到view, view中使用jstl的EL表达式来绑定model带来的数据。
    Java代码   收藏代码
    1. @RequestMapping(value="/getPojoView", method=RequestMethod.GET)  
    2. public String getPojoView(Model model){  
    3.   Pojo pojo = new Pojo();  
    4.   pojo.setPojoName("testName");  
    5.   pojo.setPojoValue("testValue");  
    6.   model.addAttribute(pojo);  
    7.   return"sample/pojoView";  
    8. }  
     
  2. 返回Json对象,利用@ResponseBody来实现。
    Java代码   收藏代码
    1. @RequestMapping(value="/getPojoJson", method=RequestMethod.GET)  
    2. public  @ResponseBody Pojo getPojoJson(){  
    3.   Pojo pojo = new Pojo();  
    4.   pojo.setPojoName("testName");  
    5.   pojo.setPojoValue("testValue");  
    6.   
    7.   return pojo;  
    8. }  
     注:spring mvc自动将java对象转化成了json对象传回了客户端,返回对象可以是Pojo也可以是List

  3. 直接操作Response自己实现想要的效果。
    Java代码   收藏代码
    1. @RequestMapping(value="/getCustomResponse", method=RequestMethod.GET)  
    2. public void getCustomResponse(HttpServletResponse response){  
    3.   //操作response...  
    4. }  
     注:response为spring根据方法的type类型注入的
客户端数据到服务端
  1. 通过URL传回参数:
    view
    Html代码   收藏代码
    1. <script type="text/javascript"src="jquery-1.4.min.js"></script>  
    2. <h1>button与链接效果一致</h1>  
    3. <a href="simple?name=text&age=28">simple</a><button onclick="simple()">simple</button><br/>  
    4. <script type="text/javascript">  
    5. function simple(){  
    6.   $.getJSON("simple",{"name":"nameJsonTest","age":"100"},function(){});  
    7. }  
    8. </script>  
    9. <a href="list?names[]=aaaa&names[]=bbbb">list</a><button onclick="list()">list</button><br/>  
    10. <script type="text/javascript">  
    11. function list(){  
    12.   $.getJSON("list",{"names":["name1","name2","name3"]},function(){});  
    13. }  
    14. </script>  
    15. <a href="pojo?pojo[pojoName]=hahaha&pojo[pojoValue]=kkkkkk">pojo</a><button onclick="pojo()">pojo</button><br/>  
    16. <script type="text/javascript">  
    17. function pojo(){  
    18.   $.getJSON("pojo",{"pojo":{"pojoName":"testName","pojoValue":"testValue"}},function(){});  
    19. }  
    20. </script>  
    21. <a href="rest/10/2">rest</a><button onclick="rest()">rest</button><br/>  
    22. <script type="text/javascript">  
    23. function rest(){  
    24.   var pageSize = 20;  
    25.   var pageNo = 3;  
    26.   $.getJSON("rest/"+pageSize+"/"+pageNo,{},function(){});  
    27. }  
    28. </script>   
    controller
    Java代码   收藏代码
    1. package sample;  
    2.   
    3. import org.springframework.stereotype.Controller;  
    4. import org.springframework.web.bind.annotation.PathVariable;  
    5. import org.springframework.web.bind.annotation.RequestMapping;  
    6. import org.springframework.web.bind.annotation.RequestMethod;  
    7. import org.springframework.web.bind.annotation.RequestParam;  
    8.   
    9. @Controller  
    10. @RequestMapping(value="/urlparam")  
    11. public class UrlParamController {  
    12.   @RequestMapping(value="/", method=RequestMethod.GET)  
    13.   public String index(){  
    14.     return"urlparam/index";  
    15.   }  
    16.    
    17.   @RequestMapping(value="/simple", method=RequestMethod.GET)  
    18.   public void simple(@RequestParam String name, @RequestParam Integer age){  
    19.     System.out.println("name:"+name);  
    20.     System.out.println("age:"+age);  
    21.   }  
    22.   
    23.   //list内不能放POJO对象  
    24.   @RequestMapping(value="/list", method=RequestMethod.GET)  
    25.   public void list(@RequestParam("names[]") String[] names){   
    26.   //也可以用List<String> names来接收  
    27.   for(String name : names){  
    28.     System.out.println("name:"+name);  
    29.   }  
    30. }  
    31.   
    32.   //单URL目前还不支持POJO对象,只能支持键值对,希望spring以后有所改善  
    33.   @RequestMapping(value="/pojo", method=RequestMethod.GET)  
    34.   public void pojo(@RequestParam("pojo[pojoName]") String name, @RequestParam("pojo[pojoValue]") String value){  
    35.     System.out.println("name:"+name);  
    36.     System.out.println("value:"+value);  
    37.   }  
    38.   
    39.   @RequestMapping(value="/rest/{pageSize}/{pageNo}", method=RequestMethod.GET)  
    40.   public void rest(@PathVariable Integer pageSize, @PathVariable Integer pageNo){  
    41.     System.out.println("pageSize:"+pageSize);  
    42.     System.out.println("pageNo:"+pageNo);  
    43.   }  
    44. }   

  2. 通过POST表单传回参数:
    方式同与url的是一致的,需要将method=RequestMethod.POST,不过有中文的话一般都用post来避免转码。一般ajax的时候用$.post而不能使用jQuery插件json的$.postJSON。下面会讲到。

  3.  通过使用jQuery插件json的$.postJSON传回参数:
    $.postJSON返回的是:application/json,
    $.post返回的是:application/x-www-form-urlencoded
    spring会将postJSON传回的json字符串转换成对象再将对象丢给带有@RequestBody的形参。
     由于json字符串直接转换为对象,所以@RequestBody只能接收一个对象还需要属性一一对应,不能多传参数。此方式可以传POJO,也可以传List<POJO>。
    Js代码   收藏代码
    1. $.postJSON('url', {"name":"testName","age":"28"},function(){});  
    Java代码   收藏代码
    1. <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{  
    2. </span></span>  private Long id;  
    3.   private String name;  
    4.   private Integer age;  
    5.   //get,set...  
    6. }  
    Java代码   收藏代码
    1. @RequestMapping(value="pojo", method=RequestMethod.POST)  
    2. publicvoid sentPojo(@RequestBody Pojo pojo){  
    3.   System.out.println(pojo.getPojoName());  
    4.   System.out.println(pojo.getPojoValue());  
    5. }  
     注:目前对于一对象,附带几个简单参数的解决办法是将简单参数通过为REST的url路径参数来传送。

  4.  直接拿到Request来操作:
    Java代码   收藏代码
    1. @RequestMapping(value="/", method=RequestMethod.GET)  
    2.   public String withRequest(HttpServletRequest request){  
    3.      //操作request...  
    4.    return"someview";  
    5. }  
     

以上controller内的方法的形参, 除了@RequestBody和@RequestParam不能同时声明外,都可以进行组合来满足各种需求。

 

小结:spring mvc3充分利用了annotation的好处将参数传递过程中的转换全部变为了透明,这样省去了程序员对参数进行一些无聊的转换,这肯定能提高不少效率。另一方面想说的是spring的@RequestBody还可以做的更好,如果能允许多个对象同时传送,那这个东西就十分好了。

你可能感兴趣的:(springMVC,前后台交互)