首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Jersey 入門實戰:基於 JAX-RS 2.x 的 RESTful 服務開發與 JSF 對比

     編輯:Java 程式設計入門

REST 架構風格回顧

REST (Representational State Transfer) 以資源為核心,透過 HTTP 方法操作資源表現:

HTTP 方法語義範例
GET獲取資源GET /articles/1
POST建立資源POST /articles
PUT完整更新PUT /articles/1
PATCH部分更新PATCH /articles/1
DELETE刪除資源DELETE /articles/1

JSR 370 (JAX-RS 2.1) 定義 Java 實作標準,Jersey 是 Oracle 維護的參考實作,功能最完整、生態最成熟。

快速開始:Maven 專案建立

<dependencies>
    <!-- Jersey 核心 -->
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>3.1.5</version>
    </dependency>
    <!-- JSON 支援 (Jackson) -->
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>3.1.5</version>
    </dependency>
</dependencies>

核心組件開發

1. 實體類 (Resource Representation)

import jakarta.xml.bind.annotation.XmlRootElement;

@XmlRootElement // 支援 XML 序列化
public class Article {
    private Long id;
    private String title;
    private String content;
    private String author;
    private int votes;
    // Getter/Setter/建構子 略...
}

2. 資源類 (Resource Class)

import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;

@Path("/articles")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public class ArticleResource {
    private final ConcurrentHashMap articles = new ConcurrentHashMap<>();
    private final AtomicLong idGen = new AtomicLong();

    @GET
    public Response listArticles() {
        return Response.ok(articles.values()).build();
    }

    @GET @Path("/{id}")
    public Response getArticle(@PathParam("id") Long id) {
        Article a = articles.get(id);
        return a != null ? Response.ok(a).build() : Response.status(Response.Status.NOT_FOUND).build();
    }

    @POST
    public Response createArticle(Article article) {
        long id = idGen.incrementAndGet();
        article.setId(id);
        articles.put(id, article);
        return Response.status(Response.Status.CREATED).entity(article).build();
    }

    @PUT @Path("/{id}")
    public Response updateArticle(@PathParam("id") Long id, Article article) {
        if (!articles.containsKey(id)) return Response.status(Response.Status.NOT_FOUND).build();
        article.setId(id);
        articles.put(id, article);
        return Response.ok(article).build();
    }

    @DELETE @Path("/{id}")
    public Response deleteArticle(@PathParam("id") Long id) {
        articles.remove(id);
        return Response.noContent().build();
    }
}

3. 應用程式配置

import jakarta.ws.rs.ApplicationPath;
import jakarta.ws.rs.core.Application;

@ApplicationPath("/api")
public class RestApplication extends Application {
    // 掃描 @Path 註解類別,無需 web.xml
}

部署與測試

  • 打包 WAR 部署至 Tomcat/Jetty/Payara
  • 存取 https://host:port/context/api/articles 即可看到 JSON 列表
  • 瀏覽器安裝 JSON Viewer 外掛美化顯示

JSF vs REST 架構深度對比

維度JSF (JavaServer Faces)REST (Jersey/JAX-RS)
狀態管理伺服器端 HttpSession,ViewState 隱藏欄位客戶端無狀態,資源 URI 自描述
輸出格式僅 HTML (組件樹渲染)JSON、XML、PDF、CSV 任意格式
前端耦合緊耦合 JSF 組件庫完全解耦,支援 React/Vue/Angular/行動端
URL 設計自動生成,難以書籤/SEORESTful URI,語意清晰,利於 SEO
開發效率組件豐富,適合傳統企業後台需自行構建前端,初期投入大
擴展性叢集需 Session 複製/黏性 Session天然無狀態,水平擴展容易
測試性需容器/模擬器,整合測試複雜純 HTTP 呼叫,單元/契約測試簡單

共存策略:漸進式遷移

同一 WAR 可同時部署 JSF 與 Jersey:

  • web.xml 配置 FacesServlet (映射 *.xhtml) 與 Jersey ServletContainer (映射 /api/*)
  • 共用 Service 層、Entity、JPA,僅表現層分離
  • 舊功能維持 JSF,新功能採用 REST + 現代前端框架

測試最佳實踐

  1. Jersey Test Framework:嵌入式容器單元測試,快速驗證資源邏輯
  2. Contract Testing (Pact):生產者/消費者契約驗證,保障 API 相容
  3. Postman/Newman:手動探索 + CI 自動化回歸
  4. 負載測試:JMeter/Gatling 模擬高併發 REST 呼叫

總結

Jersey 以標準化、高效能、多格式支援成為 Java REST 開發首選。對於新專案,建議採用「REST 後端 + SPA 前端」架構;存量 JSF 專案可採用共存策略漸進遷移,降低風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved