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;
}
}
@PathParam
可以從連結中取出相應的值自動賦值給相應變數.同時還支援正則表示式:例如:
@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更加好用.
專案示例: