1. 程式人生 > >java Restful框架(二):jersey請求對映和頁面傳值

java Restful框架(二):jersey請求對映和頁面傳值

jersey的webservice開發基本上都是使用註解,接下來學習常用註解.

一.根資源類

[email protected]註解

@Path("/hello")
public class HelloWorldController {

    @GET
    @Path("{username}")
    @Produces(MediaType.TEXT_PLAIN)
    public String helloWorld(@PathParam("username") String username){

        return "hello world! "+username;
    }
}
  1. @PathParam可以從連結中取出相應的值自動賦值給相應變數.

  2. 同時還支援正則表示式:例如:

@Path(“users/{username: [a-zA-Z][a-zA-Z_0-9]*}”)

  • 這個正則表示式匹配由大小寫字元、橫槓和數字組成的字串,如果正則校驗不通過,則返回404(沒有找到資源)。

  • 一個 @Path的內容是否以”/”開頭都沒有區別,同樣是否以”/”結尾也沒有什麼區別

  • [email protected], @PUT, @POST, @DELETE, … (HTTP 方法)

    一般下面方法有如下用途: • GET - 提供資源的只讀訪問。 • PUT - 用於建立一個新資源。 • DELETE - 用於移除一個資源。 • POST - 用於更新現有資源或者建立一個新資源。 • OPTIONS - 用於獲取資源上支援的操作。

    下面是設計 URI 時要考慮的要點: • 使用複數名詞 - 使用複數名詞定義資源。比如,我們使用 users 標識使用者資源。 • 避免使用空格 - 處理長資源名時使用下劃線(_)或者連字元(-),比如,用 authorized_users 而不是 a uthorized%20users。 • 使用小寫字母 - 儘管 URI 不區分帶小寫,但是在 url 中使用小寫字母是一種很好的做法。 • 保持向後相容 - 由於 Web 服務是一種公共服務,URI 一旦公開之後應該始終可用。這種情況下,要更新 U RI,請使用 HTTP 狀態碼 - 300 重定向老的 URI 到新的 URI。 • 使用 HTTP Verb - 始終使用 HTTP Verb,比如 GET,PUT 以及 DELETE 處理資源操作。在 URL 中使 用操作名並不好。

    例如: 這裡寫圖片描述

    [email protected]

    @Produces是定義返回值給客戶端的 MIME 媒體型別。在下面這個例子裡面,將會返回一個text/plainMIME 媒體型別的相應。@Produces既可以應用在類的水平上,也可以作用與方法的水平。也就是說定義在類上的這個註解會被其裡面方法上的該註解覆蓋掉.

    另外@Produces({"application/xml", "application/json"})可以像這樣支援多個返回型別,這樣匹配是匹配到先檢測到的那個,同時還可以利用qs指定匹配品質,自動選擇品質高的那個

    4. @Consumes

    @Consumes註釋與@Produces相反,是用來指定表示可由資源消耗的 MIME 媒體型別。,一般用於post和put接收客戶端引數,取出使用@FormParam 例如 @Consumes("text/plain"),該註解明確表示將消耗表示確定的 MIME 媒體型別text/plain

    [email protected]

    [email protected]

    從URL中匹配給定的引數,上面例子已經用到了

    [email protected]

    對於get請求引數使用

    public Response smooth(
        @DefaultValue("2") @QueryParam("step") int step,
        @DefaultValue("true") @QueryParam("min-m") boolean hasMin,
        @DefaultValue("true") @QueryParam("max-m") boolean hasMax,
        @DefaultValue("true") @QueryParam("last-m") boolean hasLast,
        @DefaultValue("blue") @QueryParam("min-color") ColorParam minColor,
        @DefaultValue("green") @QueryParam("max-color") ColorParam maxColor,
        @DefaultValue("red") @QueryParam("last-color") ColorParam lastColor) {
        ...
    }

    如果step的引數存在的話,那麼附值給它,否則預設是 @DefaultValue定義的值 2。如果step的內容不是 32位 整型,那麼會返回404錯誤。

    3.類似註解

    @PathParam 和其他引數註解 @MatrixParam, @HeaderParam,@CookieParam, @FormParam 遵循與 @QueryParam一樣的規則。 @MatrixParam 從 URL 路徑提取資訊. @HeaderParam 從 HTTP 頭部提取資訊。 @CookieParam從關聯在 HTTP 頭部的 cookies 裡提取資訊。

    [email protected]

    對於POST請求引數取出使用 表單請求是非常有用的,例如從釋出的表單資料中提取名稱是 name 的引數資訊:

    @POST
    @Consumes("application/x-www-form-urlencoded")
    public void post(@FormParam("name") String name) {
        // Store the message
    }

    [email protected]

    允許注入上述引數到一個 bean 。 該方法需要指明Bean裡面的引數需要提前指定,也就相當於把引數都封裝了一下,例如:

    定義bean:

    import javax.ws.rs.QueryParam;
    import javax.xml.bind.annotation.XmlRootElement;
    import java.io.Serializable;
    
    @XmlRootElement(name = "user")
    public class User implements Serializable {
    
        private static final long serialVersionUID = 1L;
        @QueryParam("name")
        private String name;
        @QueryParam("password")
        private String password;
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", password='" + password + '\'' +
                    '}';
        }
    }

    構造控制器

    @Path("/hello")
    public class HelloWorldController {
    
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String helloWorld(@BeanParam User user){
    
            System.out.println(user.toString());
            return "hello world! ";
        }
    }

    引數值就會自動對映到User中

    6.直接獲取map

    @Context可以可以獲取諸如 ServletConfig 、ServletContext 、HttpServletRequest 和 HttpServletResponse這些引數

    @GET
    public String get(@Context UriInfo ui) {
        MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
        MultivaluedMap<String, String> pathParams = ui.getPathParameters();
    }

    或者還可以從頭部引數獲取

    @GET
    public String get(@Context HttpHeaders hh) {
        MultivaluedMap<String, String> headerParams = hh.getRequestHeaders();
        Map<String, Cookie> pathParams = hh.getCookies();
    }

    最後還可以直接使用該變數

    @POST
    @Consumes("application/x-www-form-urlencoded")
    public void post(MultivaluedMap<String, String> formParams) {
        // Store the message
    }

    7.返回json資料

    首先maven中加入

            <!--json轉換器-->
            <dependency>
                <groupId>com.fasterxml.jackson.jaxrs</groupId>
                <artifactId>jackson-jaxrs-json-provider</artifactId>
                <version>2.3.3</version>
            </dependency>

    然後@Produces要設定為json型別,這樣就完成了轉換,xml配置同樣類似

        @GET
        @Produces(MediaType.APPLICATION_JSON)
        public User helloWorld(@BeanParam User user){
    
            System.out.println(user.toString());
            return user;
        }

    接收資料直接formparam即可

    開發webservice感覺這些就夠用了,其他沒有去學習,畢竟用jerseyMVC的還是很少的吧,感覺springMVC更加好用.

    專案示例: