2011年2月8日 星期二

JAX-RS Tomcat + Jersey

在 tomcat 6 上架 JAX-RS 服務

透過 Jersey 來提供 restful service 的功能

  • tomcat 版本 6.0.32
  • jesrey 版本 1.5

maven 上的設定如下

新增一個 respository

設定 dependency


撰寫 Service

先來撰寫一個簡單的 restful service


將服務注冊在/hello/{name}這個路徑底下,{name}是變數,service 會依路徑上的 name 值回傳結果
如 /hello/sue 則回傳 Hello World! sue

撰寫 Application

再來寫一個 Application 將剛寫好的 service 註冊進去



設定 web.xml

在 servlet 2.x spec 的版本必須透過 jesery 提供的 servlet 來佈署服務在 web.xml 上註冊 servlet


執行及測試

將 service 放在 /rs/* 這個路徑底下
執行 tomcat
測試一下 curl http://localhost:8080/jaxrs/rs/hello/john 是不是回應
Hello World! john

參考資料
http://jersey.java.net/nonav/documentation/latest/jax-rs.html

補充:也可省略撰寫 application 的步驟,web.xml 的設定修改如下

指定 service 所在的 package 名稱,讓 Jesery 去搜尋套件底下可能的 service ,就不須另外再撰寫註冊 service 的 Application 類別了。

2010年10月4日 星期一

SLF4J 使用說明

SLF4J Log 層級

SLF4J 提供 ERROR、WARN、INFO、DEBUG、TRACE 等5種層級。

一般使用上建議 logger 層級的使用 。

  • ERROR 為系統發生錯誤時的輸出訊息。
  • WARN 當系統發生不正常或非預期結果的訊息,其嚴重度不似 ERROR 層級。
  • INFO 輸出一般的資訊、輸出系統目前資訊、執行訊息,可做為平時記錄或監控使用。
  • DEBUG 除錯用的資訊,提供更詳細的資訊,利於工程師處理問題,會影嚮系統效能,不建議在產品環境中開啟,適合用於開發階段或問題除錯使用。
  • TRACE 比除錯更細微更詳盡的資訊內容,但影嚮效能甚鉅。

設定檔中 Logger 輸出層級

可在設定檔中設定 Logger 輸出的預設層級,以 LogBack 為例,若未指定預設的 Logger 層級為 INFO。

可依需求設定 Logger 的預設層級,各別套件或特定類別的輸出層級。

  • OFF 停止 logger 輸出任何資訊
  • ERROR 只輸出 Error 層級的錯誤訊息
  • WARN 輸出 Warn 層級含以上的訊息
  • INFO 輸出 Info 層級含以上的訊息
  • DEBUG 輸出 Debug 層級含以上的訊息
  • TRACE 輸出 Trace 層級含以上的訊息
  • ALL 輸出所有的 Logger 系統訊息

在 Class 中使用 logger 物件



在 JSP 中使用

<%-- 使用 jsp 的宣告實體變數 --%>
<%! private final Logger logger = LoggerFactory.getLogger(this.getClass());%>
<%
 //在 jsp scriptlet 中使用
 logger.info("username = {}", request.getParameter("username"));
%>

與舊有的 JCL (Jakarta Commons Logger) 的比較

Commons logger 的語法

JCL 在輸出記錄前必須先判斷目前 Logger 系統的層級再做 Log 訊息的輸出,以確保 Logger 的效能。

if(logger.isDebugEnabled()) {
  logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}

SLF4J 的等同語法

SLF4J 的寫法比較直覺,無須再去判斷目前的 log 層級,直接指定 log 層級輸出。

logger 的輸出與 JCL 不同,應採用參數的方法做輸出,減少不必要的字串組合所造成的效能秏損。

logger.debug("Entry number: {} is {}",i, String.valueOf(entry[i]));

參考資料