国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Spring MVC 是如何處理 JSon webservice

2019-11-08 03:17:37
字體:
來源:轉載
供稿:網友

SPRingMVC層跟JSon webservice 結合,幾乎不需要做什么配置,代碼實現也相當簡潔。再也不用為了組裝協議而勞煩辛苦

一、Spring注解@ResponseBody,@RequestBody和HttpMessageConverter Spring 3.X系列增加了新注解@ResponseBody,@RequestBody 

@RequestBody 將HTTP請求正文轉換為適合的HttpMessageConverter對象。@ResponseBody 將內容或對象作為 HTTP 響應正文返回,并調用適合HttpMessageConverter的Adapter轉換對象,寫入輸出流。HttpMessageConverter接口,需要開啟<mvc:annotation-driven  />。 AnnotationMethodHandlerAdapter將會初始化7個轉換器,可以通過調用AnnotationMethodHandlerAdapter的getMessageConverts()方法來獲取轉換器的一個集合 List<HttpMessageConverter> 引用ByteArrayHttpMessageConverter StringHttpMessageConverter ResourceHttpMessageConverter SourceHttpMessageConverter xmlAwareFormHttpMessageConverter Jaxb2RootElementHttpMessageConverter MappingJacksonHttpMessageConverter可以理解為,只要有對應協議的解析器,你就可以通過幾行配置,幾個注解完成協議——對象的轉換工作PS:Spring默認的json協議解析由Jackson完成。 二、servlet.xml配置 Spring的配置文件,簡潔到了極致,對于當前這個需求只需要三行核心配置: Xml代碼  收藏代碼<context:component-scan base-package="org.zlex.json.controller" />  <context:annotation-config />  <mvc:annotation-driven />  三、pom.xml配置 閑言少敘,先說依賴配置,這里以Json+Spring為參考: pom.xml Xml代碼  收藏代碼<dependency>          <groupId>org.springframework</groupId>          <artifactId>spring-webmvc</artifactId>          <version>3.1.2.RELEASE</version>          <type>jar</type>          <scope>compile</scope>      </dependency>      <dependency>          <groupId>org.codehaus.jackson</groupId>          <artifactId>jackson-mapper-asl</artifactId>          <version>1.9.8</version>          <type>jar</type>          <scope>compile</scope>      </dependency>      <dependency>          <groupId>log4j</groupId>          <artifactId>log4j</artifactId>          <version>1.2.17</version>          <scope>compile</scope>      </dependency>  主要需要spring-webmvc、jackson-mapper-asl兩個包,其余依賴包Maven會幫你完成。至于log4j,我還是需要看日志嘛。 包依賴圖: 至于版本,看項目需要吧! 四、代碼實現 域對象: java代碼  收藏代碼public class Person implements Serializable {        private int id;      private String name;      private boolean status;        public Person() {          // do nothing      }  }  這里需要一個空構造,由Spring轉換對象時,進行初始化。 @ResponseBody,@RequestBody,@PathVariable 控制器: Java代碼  收藏代碼@Controller  public class PersonController {        /**      * 查詢個人信息      *       * @param id      * @return      */      @RequestMapping(value = "/person/profile/{id}/{name}/{status}", method = RequestMethod.GET)      public @ResponseBody      Person porfile(@PathVariable int id, @PathVariable String name,              @PathVariable boolean status) {          return new Person(id, name, status);      }        /**      * 登錄      *       * @param person      * @return      */      @RequestMapping(value = "/person/login", method = RequestMethod.POST)      public @ResponseBody      Person login(@RequestBody Person person) {          return person;      }  }  備注:@RequestMapping(value = "/person/profile/{id}/{name}/{status}", method = RequestMethod.GET)中的{id}/{name}/{status}與@PathVariable int id, @PathVariable String name,@PathVariable boolean status一一對應,按名匹配。 這是restful式風格。 如果映射名稱有所不一,可以參考如下方式: Java代碼  收藏代碼@RequestMapping(value = "/person/profile/{id}", method = RequestMethod.GET)  public @ResponseBody  Person porfile(@PathVariable("id") int uid) {      return new Person(uid, name, status);  }  GET模式下,這里使用了@PathVariable綁定輸入參數,非常適合Restful風格。因為隱藏了參數與路徑的關系,可以提升網站的安全性,靜態化頁面,降低惡意攻擊風險。POST模式下,使用@RequestBody綁定請求對象,Spring會幫你進行協議轉換,將Json、Xml協議轉換成你需要的對象。@ResponseBody可以標注任何對象,由Srping完成對象——協議的轉換。做個頁面測試下: JS Js代碼  收藏代碼$(document).ready(function() {      $("#profile").click(function() {          profile();      });      $("#login").click(function() {          login();      });  });  function profile() {      var url = 'http://localhost:8080/spring-json/json/person/profile/';      var query = $('#id').val() + '/' + $('#name').val() + '/'              + $('#status').val();      url += query;      alert(url);      $.get(url, function(data) {          alert("id: " + data.id + "/nname: " + data.name + "/nstatus: "                  + data.status);      });  }  function login() {      var mydata = '{"name":"' + $('#name').val() + '","id":"'              + $('#id').val() + '","status":"' + $('#status').val() + '"}';      alert(mydata);      $.Ajax({          type : 'POST',          contentType : 'application/json',          url : 'http://localhost:8080/spring-json/json/person/login',          processData : false,          dataType : 'json',          data : mydata,          success : function(data) {              alert("id: " + data.id + "/nname: " + data.name + "/nstatus: "                      + data.status);          },          error : function() {              alert('Err...');          }      });  Table Html代碼  收藏代碼<table>      <tr>          <td>id</td>          <td><input id="id" value="100" /></td>      </tr>      <tr>          <td>name</td>          <td><input id="name" value="snowolf" /></td>      </tr>      <tr>          <td>status</td>          <td><input id="status" value="true" /></td>      </tr>      <tr>          <td><input type="button" id="profile" value="Profile——GET" /></td>          <td><input type="button" id="login" value="Login——POST" /></td>      </tr>  </table>  四、簡單測試 Get方式測試: Post方式測試: 五、常見錯誤 POST操作時,我用$.post()方式,屢次失敗,一直報各種異常: 引用org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported直接用$.post()直接請求會有點小問題,盡管我標識為json協議,但實際上提交的ContentType還是application/x-www-form-urlencoded。需要使用$.ajaxSetup()標示下ContentType。 Js代碼  收藏代碼function login() {      var mydata = '{"name":"' + $('#name').val() + '","id":"'              + $('#id').val() + '","status":"' + $('#status').val() + '"}';      alert(mydata);      $.ajaxSetup({          contentType : 'application/json'      });      $.post('http://localhost:8080/spring-json/json/person/login', mydata,              function(data) {                  alert("id: " + data.id + "/nname: " + data.name                          + "/nstatus: " + data.status);              }, 'json');  };  效果是一樣!

參考文檔:

http://snowolf.iteye.com/blog/1628861/

http://blog.csdn.net/kobejayandy/article/details/12690161


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 本溪市| 阜新| 西青区| 泰和县| 枞阳县| 监利县| 海林市| 兴宁市| 汪清县| 竹山县| 凌云县| 湘阴县| 宜宾市| 施秉县| 集贤县| 大安市| 黎城县| 石台县| 肃北| 盈江县| 崇阳县| 高清| 章丘市| 都安| 台山市| 南华县| 英吉沙县| 福建省| 溧阳市| 江都市| 温州市| 辽中县| 霍州市| 清徐县| 遵义县| 南召县| 大新县| 孟州市| 奉节县| 新河县| 商洛市|