Jersey 簡單試用

前言

今天看了一個關於基於Rest的開源框架介紹的文章,其中對Jersey極力推薦,沒用過,打算嘗試一下,對基礎功能進行測試。
僅僅是入門試用。
瞭解了這個東西在是sun下的一個項目。

打算測試幾種情況

1:Get無參數
2:Get有參數
3:Get通過路徑傳遞參數
4:Post通過Form傳遞參數
5:Get返回一個對象

建立maven工程

pom.xml

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.7</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-core</artifactId>
            <version>1.9.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.9.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
            <version>1.9.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-server</artifactId>
            <version>9.4.0.v20161208</version>
        </dependency>
            <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-servlet</artifactId>
            <version>9.4.0.v20161208</version>
        </dependency>       
    </dependencies>

Person.java

基礎的Person類,需要關注一下註解。這個類是爲第五個目標定義的

import javax.ws.rs.FormParam;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "person")
public class Person
{
    @FormParam(value="name")
    private String name;

    @FormParam(value="id")
    private int id;

    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public int getId()
    {
        return id;
    }
    public void setId(int id)
    {
        this.id = id;
    }

    public String toString()
    {
        return "name="+name+",id="+id;
    }

}

HelloJersey.java

處理請求的類,完全是一個POJO通過註解來進行路由,由於要符合REST的規範,因此客戶端所有的請求都是無狀態的。這個還是很關鍵的,根據客戶端的請求可以直接進行必要的響應。

import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

/**
 *
 */
@Path("/hello")
public class HelloJersey
{

    @GET
    @Produces("text/plain")
    public String hello()
    {
        return "Jersey Get!";
    }   

    /**
     * 參數是以URL?param=value的形式傳遞
     * @param name
     * @return
     */
    @GET
    @Path("hello_get")
    @Produces("text/plain")
    public String hello(@QueryParam("name") String name)
    {
        return "Jersey Get! param="+name;
    }   

    /**
     * 參數是以Form表單的形式傳遞的
     * @param name
     * @return
     */
    @POST
    @Path("hello_post")
    @Consumes("application/x-www-form-urlencoded")
    public String helloPost(@FormParam("name") String name)
    {
        return "Jersey Post! "+name;
    }

    /**
     * 參數以路徑的形式進行傳遞的
     * @param id
     * @return
     */
    @GET
    @Path("show/{id}")
    @Produces("text/plain")
    public String showName(@PathParam("id") int id)
    {
        return "Hello jersey!"+id;
    }       
    @GET
    @Path("getPerson")
    @Produces(MediaType.APPLICATION_JSON)
    public Person showPerson()
    {
        Person p=new Person();
        p.setName("pName");
        p.setId(11212);
        return p;
    }
}

JerseyApp .java

這個類是Jersey的服務器端部分,這裏服務器用的是Jetty。

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;

import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.spi.container.servlet.ServletContainer;

/**
 * 
 */
public class JerseyApp {

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception 
    {
        final Server server = new Server(8090);
        ServletHolder sh = new ServletHolder(ServletContainer.class);
        sh.setInitParameter(ServletContainer.RESOURCE_CONFIG_CLASS, PackagesResourceConfig.class.getCanonicalName());
        sh.setInitParameter(PackagesResourceConfig.PROPERTY_PACKAGES, "cn.test.jersey.sample1");
        ServletContextHandler context = new ServletContextHandler(server, null);
        context.addServlet(sh, "/*");
        server.start();
        server.join();
        Runtime.getRuntime().addShutdownHook(new Thread(){
            public void run()
            {
                try
                {
                    server.stop();
                }
                catch (Exception e)
                {                   
                    e.printStackTrace();
                }
            }
        });
    }
}

JerseyClient.java

客戶端的代碼,通過這個代碼就可以訪問,剛纔我們定義的服務器端部分。

import javax.ws.rs.core.MultivaluedMap;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.core.util.MultivaluedMapImpl;

public class JerseyClient
{

    public static void main(String[] args)
    {

        //簡單的請求直接請求URL
        Client client = Client.create();
        WebResource webResource = client.resource("http://127.0.0.1:8090/hello");
        String s = webResource.get(String.class);
        System.out.println("-------Normal Get------>"+s);

        //通過路徑傳遞參數
        WebResource pathParam = client.resource("http://127.0.0.1:8090/hello/show/1212");
        String pathValue = pathParam.get(String.class);
        System.out.println("-------Path Value------>"+pathValue);

        //Get,通過?的形式傳遞參數的形式
        MultivaluedMap<String,String> queryParams = new MultivaluedMapImpl();
        queryParams.add("name", "get_param");
        WebResource getParam = client.resource("http://127.0.0.1:8090/hello/hello_get");
        String getS=getParam.queryParams(queryParams).get(String.class);
        System.out.println("-----Get Has Param---->"+getS);

        //Post,通過Form提交參數的形式
        MultivaluedMap<String,String> formData = new MultivaluedMapImpl();
        formData.add("name", "formValue");
        WebResource postParam = client.resource("http://127.0.0.1:8090/hello/hello_post");
        String response = postParam.type("application/x-www-form-urlencoded").post(String.class, formData);
        System.out.println("----------Post Form Value-----"+response);

        //Get,獲取一個對象底層是封裝成Json進行傳輸的,但是client根據類型進行了轉換,可以直接使用的對象
        WebResource person = client.resource("http://127.0.0.1:8090/hello/getPerson");
        Person p=person.get(Person.class);
        System.out.println(p);

    }

}

輸出內容

-------Normal Get------>Jersey Get!
-------Path Value------>Hello jersey!1212
-----Get Has Param---->Jersey Get! param=get_param
----------Post Form Value-----Jersey Post! formValue
name=pName,id=11212

總結

例子很簡單,只是拋磚引玉,通過這幾種情況,可以大致的瞭解了Jersey的工作機制。
沒有實現底層通信,用第三方實現的,如Jetty,grizzly2。
深層次的機制,等有時間再進行擴展吧!

發佈了29 篇原創文章 · 獲贊 37 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章