IDEA+Jersey+Tomcat搭建RESTful API

部分內(nèi)容參考自:https://github.com/waylau/Jersey-2.x-User-Guide/blob/master/Chapter%204.%20Application%20Deployment%20and%20Runtime%20Environments%20%E5%BA%94%E7%94%A8%E9%83%A8%E7%BD%B2%E5%92%8C%E8%BF%90%E8%A1%8C%E6%97%B6%E7%8E%AF%E5%A2%83/4.7.%20Servlet-based%20Deployment%20%E5%9F%BA%E4%BA%8E%20Servlet%20%E7%9A%84%E9%83%A8%E7%BD%B2.md
maven庫:http://mvnrepository.com/

環(huán)境:

IDEA Ultimate 2017.2.2 + JDK 1.8 + Jersey 2 + Maven + Tomcat 9.0.0.M22

首先創(chuàng)建項(xiàng)目:

選中Web Application(3.1)框架雳殊,勾選Create web.xml,IDE會(huì)在創(chuàng)建項(xiàng)目時(shí)創(chuàng)建web.xml配置文件驶沼。


創(chuàng)建項(xiàng)目

創(chuàng)建項(xiàng)目后右鍵選中項(xiàng)目桩撮,添加框架支持敦第,選中Maven,隨即生成pom.xml文件店量。這里會(huì)彈出Event對(duì)話框芜果,會(huì)有提示你Enable Auto-Import,這里我們Enable一下融师。


添加框架

然后開始通過maven添加依賴jar包右钾,引用Jersey,pom.xml配置如下:
    <groupId>com.overc_i3.jerseydemo</groupId>
    <artifactId>JerseyDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <!--maven默認(rèn)的java源值、目標(biāo)值版本是1.5舀射,修改成1.8-->
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <jersey.version>2.25</jersey.version>
    </properties>

    <dependencies>
        <dependency>
            <!--jersey服務(wù)端包窘茁,將 Jersey 當(dāng)做 Servlet-->
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <!--服務(wù)端核心包-->
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-server</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <!--客戶端包,封裝了一些客戶端操作的類-->
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>${jersey.version}</version>
        </dependency>
    </dependencies>

接下來是配置web.xml脆烟,項(xiàng)目里的路徑是web/WEB-INF/web.xml山林,這里我們將 Jersey 當(dāng)做 Servlet:

    <servlet>
        <!--Servlet配置-->
        <servlet-name>jerseyServlet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

        <init-param>
            <!--包名-->
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.overc_i3.jerseydemo</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jerseyServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

也可將 Jersey 當(dāng)做 Servlet Filter,如下配置:

