0. 大背景java
衆所周知,REST架構已經成爲現代服務端的趨勢。mysql
不少公司,已經採用REST做爲App, H5以及其它客戶端的服務端架構。web
1. 什麼是JAX-RS?spring
JAX-RS是JAVA EE6 引入的一個新技術。 JAX-RS即Java API for RESTful Web Services,是一個Java 編程語言的應用程序接口,支持按照表述性狀態轉移(REST)架構風格建立Web服務。sql
JAX-RS使用了Java SE5引入的Java標註來簡化Web服務的客戶端和服務端的開發和部署。
Roy Fielding也參與了JAX-RS的制訂,他在本身的博士論文中定義了REST。數據庫
對於那些想要構建RESTful Web Services的開發者來講,JAX-RS給出了不一樣於JAX-WS(JSR-224)的另外一種解決方案。apache
JAX-RS提供了一些標註將一個資源類,一個POJO Java類,封裝爲Web資源。編程
基於JAX-RS實現的框架有Jersey,RESTEasy等。這兩個框架建立的應用能夠很方便地部署到Servlet 容器中,好比Tomcat,JBoss等。json
值得一提的是RESTEasy是由JBoss公司開發的,因此將用RESTEasy框架實現的應用部署到JBoss服務器上,能夠實現不少額外的功能。api
目前共有4種JAX-RS實現,全部這些實現都支持Spring,Jersey則是JAX-RS的參考實現,也是本文所用的實現。
JAX-RS經常使用標註:
@Path,標註資源類或者方法的相對路徑
@GET,@PUT,@POST,@DELETE,標註方法是HTTP請求的類型。
@Produces,標註返回的MIME媒體類型
@Consumes,標註可接受請求的MIME媒體類型
@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam,
分別標註方法的參數來自於HTTP請求的不一樣位置,
例如
@PathParam來自於URL的路徑,
@QueryParam來自於URL的查詢參數,
@HeaderParam來自於HTTP請求的頭信息,
@CookieParam來自於HTTP請求的Cookie。
2. 爲何使用Spring + MyBatis?
Spring我想就沒必要介紹了,作Java的都知道。
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,而且更名爲MyBatis 。
2013年11月遷移到Github。
MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。
MyBatis 消除了幾乎全部的JDBC代碼和參數的手工設置以及結果集的檢索。
MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
目前Java EE開發的現狀是:Hibernate的數據訪問層地位已經在逐步降低,而更加輕量級的MyBati正在逐漸在中小型項目中嶄露頭角。
3. 開發前的準備工做
首先,你要下載2個必須的jar, 一個是jersey, 另外一個則是jersey-spring,因爲jersey默認沒有整合Spring,所以後一個jar特別重要。
若是,你還不知道從哪裏下載,那麼本博主提供了下載地址:
http://www.coolbaba.net/Upload/Jar/Jersey-Jax.zip
而後,新建一個空的Java Web項目,將下載的2個jar拷貝到你的項目並添加對它們的引用。
4. 配置文件編輯
須要準備2個配置文件,一個是spring-mybatis.xml,
它是Spring和MyBatis的整合配置文件。
<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!-- 自動掃描 --> <context:component-scan base-package="bbc" /> <!-- 引入配置文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties" /> </bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- 初始化鏈接大小 --> <property name="initialSize" value="${initialSize}"></property> <!-- 鏈接池最大數量 --> <property name="maxActive" value="${maxActive}"></property> <!-- 鏈接池最大空閒 --> <property name="maxIdle" value="${maxIdle}"></property> <!-- 鏈接池最小空閒 --> <property name="minIdle" value="${minIdle}"></property> <!-- 獲取鏈接最大等待時間 --> <property name="maxWait" value="${maxWait}"></property> </bean> <!-- spring和MyBatis完美整合,不須要mybatis的配置映射文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自動掃描mapping.xml文件 --> <property name="mapperLocations" value="classpath:bbc/mapping/*.xml"></property> <property name="typeAliasesPackage" value="bbc.domain"/> </bean> <!-- DAO接口所在包名,Spring會自動查找其下的類 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="bbc.dao" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> <!-- (事務管理)transaction manager, use JtaTransactionManager for global tx --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- <bean id="SpringContextUtil " class="bbc.util.web.SpringContextUtil " scope="singleton" /> --> </beans>
jdbc.properties配置以下:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=UTF-8 jdbc.username=your_username jdbc.password=your_password initialSize=0 #定義最大鏈接數 maxActive=20 #定義最大空閒 maxIdle=20 #定義最小空閒 minIdle=1 #定義最長等待時間 maxWait=60000
最後是web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <!-- 處理中文亂碼 --> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mybatis.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>ComicJaxServlet</servlet-name> <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>bbc.resource</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ComicJaxServlet</servlet-name> <url-pattern>/resources/*</url-pattern> </servlet-mapping> </web-app>
上面有兩處須要特別注意:
一是 servlet的配置處,class須要改爲
com.sun.jersey.spi.spring.container.servlet.SpringServlet
而不是原來的
com.sun.jersey.spi.container.servlet.ServletContainer (錯誤!!)
二是init-param中bbc.resource是個人REST服務所在的包名,這裏你能夠改爲你本身的。
5. 編寫domain pojo
Series.java
package bbc.domain; /** * Created by KG on 16/11/24. */ public class Series extends BaseDomain { private int id; private int sourceId; private String name; private String brief; private String address; private String folder; private String cover; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getSourceId() { return sourceId; } public void setSourceId(int sourceId) { this.sourceId = sourceId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getBrief() { return brief; } public void setBrief(String brief) { this.brief = brief; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getFolder() { return folder; } public void setFolder(String folder) { this.folder = folder; } public String getCover() { return cover; } public void setCover(String cover) { this.cover = cover; } }
6. 編寫dao和映射文件
SeriesDao.java
package bbc.dao; import bbc.domain.Series; import java.util.List; /** * Created by KG on 16/11/24. */ public interface SeriesDao { List<Series> selectAllRecords(); }
SeriesDao.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="bbc.dao.SeriesDao" > <resultMap type="Series" id="SeriesResult"> <id property="id" column="id" /> <result property="sourceId" column="source_id" /> <result property="name" column="name" /> <result property="brief" column="brief" /> <result property="address" column="address" /> <result property="folder" column="folder" /> <result property="cover" column="cover" /> <result property="createTime" column="create_time" /> <result property="lastUpda" column="last_upda" /> </resultMap> <select id="selectAllRecords" resultType="Series" resultMap="SeriesResult"> select * from series </select> </mapper>
7. 編寫REST服務,並將dao經過Spring注入服務
SeriesResource.java
package bbc.resource; import bbc.dao.SeriesDao; import bbc.domain.Series; import bbc.service.SeriesService; import com.sun.jersey.api.core.InjectParam; import com.sun.jersey.spi.inject.Inject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import java.util.List; /** * Created by KG on 16/11/24. */ @Path("/series/") @Component @Scope("prototype") public class SeriesResource { @Autowired private SeriesDao seriesDao; @GET @Produces("application/json") public String getAllSeries() { List<Series> seriesList = seriesDao.selectAllRecords(); .... } }
上面經過Autowired自動綁定dao接口的實現。
通常咱們服務端中用的最多的是POST請求,若是是post的話也很簡單,以下:
@Path("/some/") @Component public class SomeResource { @POST @Path("/testpost") @Produces("application/json") public String testPost(String request) { return "Response: " + request; } }
上面中參數request會自動收到客戶端傳過來的json字符串,而後你能夠選擇解析該json而且反序列化爲pojo對象,進行後一步的操做,
最後把結果序列化成json丟回給客戶端。
好了,一切大功告成!!
啓動tomcat,你能夠經過以下地址訪問你的服務:
http://localhost:8080/resources/series