Amazon Ads

顯示具有 Java EE 標籤的文章。 顯示所有文章
顯示具有 Java EE 標籤的文章。 顯示所有文章

2014年12月1日 星期一

【筆記】一個簡單的JAX-RS應用程式範例

這裡使用GlassFish 4來當伺服器,使用它的好處在於在GlassFish的函式庫( <glassfish安裝目錄>/glassfish/modules)中,已經內含支援JAX-RS的函式庫(如:jersey-container-servlet-core.jar等),我不用再另外下載,而且日後可以和其他Java EE元件搭配應用。


這裡使用Eclipse來進行開發。

先在Eclipse新建一個名為「jaxrs-example」的【Dynamic Web Project】專案。

再來在idv.jk.jaxrs套件下,新增一個名為「UserService.java」的類別:
package idv.jk.jaxrs;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;

@Path("/user")
public class UserService
{
 @GET
 @Path("/{name}")
 public Response sayHello(@PathParam("name") String name)
 {
  String message = "Hello, " + name;
  return Response.status(200).entity(message).build();
 }
}
其中,宣告在UserService類別上的這個@Path("/user")是跟容器講,若是/userURL,就交給我負責。

而在sayHello上面的@Path("/{param}")是說在/user後面接的URL可視為一個參數,在@PathParam("name")可以將此參數補捉下來,傳入方法使用,如客戶端使用/user/bio來做請求,則在sayHello傳入的name參數值就會是bio

再來在web.xml中加入下面程式片段,來設定servlet-mapping

    jaxrs-servlet
    org.glassfish.jersey.servlet.ServletContainer
    
      jersey.config.server.provider.packages
      idv.jk.jaxrs
    
    1


    jaxrs-servlet
    /service/*

這段設定用白話文來講,就是/service開頭的請求,都是用org.glassfish.jersey.servlet.ServletContainer這個類別來負責,而它會去idv.jk.jaxrs這個套件下去找,有沒有可以負責特定URL的類別,如上列的UserService類別就會是被設定為負責處理/service/user的請求,如:http://localhost:8080/jaxrs-example/service/user/bio,而前列URL中的bio,就會被捉出來當做傳入sayHello的參數。

一個簡單的JAX-RS應用程式只要上列兩個檔案的設定即可,再來啟動GlassFish並部署程式,成功之後,開啟瀏覽器,並在網址列輸入:http://localhost:8080/jaxrs-example/service/user/bio,網頁應為回應下列訊息:


參考來源:

2014年11月27日 星期四

【分享】Oralce認證:Oracle Certified Expert, Java EE 6 Java Persistence API Developer(1Z0-898)的考取心得

今天以98%的分數,考過了1Z0-898,取得Oracle Certified Expert, Java EE 6 Java Persistence API Developer的證照。


一開始在準備的時候,看它過的分數比較低,以為比較難,但這次過的分數是歷次來最高的,感到非常幸運。

其實,想想,要取得這張證照,除了對Java Persistence API要有一定程度的認識外,對EJB在交易(Transaction)的控制與例外(ex. EJBException)的處,以資料表間的設計,也要有一定認識,應該是這個關係,分數門檻才設在61%。

這次考試準備的參考書是先看下列這本:


這本是國外在準備認證的網友必推的一本,我一共看了兩遍,看第一次時,真的似懂非懂,看第二遍就會比較有感覺,現在回想,如果在閱讀時,搭配作者提供的範例程式碼,吸收應該會更快一點,理解也會更透徹一點,上面這一版內容有包含到JPA2.1的部份,作者在內文都會有說明,若只是要準備1Z0-898,考試內容只會包含JPA2.0,JPA2.1的部份可以先跳過。

再來,就是「必讀的聖經」:Java Persistence Specification,這我看了三次,相較於EJB的Spec,JPA的Spec好念多了,其中還滿多以程式碼來說明的,我覺得有助於以實作的角度來理解某些觀念。

我覺得範例程式碼一定要自己打一遍,而且要能看到執行結果,對於了解一些Annotation或其他設定很有幫助。

最後,要考認證,一定免不了模擬考題,經由國外網友的推薦,我這次依然使用Enthuware出的模擬考題,他的優點是在每個題目都會有說明,真的能補足閱讀時的盲點,就如大多數的網友說的一樣:不管題目答對或答錯,一定要把它對題目的說明背起來,這樣做,對考試很有助益的

2014年11月19日 星期三

【筆記】在Servlet中直接存取EntityManager的建議方式

因為Servlet是預設在多執行緒環境中運行的,所以若在Servlet使用下列方式來注入EntityManager物件,是違反執行安全的(NOT thread-safe):
@PersistenceContext(unitName="QueryPaging")
private EntityManager em;
所以,若要在Servlet若要直接存取EntityManager的話,應該用本文(context)查找(lookup)的方式來取得EntityManager,再做相關的操作
package examples.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import examples.model.Employee;

@PersistenceContext(unitName="QueryPaging",name="myapp/QueryPaging")
@WebServlet("/EmAccessServlet")
public class EmAccessServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
       
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  doPost(request, response);
 }

 @SuppressWarnings("unchecked")
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  PrintWriter pw = response.getWriter();
  try
  {
   EntityManager em = (EntityManager)new InitialContext()
                                        .lookup("java:comp/env/myapp/QueryPaging");
   List empList = em.createQuery("select e from Employee e").getResultList();
   for(Employee e : empList)
   {
    pw.println(e);
   }
  } catch (NamingException e)
  {
   e.printStackTrace();
  }
 }
}
使用上面的方式,對每個請求(request)都查找一個EntityManager,應用程式容器(container)會確保不會有相同的要求共享這些EntityManager

2014年1月16日 星期四

【筆記】在Mac上安裝Java EE 7 SDK

在到Oracle的官網下載後,使用終端機切換到下載檔案 (.sh file) 的目錄。


使用下列指令先把下載的檔案改成可以執行的模式:
$ chmod +x java_ee_sdk-7-jdk7-macosx-x64.sh
再來執行安裝,在終端機中輸入:
$ sh ./java_ee_sdk-7-jdk7-macosx-x64.sh
假使有顯示下列訊息,如:
This program requires DISPLAY environment variable to be set.
Please re-run after assigning an appropriate value to DISPLAY.
就先再執行下列指令:
$ export DISPLAY=:0
當出現下列視窗後,點按【下一步】開始安裝:


接下來若沒特殊需要,就只要按【下一步】就好。

參考資料:



2013年8月24日 星期六

[筆記]在GlassFish中建立JMS Physical Destination

為了可以讓一個在Glassfish伺服器上應用程式內執行的message-driven EJB接收訊息,必須對伺服器上的JMS設定做一些調整,第一步就是建立一個JMS Physical Destination。

打開【命令提示字元】切換到Glassfish安裝目錄下的「bin」目錄中,執行「create-jmsdest --desttype queue PSQueueDest」,其中,「--desttype queue」是指要建立的類型為「javax.jms.Queue」,若要建立類型為「javax.jms.Topic」,可以使用指令如:「create-jmsdest --desttype topic MyTopicPhysicalDestination

執行成功後,執行「list-jmsdest」,應可看到剛建立的Physical Destination,如下圖:

2013/08/27發現在GlassFish的Admin Console找到相關設定的地方,如下圖:

請注意版本差別,之前版本好像是在左側選單中【Configuration】下。

參考文件:http://docs.oracle.com/cd/E18930_01/html/821-2416/ablkj.html