NetBeans 6.8 で EJB 3.1 を使用した簡単なサンプルアプリを作成。
NetBeans 6.8 のインストール
以下のサイトから NetBeans 6.8 を落としてインストールします。今回は netbeans-6.8-ml-java-windows.exe を使用しました。GlassFish 等含めてインストールされます。
http://netbeans.org/downloads/index.html
Webアプリケーションプロジェクト作成
NetBeans 6.8 を起動して新規プロジェクトを作成します。プロジェクトはWebアプリケーションを選択します。
Java EE バージョンに「Java EE 6 Web」を選択します。
index.xhtmlを含むプロジェクトが作成されます。
エンティティークラスの作成
JPA を使ったエンティティークラスを作成します。新規ファイルとしてエンティティクラスを選択します。
エンティティクラスは「Message」とし、パッケージは「entities」としました。
ここで「接続性ユニットを作成...」にてJPAの接続を定義します。データソースに jdbc/sample を指定すると JavaDB が使用されます。
以下のような Entity クラスが作成されます。
package entities; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Message implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Override public int hashCode() { int hash = 0; hash += (id != null ? id.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { // TODO: Warning - this method won't work in the case the id fields are not set if (!(object instanceof Message)) { return false; } Message other = (Message) object; if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { return false; } return true; } @Override public String toString() { return "entities.Message[id=" + id + "]"; } }
上記設定の定義が反映された persistence.xml も同時に作成されます。
作成された Message エンティテイのフィールドとして以下を追加します。
private String message;
右クリックにて「コードを挿入...」「設定メソッドおよび取得メソッド」にてアクセッサを追加しておきます。
セッションファサードの作成
作成した Message エンティティーのステートレスセッションファサードを作成します。新規ファイルから「エンティティークラスのセッションBean」を選択します。
「boundary」パッケージとしてセッションファサードを作成します。
MessageFacadeクラスが以下のように作成されます。CRUDやcount用のメソッドが自動生成されます。
package boundary; import entities.Message; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; @Stateless public class MessageFacade { @PersistenceContext(unitName = "WebApplication1PU") private EntityManager em; public void create(Message message) { em.persist(message); } public void edit(Message message) { em.merge(message); } public void remove(Message message) { em.remove(em.merge(message)); } public Message find(Object id) { return em.find(Message.class, id); } public List<Message> findAll() { CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); cq.select(cq.from(Message.class)); return em.createQuery(cq).getResultList(); } public List<Message> findRange(int[] range) { CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); cq.select(cq.from(Message.class)); Query q = em.createQuery(cq); q.setMaxResults(range[1] - range[0]); q.setFirstResult(range[0]); return q.getResultList(); } public int count() { CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); Root<Message> rt = cq.from(Message.class); cq.select(em.getCriteriaBuilder().count(rt)); Query q = em.createQuery(cq); return ((Long) q.getSingleResult()).intValue(); } }
JSF管理対象Beanの作成
新規ファイルからJSF管理対象Beanを作成します。
パッケージ名を「presentation」クラス名を「MessageView」とします。
以下のソースが作成されます。
package presentation; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; @ManagedBean(name="MessageView") @RequestScoped public class MessageView { public MessageView() { } }
コード上で右クリックし、コード挿入、エンタープライズBean呼び出しを選択し、MessageFacadeを追加します。
MessageView で利用するMessageやpostMessageメソッドなどを以下のように追加します。
package presentation; import boundary.MessageFacade; import entities.Message; import javax.ejb.EJB; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; @ManagedBean(name="MessageView") @RequestScoped public class MessageView { @EJB private MessageFacade messageFacade; private Message message; public MessageView() { this.message = new Message(); } public Message getMessage() { return message; } public int getNumberOfMessages(){ return messageFacade.findAll().size(); } public String postMessage(){ this.messageFacade.create(message); return "theend"; } }
JSFページの作成
index.xhtml を以下のように編集します。
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <h:head> <title>Facelet Title</title> </h:head> <h:body> <f:view> <h:form> <h:outputLabel value="Message:"/> <h:inputText value="#{MessageView.message.message}"/> <h:commandButton action="#{MessageView.postMessage}" value="Post Message"/> </h:form> </f:view> </h:body> </html>
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <title>Facelet Title</title> </h:head> <h:body> <h:outputLabel value="Thanks! There are "/> <h:outputText value="#{MessageView.numberOfMessages}"/> <h:outputLabel value=" messages!"/> </h:body> </html>