乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Jersey框架一:Jersey RESTful WebService框架簡介

       飲茶仙人 2017-07-17

      Jersey系列文章:

      Jersey框架一:Jersey RESTful WebService框架簡介

      Jersey框架二:Jersey對JSON的支持

      Jersey框架三:Jersey對HTTPS的支持

       

      開發(fā)RESTful WebService意味著支持在多種媒體類型以及抽象底層的客戶端-服務(wù)器通信細(xì)節(jié),如果沒有一個好的工具包可用,這將是一個困難的任務(wù)

      為了簡化使用Java開發(fā)RESTful WebService及其客戶端,一個輕量級的標(biāo)準(zhǔn)被提出:JAX-RS API

      Jersey RESTful WebService框架是一個開源的、產(chǎn)品級別的JAVA框架,支持JAX-RS API并且是一個JAX-RS(JSR 311和 JSR 339)的參考實現(xiàn)

      Jersey不僅僅是一個JAX-RS的參考實現(xiàn),Jersey提供自己的API,其API繼承自JAX-RS,提供更多的特性和功能以進一步簡化RESTful service和客戶端的開發(fā)

       

      Maven版本:3.1.0

      Jersey版本:1.18

      JDK版本:1.7.0_65

      一,服務(wù)端

      Maven配置如下:

      1. <project xmlns="http://maven./POM/4.0.0"   
      2.         xmlns:xsi="http://www./2001/XMLSchema-instance"   
      3.         xsi:schemaLocation="http://maven./POM/4.0.0   
      4.             http://maven./xsd/maven-4.0.0.xsd">  
      5.     <modelVersion>4.0.0</modelVersion>  
      6.     <groupId>JERSEY_SERVER</groupId>  
      7.     <artifactId>JERSEY_SERVER</artifactId>  
      8.     <version>1.0</version>  
      9.     <dependencies>  
      10.         <dependency>  
      11.             <groupId>com.sun.jersey</groupId>  
      12.             <artifactId>jersey-server</artifactId>  
      13.             <version>1.18</version>  
      14.         </dependency>  
      15.         <dependency>  
      16.             <groupId>com.sun.jersey</groupId>  
      17.             <artifactId>jersey-grizzly2</artifactId>  
      18.             <version>1.18</version>  
      19.         </dependency>  
      20.     </dependencies>  
      21. </project>  

      首先介紹幾個注解:

      @Path

      用來為資源類或方法定義URI,當(dāng)然除了靜態(tài)URI也支持動態(tài)URI

      1. @Path("service")   
      2. public class MyResource {  
      3.     @Path("{sub_path}")  
      4.     @GET  
      5.     public String getResource(@PathParam("sub_path") String resourceName) {  
      6. ......  

      如果此時客戶端請求的URI為http://127.0.0.1:10000/service/sean,則sub_path的值為sean

      @PathParam用來將請求URI的一部分作為方法參數(shù)傳入方法中

      對URI的動態(tài)部分,可以自定義校驗正則表達式,如果請求參數(shù)校驗失敗,容器返回404 Not Found

      1. @Path("{sub_path:[A-Z]*}")  

      @GET

      表明被注解的方法響應(yīng)HTTP GET請求,@POST、@PUT@DELETE同理

      @Consumes

      定義請求的媒體類型,如果不指定,則容器默認(rèn)可接受任意媒體類型,容器負(fù)責(zé)確認(rèn)被調(diào)用的方法可接受HTTP請求的媒體類型,否則返回415 Unsupported Media Type

      方法級注解將覆蓋類級注解

      @Produces

      定義響應(yīng)媒體類型,如果不指定,則容器默認(rèn)可接受任意媒體類型,容器負(fù)責(zé)確認(rèn)被調(diào)用的方法可返回HTTP請求可以接受媒體類型,否則返回406 Not Acceptable

      方法級注解將覆蓋類級注解

      @QueryParam

      1. public String getResource(  
      2.         @DefaultValue("Just a test!") @QueryParam("desc") String description) {  
      3.     ......  
      4. }  

      如果請求URI中包含desc參數(shù),例如:http://127.0.0.1:10000/service/sean?desc=123456,則desc參數(shù)的值將會賦給方法的參數(shù)description,否則方法參數(shù)description的值將為@DefaultValue注解定義的默認(rèn)值

      @Context

      將信息注入請求或響應(yīng)相關(guān)的類,可注入的類有:Application,UriInfo,Request,HttpHeaders和SecurityContext

      @Singleton@PerRequest

      默認(rèn)情況下,資源類的生命周期是per-request,也就是系統(tǒng)會為每個匹配資源類URI的請求創(chuàng)建一個實例,這樣的效率很低,可以對資源類使用@Singleton注解,這樣在應(yīng)用范圍內(nèi),只會創(chuàng)建資源類的一個實例

      服務(wù)端程序如下:

      1. package com.sean;  
      2.    
      3. import java.io.IOException;  
      4. import java.net.URI;  
      5. import java.util.Iterator;  
      6.   
      7. import javax.ws.rs.Consumes;  
      8. import javax.ws.rs.DefaultValue;  
      9. import javax.ws.rs.GET;  
      10. import javax.ws.rs.Path;  
      11. import javax.ws.rs.PathParam;  
      12. import javax.ws.rs.Produces;  
      13. import javax.ws.rs.QueryParam;  
      14. import javax.ws.rs.core.Context;  
      15. import javax.ws.rs.core.HttpHeaders;  
      16. import javax.ws.rs.core.MediaType;  
      17. import javax.ws.rs.core.MultivaluedMap;  
      18. import javax.ws.rs.core.Request;  
      19. import javax.ws.rs.core.UriBuilder;  
      20. import javax.ws.rs.core.UriInfo;  
      21.   
      22. import org.glassfish.grizzly.http.server.HttpServer;  
      23.   
      24. import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;  
      25. import com.sun.jersey.api.core.PackagesResourceConfig;  
      26. import com.sun.jersey.api.core.ResourceConfig;  
      27. import com.sun.jersey.spi.resource.Singleton;  
      28.    
      29. @Singleton  
      30. @Path("service")   
      31. public class MyResource {  
      32.       
      33.     @Path("{sub_path:[a-zA-Z0-9]*}")  
      34.     @GET  
      35.     @Consumes({MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON})  
      36.     @Produces(MediaType.TEXT_PLAIN)  
      37.     public String getResourceName(  
      38.             @PathParam("sub_path") String resourceName,  
      39.             @DefaultValue("Just a test!") @QueryParam("desc") String description,  
      40.             @Context Request request,  
      41.             @Context UriInfo uriInfo,  
      42.             @Context HttpHeaders httpHeader) {  
      43.         System.out.println(this.hashCode());  
      44.   
      45. //      將HTTP請求打印出來  
      46.         System.out.println("****** HTTP request ******");  
      47.         StringBuilder strBuilder = new StringBuilder();  
      48.         strBuilder.append(request.getMethod() + " ");  
      49.         strBuilder.append(uriInfo.getRequestUri().toString() + " ");  
      50.         strBuilder.append("HTTP/1.1[\\r\\n]");  
      51.         System.out.println(strBuilder.toString());  
      52.         MultivaluedMap<String, String> headers = httpHeader.getRequestHeaders();  
      53.         Iterator<String> iterator = headers.keySet().iterator();  
      54.         while(iterator.hasNext()){  
      55.             String headName = iterator.next();  
      56.             System.out.println(headName + ":" + headers.get(headName) + "[\\r\\n]");  
      57.         }  
      58.         System.out.println("[\\r\\n]");  
      59.         String responseStr =resourceName + "[" + description + "]";  
      60.         return responseStr;  
      61.     }  
      62.       
      63.     public static void main(String[] args) {  
      64.         URI uri = UriBuilder.fromUri("http://127.0.0.1").port(10000).build();  
      65.         ResourceConfig rc = new PackagesResourceConfig("com.sean");  
      66.         try {  
      67.             HttpServer server = GrizzlyServerFactory.createHttpServer(uri, rc);  
      68.             server.start();  
      69.         } catch (IllegalArgumentException e) {  
      70.             e.printStackTrace();  
      71.         } catch (NullPointerException e) {  
      72.             e.printStackTrace();  
      73.         } catch (IOException e) {  
      74.             e.printStackTrace();  
      75.         }  
      76.         try {  
      77.             Thread.sleep(1000*1000);  
      78.         } catch (InterruptedException e) {  
      79.             e.printStackTrace();  
      80.         }  
      81.     }  
      82. }  

       

      二,客戶端

      Maven配置如下:

      1. <project xmlns="http://maven./POM/4.0.0"   
      2.         xmlns:xsi="http://www./2001/XMLSchema-instance"   
      3.         xsi:schemaLocation="http://maven./POM/4.0.0   
      4.                 http://maven./xsd/maven-4.0.0.xsd">  
      5.     <modelVersion>4.0.0</modelVersion>  
      6.     <groupId>JERSEY_CLIENT</groupId>  
      7.     <artifactId>JERSEY_CLIENT</artifactId>  
      8.     <version>1.0</version>  
      9.     <dependencies>          
      10.         <dependency>  
      11.             <groupId>com.sun.jersey</groupId>  
      12.             <artifactId>jersey-client</artifactId>  
      13.             <version>1.18</version>  
      14.         </dependency>  
      15.         <dependency>  
      16.             <groupId>com.sun.jersey</groupId>  
      17.             <artifactId>jersey-grizzly2</artifactId>  
      18.             <version>1.18</version>  
      19.         </dependency>  
      20.     </dependencies>  
      21. </project>  

      客戶端程序如下:

      1. package com.sean;  
      2.   
      3. import java.net.URI;  
      4. import java.util.Iterator;  
      5.   
      6. import javax.ws.rs.core.MediaType;  
      7. import javax.ws.rs.core.MultivaluedMap;  
      8. import javax.ws.rs.core.UriBuilder;  
      9.   
      10. import com.sun.jersey.api.client.Client;  
      11. import com.sun.jersey.api.client.ClientResponse;  
      12. import com.sun.jersey.api.client.WebResource;  
      13. import com.sun.jersey.api.client.config.ClientConfig;  
      14. import com.sun.jersey.api.client.config.DefaultClientConfig;  
      15.   
      16. public class JerseyClient {  
      17.   
      18.     public static void main(String[] args) {  
      19. //      要使用Jersey Client API,必須首先創(chuàng)建Client的實例  
      20. //      有以下兩種創(chuàng)建Client實例的方式  
      21.           
      22. //     方式一  
      23.         ClientConfig cc = new DefaultClientConfig();  
      24.         cc.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 10*1000);  
      25. //      Client實例很消耗系統(tǒng)資源,需要重用  
      26. //      創(chuàng)建web資源,創(chuàng)建請求,接受響應(yīng)都是線程安全的  
      27. //      所以Client實例和WebResource實例可以在多個線程間安全的共享  
      28.         Client client = Client.create(cc);  
      29.           
      30. //      方式二  
      31. //      Client client = Client.create();  
      32. //      client.setConnectTimeout(10*1000);  
      33. //      client.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 10*1000);  
      34.           
      35. //      WebResource將會繼承Client中timeout的配置  
      36.         WebResource resource = client.resource("http://127.0.0.1:10000/service/sean?desc=description");  
      37.           
      38.         String str = resource  
      39.                 .accept(MediaType.TEXT_PLAIN)  
      40.                 .type(MediaType.TEXT_PLAIN)  
      41.                 .get(String.class);  
      42.         System.out.println("String:" + str);  
      43.           
      44.         URI uri = UriBuilder.fromUri("http://127.0.0.1/service/sean").port(10000)  
      45.                 .queryParam("desc", "description").build();  
      46.         resource = client.resource(uri);  
      47.           
      48.         //header方法可用來添加HTTP頭  
      49.         ClientResponse response = resource.header("auth", "123456")  
      50.                 .accept(MediaType.TEXT_PLAIN)  
      51.                 .type(MediaType.TEXT_PLAIN)  
      52.                 .get(ClientResponse.class);  
      53. //      將HTTP響應(yīng)打印出來  
      54.         System.out.println("****** HTTP response ******");  
      55.         StringBuilder strBuilder = new StringBuilder();  
      56.         strBuilder.append("HTTP/1.1 ");  
      57.         strBuilder.append(response.getStatus() + " ");  
      58.         strBuilder.append(response.getStatusInfo() + "[\\r\\n]");  
      59.         System.out.println(strBuilder.toString());  
      60.         MultivaluedMap<String, String> headers = response.getHeaders();  
      61.         Iterator<String> iterator = headers.keySet().iterator();  
      62.         while(iterator.hasNext()){  
      63.             String headName = iterator.next();  
      64.             System.out.println(headName + ":" + headers.get(headName) + "[\\r\\n]");  
      65.         }  
      66.         System.out.println("[\\r\\n]");  
      67.         System.out.println(response.getEntity(String.class) + "[\\r\\n]");  
      68.     }  
      69. }  

       

      服務(wù)端日志如下:

      [plain] view plain copy
      1. 二月 06, 2015 4:33:33 下午 com.sun.jersey.api.core.PackagesResourceConfig init  
      2. INFO: Scanning for root resource and provider classes in the packages:  
      3.   com.sean  
      4. 二月 06, 2015 4:33:33 下午 com.sun.jersey.api.core.ScanningResourceConfig logClasses  
      5. INFO: Root resource classes found:  
      6.   class com.sean.Test  
      7.   class com.sean.MyResource  
      8. 二月 06, 2015 4:33:33 下午 com.sun.jersey.api.core.ScanningResourceConfig init  
      9. INFO: No provider classes found.  
      10. 二月 06, 2015 4:33:33 下午 com.sun.jersey.server.impl.application.WebApplicationImpl _initiate  
      11. INFO: Initiating Jersey application, version 'Jersey: 1.18 11/22/2013 01:21 AM'  
      12. 二月 06, 2015 4:33:34 下午 org.glassfish.grizzly.http.server.NetworkListener start  
      13. INFO: Started listener bound to [127.0.0.1:10000]  
      14. 二月 06, 2015 4:33:34 下午 org.glassfish.grizzly.http.server.HttpServer start  
      15. INFO: [HttpServer] Started.  
      16. 1814260800  
      17. ****** HTTP request ******  
      18. GET http://127.0.0.1:10000/service/sean?desc=description HTTP/1.1[\r\n]  
      19. accept:[text/plain][\r\n]  
      20. content-type:[text/plain][\r\n]  
      21. user-agent:[Java/1.7.0_65][\r\n]  
      22. host:[127.0.0.1:10000][\r\n]  
      23. connection:[keep-alive][\r\n]  
      24. [\r\n]  
      25. 1814260800  
      26. ****** HTTP request ******  
      27. GET http://127.0.0.1:10000/service/sean?desc=description HTTP/1.1[\r\n]  
      28. auth:[123456][\r\n]  
      29. accept:[text/plain][\r\n]  
      30. content-type:[text/plain][\r\n]  
      31. user-agent:[Java/1.7.0_65][\r\n]  
      32. host:[127.0.0.1:10000][\r\n]  
      33. connection:[keep-alive][\r\n]  
      34. [\r\n]  

      客戶端日志如下:

      [plain] view plain copy
      1. String:sean[description]  
      2. ****** HTTP response ******  
      3. HTTP/1.1 200 OK[\r\n]  
      4. Transfer-Encoding:[chunked][\r\n]  
      5. Date:[Fri, 06 Feb 2015 08:33:38 GMT][\r\n]  
      6. Content-Type:[text/plain][\r\n]  
      7. [\r\n]  
      8. sean[description][\r\n]  

       

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多