<filter>
        <filter-name>MyApplication</filter-name>
        <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
        <init-param>
            ...
        </init-param>
    </filter>
    ...
    <filter-mapping>
        <filter-name>MyApplication</filter-name>
        <url-pattern>/myApp/*</url-pattern>
    </filter-mapping>

<init-param> 元素內(nèi)容將取決于你如何決定資源配置不同的 Jersey 資源邢羔。

最后一步配置驼抹,在輸出中把jar包全部加進(jìn)去


在輸出中加入庫文件

配置完成,開始寫上API代碼拜鹤,首先在src\main\java中根據(jù)之前配置的包建好對(duì)應(yīng)的包框冀,我這里配置的是com\overc_i3\jerseydemo,這里使用Json做交互署惯,先建model:

package com.overc_i3.model;

import java.util.List;

public class ReqJson {
    private String id;
    private List<ListBean> list;

    public List<ListBean> getList() {
        return list;
    }

    public void setList(List<ListBean> list) {
        this.list = list;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public static class ListBean {

        private String maxname;

        public String getMaxname() {
            return maxname;
        }

        public void setMaxname(String maxname) {
            this.maxname = maxname;
        }
    }
}

創(chuàng)建TestApi類:

package com.overc_i3.jerseydemo;

import com.overc_i3.model.ReqJson;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.List;

@Path("/")
public class TestApi {

    //GET注解設(shè)置接受請(qǐng)求類型為GET
    @GET
    // 與Produces對(duì)應(yīng)的是@Consumes
    @Produces(MediaType.TEXT_PLAIN)
    //用作測(cè)試服務(wù)啟動(dòng)情況
    public String getMessage() {
        return "Hello world!";
    }

    @GET
    @Consumes(MediaType.TEXT_PLAIN)//注解指定解壓方式接收數(shù)據(jù)類型
    @Path("/hello")
    public Response postJson(@QueryParam("name") String name) {
        return Response.status(200).entity("hello "+name).build();
    }


    @POST
    @Consumes(MediaType.APPLICATION_JSON)//注解指定解壓方式接收數(shù)據(jù)類型
    @Produces(MediaType.APPLICATION_JSON)//注解指定壓縮方式返回?cái)?shù)據(jù)類型
    @Path("/postJson2")
    public Response postJson2(ReqJson msg) {
        ReqJson reqJson = new ReqJson();
        reqJson.setId(msg.getId());
        List<ReqJson.ListBean> listBeanList = new ArrayList<>();
        for (int i = 0; i < msg.getList().size(); i++) {
            ReqJson.ListBean listBean = new ReqJson.ListBean();
            listBean.setMaxname(msg.getList().get(i).getMaxname());
            listBeanList.add(listBean);
        }
        reqJson.setList(listBeanList);

        return Response.status(200).entity(reqJson).build();
    }
}

現(xiàn)在配置Tomcat運(yùn)行一下:
點(diǎn)擊Run >Edit Configurations… > “+” > Tomcat Server > Local左驾,加入Tomcat,選擇Deployment tab, 點(diǎn)擊 “+”, 選擇唯一的Artifact极谊,點(diǎn)擊"OK"即可诡右。

Tomcat配置

配置好之后直接運(yùn)行,在瀏覽器訪問http://localhost:8080
默認(rèn)地址

Get hello

到這里RESTful API已經(jīng)正常運(yùn)行轻猖,接下來再用Fiddler調(diào)用API(注意設(shè)置請(qǐng)求格式Content-Type: application/json):


調(diào)用API

查看調(diào)API結(jié)果

到這里RESTful API已經(jīng)搭建完成帆吻,下面是部署的一些其它“姿勢(shì)”:

自定義 Application 子類

如果你的繼承 Application 類來提供有關(guān)根資源類的列表(getresources())和單身(getsingletons()),即你的 JAX-RS 應(yīng)用模型咙边,然后你需要注冊(cè)一個(gè) javax.ws.rs.Application [原名] 名稱的 Servlet 或 Servlet 過濾器作為 web 應(yīng)用程序的初始化參數(shù)猜煮,在 web.xml 中進(jìn)行部署描述:
配置 Jersey 容器 Servlet 或者 過濾器來自定義 Application 子類

<init-param>
   <param-name>javax.ws.rs.Application</param-name>
   <param-value>org.foo.MyApplication</param-value>
</init-param>

Jersey 將考慮所有 Application 實(shí)現(xiàn)的 getClasses() 和 getSingletons() 方法的返回。
注意:JAX-RS 規(guī)范定義的配置名稱確實(shí)是 javax.ws.rs.Application 而不是 javax.ws.rs.core.Application

Jersey 掃描包

如果配置屬性無需設(shè)置败许,要部署應(yīng)用程序只包括存儲(chǔ)在特定的包的資源和提供者王带,那么你可以指示 Jersey 自動(dòng)掃描這些包,這樣就能自動(dòng)注冊(cè)找到的任何資源和提供者:
配置 Jersey 的 Servlet 或者 Filter 來掃描包

<init-param>
   <param-name>jersey.config.server.provider.packages</param-name>
   <param-value>
       org.foo.myresources,org.bar.otherresources
   </param-value>
</init-param>
<init-param>
   <param-name>jersey.config.server.provider.scanning.recursive</param-name>
   <param-value>false</param-value>
</init-param>

Jersey 將會(huì)自動(dòng)發(fā)現(xiàn)被選中的資源和提供者市殷。你可以通過設(shè)置 >jersey.config.server.provider.scanning.recursive 屬性來決定 Jersey 是否掃描子包愕撰。默認(rèn)值是 true , 即啟用遞歸掃描子包。
源碼:https://github.com/overclockingi3/JerseyDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末醋寝,一起剝皮案震驚了整個(gè)濱河市搞挣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌音羞,老刑警劉巖囱桨,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嗅绰,居然都是意外死亡舍肠,警方通過查閱死者的電腦和手機(jī)搀继,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來貌夕,“玉大人律歼,你說我怎么就攤上這事》茸ǎ” “怎么了险毁?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)们童。 經(jīng)常有香客問我畔况,道長(zhǎng),這世上最難降的妖魔是什么慧库? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任跷跪,我火速辦了婚禮,結(jié)果婚禮上齐板,老公的妹妹穿的比我還像新娘吵瞻。我一直安慰自己,他們只是感情好甘磨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布橡羞。 她就那樣靜靜地躺著,像睡著了一般济舆。 火紅的嫁衣襯著肌膚如雪卿泽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天滋觉,我揣著相機(jī)與錄音签夭,去河邊找鬼。 笑死椎侠,一個(gè)胖子當(dāng)著我的面吹牛第租,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播我纪,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼煌妈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了宣羊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤汰蜘,失蹤者是張志新(化名)和其女友劉穎仇冯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體族操,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苛坚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年比被,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泼舱。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡等缀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出娇昙,到底是詐尸還是另有隱情尺迂,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布冒掌,位于F島的核電站噪裕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏股毫。R本人自食惡果不足惜膳音,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铃诬。 院中可真熱鬧祭陷,春花似錦、人聲如沸趣席。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吩坝。三九已至毒姨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钉寝,已是汗流浹背弧呐。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嵌纲,地道東北人俘枫。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逮走,于是被迫代替她去往敵國(guó)和親鸠蚪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評(píng)論 6 342
  • Java RESTful REST 服務(wù)類型在 REST 服務(wù)中师溅,資源類是接收 REST 請(qǐng)求并完成響應(yīng)的核心類茅信,...
    并肩走天涯閱讀 1,280評(píng)論 0 1
  • title: Java EE 7 Tutorial分析date: 2016-12-10 16:47:25catag...
    raincoffee閱讀 1,881評(píng)論 2 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)墓臭,斷路器蘸鲸,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 原文鏈接:http://www.dropwizard.io/1.2.0/docs/getting-started....
    Lance_Xu閱讀 906評(píng)論 0 0