我是FE,也是Fe

          前端來源于不斷的點滴積累。我一直在努力。

          統計

          留言簿(15)

          閱讀排行榜

          評論排行榜

          RESTful Web Service(二):使用eclipse創建restful webservice 工程

          使用環境:jdk1.5+eclispe3.4+myeclispe7

          File=>New=>Web Service Project。

          project name: restblog,選擇REST(JAX-RS) 下一步。

          勾選core,jaxb,client,json然后下一步。

          之所以創建servlet是因為會請求一些物理不存在的URI,事實上就是這個servlet在處理這些resource。

          jaxb(Java Architecture for XML Binding)可以將java class序列號成xml,請參考http://java.sun.com/developer/technicalArticles/WebServices/jaxb/

          json就不多說了,這個包可以實現java class 轉化成json。

          點擊finish完成工程創建。

          這樣創建的工程與通常的web工程的區別就是添加了servlet在web.xml,這里貼出servlet代碼:后續的文章中也會提到他。

          <servlet>
          <display-name>JAX-RS REST Servlet</display-name>
          <servlet-name>JAX-RS REST Servlet</servlet-name>
          <servlet-class>
          com.sun.jersey.spi.container.servlet.ServletContainer
          </servlet-class>
          <load-on-startup>1</load-on-startup>
          </servlet>
          <servlet-mapping>
          <servlet-name>JAX-RS REST Servlet</servlet-name>
          <url-pattern>/services/*</url-pattern>
          </servlet-mapping>

          在工程的classpath下會引用下列包:

          11

          這些包可以從http://download.java.net/maven/2/com/sun/jersey/ 下載(使用maven2)

          首先創建一個簡單的類Category

          12

          使用@XmlRootElement標注該類

          點擊13 圖標創建webservice,選擇restblog工程,Framework選擇REST(JAX-RS)

          14

          Java class : CategoryService

          URL path: 資源路徑 填寫category ,這樣所有與category相關的資源都使用http://yourpath/services/category訪問

          LIfecycle: Pre-request(JAX-RS default)每次請求時生成一個服務類實例(這里指CategoryService),singleton:單例,只存在一個實例

          Consumes: 接受的contentType 包括application/xml ,application/json 通俗來說就是接受提交數據的格式。

          Produces: 產生的數據格式選項同樣為applicatin/xml,application/json 等。
          注意這里的Consumes/Produces是指請求http://yourpath/services/category的數據格式。

          點擊 Add 按鈕添加服務方法,界面如下:

          16

          這是一個構造服務方法的界面,下面有代碼預覽。在添加參數的時候,選擇Param Type選項的意義:

          Context: 這是一個標識該參數為請求上下文。可以直接獲得request的參數。

          QueryParam:uri?之后的參數

          PathParam:uri中的參數如:/category/{id}中的id就是PathParam

          FormParam:使用post提交的參數。

          CookieParam: Cookie參數。

          HeaderParam: 請求的頭部信息。

          也許你已經注意到沒有session參數,是的,所謂的"無狀態stateless"多少就體現在這里,web服務不保存請求相關的信息。

          綜合上面的用法,下面的例子涵蓋了常用的服務方法的寫法,之中的處理過程暫時用硬編碼。后面的文章會介紹HIbernate,Spring的應用。

          package com.dawnpro.restblog;

          import java.util.ArrayList;
          import java.util.List;

          import javax.ws.rs.Consumes;
          import javax.ws.rs.DELETE;
          import javax.ws.rs.DefaultValue;
          import javax.ws.rs.FormParam;
          import javax.ws.rs.GET;
          import javax.ws.rs.POST;
          import javax.ws.rs.PUT;
          import javax.ws.rs.Path;
          import javax.ws.rs.PathParam;
          import javax.ws.rs.Produces;
          import javax.ws.rs.core.Context;
          import javax.ws.rs.core.UriInfo;

          import org.codehaus.jettison.json.JSONException;
          import org.codehaus.jettison.json.JSONObject;

          @Path(
          "category")
          public class CategoryService {
              
              @GET
              @Produces( {
          "application/json","application/xml"})
              
          /**
               * getCategories 產生json,xml兩種數據格式,具體那種格式取決于contentType
               
          */
              
          public List<Category> getCategories() {
                  List
          <Category> result =new ArrayList<Category>();
                  result.add(
          new Category(1,"第一個分類"));
                  result.add(
          new Category(2,"第二個分類"));
                  
          return result;
              }

              @GET
              @Path(
          "{id}")
              
          public Category getCategory(@PathParam("id"int id) {
                  
          return new Category(id,"id為"+id+"的類別");
              }

              
              @GET
              @Path(
          "json/{id}")
              @Produces( 
          "application/json")
              
          public JSONObject getCategoryJson(@PathParam("id"int id){//產生json
                  JSONObject o =new JSONObject();
                  
          try {
                      o.put(
          "id", id);
                      o.put(
          "name""id為"+id+"的category");
                  } 
          catch (JSONException e) {
                      e.printStackTrace();
                  }
                  
          return o;
              }
              
              @PUT
              @Path(
          "add")
              @Produces(
          "text/html")
              @Consumes( { 
          "application/xml""application/json" })
              
          public String addCategory(Category category) {
                  System.out.println(
          "處理添加類別邏輯,接受的數據為id:"+category.getId()+",name:"+category.getName());
                  
          return "ok";
              }
              
              @POST
              @Path(
          "addbyname")
              
          public String addCategory(@FormParam("categoryname") @DefaultValue("[未命名]") String cateogryname) {
                  System.out.println(
          "處理添加類別邏輯,接受的數據為name:"+cateogryname);
                  
          return "添加類別"+cateogryname+"成功";
              }

              @POST
              @Produces(
          "text/html")
              @Path(
          "updatecategory")
              @Consumes( { 
          "application/xml""application/json" })
              
          public String updateCategory(Category category) {
                  System.out.println(
          "處理更新類別邏輯,接受的數據為id:"+category.getId()+",name:"+category.getName());
                  
          return "ok";
              }

              @DELETE
              @Path(
          "delete/{id}")
              
          public String deleteCategory(@PathParam("id"int id) {
                  System.out.println(
          "處理刪除類別邏輯,接受的數據為id:"+id);
                  
          return "ok";
              }
              
              @GET
              @Path(
          "commonProcess")
              
          public String commonProcess(@Context UriInfo info){//@Context 參數標識UriInfo
                   StringBuilder buf = new StringBuilder();  
                   
          for (String param: info.getQueryParameters().keySet()) {  
                       buf.append(param
          +" : "+info.getQueryParameters().get(param));  
                       buf.append(
          "\n");  
                   }  
                   System.out.println(buf.toString());
                   
                  
          return "ok";
              }
              
          }


          你可以在CategoryService.java編輯中 右鍵菜單=>MyEclipse=>Add REST Method添加服務方法。

          右鍵工程根目錄restblog選擇MyEclipse=>Test with RESTful WebServices Explorer 將會打開測試窗口。
          17 
          瀏覽中的地址為:http://localhost:8080/restblog/services/application.wadl 首先/services是由servlet攔截。
          如果在瀏覽器中瀏覽該地址,將得到一個xml文件。這個文件叫web service application description language。顧名思義他是一個服務描述文件。
          需要說明的是當調用方法的參數為Category類型,調用時傳遞的是xml同時contentType設置為application/xml這樣jersey會將xml轉化為Category類型的對象。如果轉化出錯則服務調用失敗,會返回錯誤信息。

          總結

          本節主要介紹在Myeclipse中創建RESTful web service project 以及測試。到目前為止,只寫了兩個類就輕松的實現了RESTful Web service。
          參考資料:
          介紹rest:http://java.sun.com/developer/technicalArticles/WebServices/restful/
          介紹使用myeclipse rest 支持http://www.myeclipseide.com/documentation/quickstarts/webservices_rest/
          RESTful Web Services Developer's Guidehttp://docs.sun.com/app/docs/doc/820-4867?l=zh
          netbeans的restful webservice 支持:http://www.netbeans.org/kb/60/websvc/rest_zh_CN.html

          posted on 2009-02-05 22:19 衡鋒 閱讀(23588) 評論(7)  編輯  收藏 所屬分類: restful webservice

          評論

          # re: RESTful Web Service(二):使用eclipse創建restful webservice 工程 2009-06-04 22:27 solomonchan

          對你那篇《使用eclipse創建restful webservice 工程》有幾個問題不是很明白,想向請教你,在這里不好說,能告訴我你的QQ或MSN號嗎?
          我的郵箱是 solomonchan@foxmail.com  回復  更多評論   

          # re: RESTful Web Service(二):使用eclipse創建restful webservice 工程[未登錄] 2009-11-22 23:39 Joe

          JDK1.6會報錯:java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloader, but this RI (from jar:file:/D:/Tomcat%206.0/webapps/restblog/WEB-INF/lib/jaxb-impl-2.1.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class) needs 2.1 API. Use the endorsed directory mechanism to place jaxb-api.jar in the bootstrap classloader. (See http://java.sun.com/j2se/1.5.0/docs/guide/standards/)


          nnd,真頭疼.  回復  更多評論   

          # re: RESTful Web Service(二):使用eclipse創建restful webservice 工程[未登錄] 2010-12-03 09:23 apple

          JDK1.6會報錯:java.lang.LinkageError: JAXB 2.0 API is being loaded from the bootstrap classloader, but this RI (from jar:file:/D:/Tomcat%206.0/webapps/restblog/WEB-INF/lib/jaxb-impl-2.1.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class) needs 2.1 API. Use the endorsed directory mechanism to place jaxb-api.jar in the bootstrap classloader. (See http://java.sun.com/j2se/1.5.0/docs/guide/standards/)


          這個問題解決了嘛?能分享一下嗎?小弟也遇到這個問題,謝謝!  回復  更多評論   

          # re: RESTful Web Service(二):使用eclipse創建restful webservice 工程 2013-06-04 16:11 tb

          剛好用上 ·  回復  更多評論   

          # re: RESTful Web Service(二):使用eclipse創建restful webservice 工程[未登錄] 2013-08-28 17:45 螞蟻

          為什么我按照你的方式,部署起服務出現: StandardWrapper.Throwable
          com.sun.jersey.spi.inject.Errors$ErrorMessagesException  回復  更多評論   

          # re: RESTful Web Service(二):使用eclipse創建restful webservice 工程[未登錄] 2013-08-28 17:46 螞蟻

          希望樓主解答一下,真的很疑惑,剛剛開始學習這個,謝謝嘍  回復  更多評論   

          # re: RESTful Web Service(二):使用eclipse創建restful webservice 工程 2015-11-22 13:36 pitera

          樓主請問下 我點擊“Test with REST Web Services Explorer”的時候提示
          The REST explorer is only available on Windows 32,Linux and mac OS x(Carbon)
          這是什么原因  回復  更多評論   

          主站蜘蛛池模板: 区。| 徐闻县| 满城县| 宾阳县| 徐州市| 林西县| 内丘县| 依兰县| 黔江区| 博客| 商水县| 临沧市| 西盟| 阜新| 东至县| 南汇区| 丹江口市| 浦县| 崇义县| 永嘉县| 营口市| 体育| 西宁市| 宜宾市| 确山县| 清徐县| 壤塘县| 樟树市| 沽源县| 会宁县| 泸州市| 万全县| 修文县| 日照市| 延吉市| 六枝特区| 伊通| 高淳县| 武冈市| 泸西县| 社会|