Jersey是一個RESTFUL請求服務JAVA框架,與常規的JAVA編程使用的struts框架類似,它主要用於處理業務邏輯層。與Struts類似,它同樣可以和hibernate,spring框架整合。
由於Struts2+hibernate+spring整合在市場的占有率太高,所以很少一部分人去關注Jersey。所以網上有關於Jersey的介紹很少。但是它確實是一個非常不錯的框架。對於請求式服務,對於GET,DELETE請求,你甚至只需要給出一個URI即可完成操。
jar 文件依賴:
<properties> <jersey.version>2.22.1</jersey.version> <spring.version>4.1.6.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.glassfish.jersey.ext</groupId> <artifactId>jersey-spring3</artifactId> <version>${jersey.version}</version> <!-- <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </exclusion> </exclusions> --> </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>org.glassfish.jersey.ext</groupId> <artifactId>jersey-mvc</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>${jersey.version}</version> </dependency> <!--servlet--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.7</version> </dependency> <!-- Druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.13</version> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <!-- MySQL Driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.7</version> </dependency> </dependencies>
web.xml:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <filter> <filter-name>jersey</filter-name> <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>com.xwolf.jersey</param-value> </init-param> <init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>org.glassfish.jersey.server.mvc.jsp.JspMvcFeature</param-value> </init-param> <init-param> <param-name>jersey.config.server.mvc.templateBasePath.jsp</param-name> <param-value>/</param-value> </init-param> <init-param> <param-name>jersey.config.servlet.filter.staticContentRegex</param-name> <param-value>/.*jsp</param-value> </init-param> </filter> <filter-mapping> <filter-name>jersey</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 激活annotation功能 --> <context:component-scan base-package="com.xwolf" /> <!-- 實例化占位符對象,加載數據庫配置信息 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath*:db.properties</value> </list> </property> </bean> <!-- 配置數據源,並設置連接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <!-- 設置數據庫連接參數 --> <property name="url" value="${url}" /> <property name="driverClassName" value="${driverClassName}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> <!-- 設置連接池參數 --> <property name="initialSize" value="${initSize}" /> <property name="maxActive" value="${maxSize}" /> <property name="filters" value="stat" /> </bean> <!-- 整合Mybatis框架 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:spring-mybatis.xml" /> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations"> <list> <value>classpath:com/xwolf/jersey/mapper/*.xml</value> </list> </property> </bean> <!-- 配置掃描dao接口 --> <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.xwolf.jersey.dao"></property> </bean> <!-- 注入dataSource --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 啟用事務 --> <tx:advice id="txAdvice" transaction-manager="transactionManager" > <tx:attributes> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="select*" propagation="SUPPORTS" read-only="true" /> <tx:method name="query*" propagation="SUPPORTS" read-only="true" /> <tx:method name="load*" propagation="SUPPORTS" read-only="true" /> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <!-- AOP代理設置 --> <aop:config proxy-target-class="true"> <aop:advisor pointcut="execution(* com.xwolf.jersey.service..*.*(..))" advice-ref="txAdvice" /> </aop:config> </beans>
User.java:
package com.xwolf.jersey.bean; import java.util.Date; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class User { private Long uid; private String name ; private String pwd; private Date birth; @XmlElement public Long getUid() { return uid; } public void setUid(Long uid) { this.uid = uid; } @XmlElement public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } @XmlElement public void setPwd(String pwd) { this.pwd = pwd; } @XmlElement public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } @Override public String toString() { return "User [uid=" + uid + ", name=" + name + ", pwd=" + pwd + ", birth=" + birth + "]"; } }
userController.java;
package com.xwolf.jersey.controller; import java.io.IOException; import java.util.Date; import javax.inject.Singleton; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import com.alibaba.fastjson.JSONObject; import com.xwolf.jersey.bean.User; import com.xwolf.jersey.service.UserService; @Controller @Singleton @Path("/user") public class UserController { @Autowired private UserService userService; /** * 返回字符串 * @return */ @GET @Path("/str") @Produces(MediaType.TEXT_PLAIN) public String str(){ return "Hello,Jersey !"; } /** * 返回xml * @return */ @GET @Path("/getXml") @Produces(MediaType.APPLICATION_XML) public User getUserXml(){ User user =new User(); user.setUid(234234l); user.setName("隔壁老王"); user.setPwd("rwerwe"); user.setBirth(new Date()); return user; } @GET @Path("/getJson") @Produces(MediaType.APPLICATION_JSON) public User getUserJson(){ User user =new User(); user.setUid(234234l); user.setName("隔壁老王"); user.setPwd("rwerwe"); user.setBirth(new Date()); return user; } /** * 用戶注冊 * @param uname * @param pwd * @return */ @POST @Path("/register") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces(MediaType.APPLICATION_JSON) public String register(@FormParam(value = "uname") String uname, @FormParam(value="pwd")String pwd){ User user = new User(); user.setName(uname); user.setPwd(pwd); user.setBirth(new Date()); JSONObject object = new JSONObject(); try { userService.add(user); object.put("success", true); object.put("msg", "注冊成功!"); } catch (Exception e) { object.put("success", false); object.put("msg", "注冊失敗了!"); e.printStackTrace(); } return object.toJSONString(); } }
form.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>注冊</title> </head> <body> <form action="${pageContext.request.contextPath}/user/register" method="POST" > <table> <tr> <td>用戶名:</td> <td><input name="uname"></td> </tr> <tr> <td>密碼:</td> <td><input name="pwd"></td> </tr> <tr> <td><input type="submit" value="注冊"></td> </tr> </table> </form> </body> </html>
附錄:
jersey常用注解解釋
Annotation | 作用 | 說明 |
@GET | 查詢請求 | 相當於數據庫的查詢數據操作 |
@POST | 插入請求 | 相當於數據庫的插入數據操作 |
@PUT | 更新請求 | 相當於數據庫的更新數據操作 |
@DELETE | 刪除請求 | 相當於數據的刪除數據操作 |
@Path | uri路徑 | 定義資源的訪問路徑,client通過這個路徑訪問資源。比如:@Path("user") |
@Produces | 指定返回MIME格式 | 資源按照那種數據格式返回,可取的值有:MediaType.APPLICATION_XXX。比如:@Produces(MediaType.APPLICATION_XML)。即將要返回給client端的數據標識類型(MIME)。@Produces 可以作為class注釋,也可以作為方法注釋,方法的@Produces 注釋將會覆蓋class的注釋。 |
@Consumes | 接受指定的MIME格式 | 只有符合這個參數設置的請求才能訪問到這個資源。比如@Consumes("application/x-www-form-urlencoded")。即用來指定可以接受client發送過來的MIME類型,同樣可以用於class或者method,也可以指定多個MIME類型,一般用於@PUT ,@POST 。 |
@PathParam | uri路徑參數 | 可以獲取URI中指定規則的參數。寫在方法的參數中,獲得請求路徑參數。比如:@PathParam("username") String userName。 |
@QueryParam | uri路徑請求參數 | 用於獲取GET請求中的查詢參數。寫在方法的參數中,獲得請求路徑附帶的參數。比如:@QueryParam("desc") String desc |
@DefaultValue | 設置@QueryParam參數的默認值 | 如果@QueryParam沒有接收到值,就使用默認值。比如:@DefaultValue("description") @QueryParam("desc") String desc |
@FormParam | form傳遞的參數 | 接受form傳遞過來的參數。比如:@FormParam("name") String userName |
@BeanParam | 通過Bena的形式傳遞參數 | 接受client傳遞的bean類型的參數,同時這個bean可以在屬性上配置@FormParam用以解決client的屬性名稱和bean的屬性名稱不一致的問題。比如:@BeanParam User user |
@Context | 獲得一些系統環境信息 | 通過@Context可以獲得以下信息:UriInfo、ServletConfig、ServletContext、HttpServletRequest、HttpServletResponse和HttpHeaders等 |
@XmlRootElement | 將bean轉換為xml | 如果要講bean以xml或json的格式返回,必須要這個注解。比如: @XmlRootElement public class User{...} |
@XmlElements |
|
|
@XmlElement |
|
|
HTTP Methods
GET 請求
|
讀取/列出/檢索單個或資源集合。使用 WebResource 類的 get() 方法來提交一個 HTTP GET請求到 Web 資源,String s = webResource.get(String.class); 這表示如果 WebResource 對象的 URL 是
http://localhost:8000/restful/services/restresource/getUser,那么一個 HTTP GET 請求將會發送到地址為
http://localhost:8000/restful/services/restresource/getUser 的資源
|
PUT 請求
|
更新現有資源或資源集合。 使用 WebResource 類的 put() 方法來提交一個 HTTP PUT 請求到 Web 資源。例如下面的代碼展示了請求發送一個文本實體 foo:bar 到指定的 Web 資源: ClientResponse response = webResource.type("text/plain").put(ClientResponse.class, "foo:bar"); 同樣,你也可以在使用 put() 方法發送請求時指定查詢參數,方法與使用 get() 方法時指定查詢參數一樣 |
POST 請求
|
新建資源.一個 POST 請求相當於一個 GET 請求和一個 PUT 請求的綜合,也就意味着,你可以使用 POST 請求來發送一個實體到指定的 Web 資源並且接收另一個實體。使用 WebResource 類的 post() 方法來發送一個 HTTP POST 請求到指定的 Web 資源。
|
DELETE 請求
|
刪除資源或資源集合。使用 WebResource 類的 delete() 方法來發送一個 HTTP DELETE 請求到指定的 Web 資源。
|
參考資料: