SEAM学習(二)---messages例
21734 ワード
エンティティbean:message
---------------------------------------------------------------------------------------------------------------------------------
session bean:
MessageManagerBeanのインスタンスを呼び出し、findMessages()メソッドを呼び出してコンテキスト変数を初期化します.
私たちはfindMessages()をmessagesの工場方法としています.
-----------------------------------------------------------------------------------------------------------------------
さぎょうげんり
私たちがmessagesを初めて見たときjspページの場合、このJSPページは、返信(postback)のJSF(ページリクエスト)またはブラウザから直接のGETリクエスト(ページリクエストではない)にかかわらず解析されます.
Messagelistコンテキスト変数.コンテキスト変数はまだ初期化されていないため、Seamはファクトリメソッドfindmessages()を呼び出し、データベースクエリを実行し、DataModelを外部に注入します.DataModelは、をレンダリングするために必要な行データを提供します.
ユーザがをクリックすると、JSFはSelect()アクションリスナーを呼び出す.Seamはこの呼び出しをブロックし、選択したローのデータをmessageManagerコンポーネントのmessageプロパティに注入します.アクションリスナーは、選択したメッセージを既読としてマークします.この呼び出しが終了すると、選択したMessageという変数にSeamが外部に注入されます.次に、EJBコンテナはトランザクションをコミットし、Messageの読み取り済みタグをデータベースに書き込みます.最後に、Webページを再レンダリングし、メッセージのリストを再度表示し、選択したメッセージの内容をリストの下に表示します.
ユーザがをクリックすると、JSFはdelete()アクションリスナーを呼び出す.Seamはこの呼び出しをブロックし、選択したローのデータをmessageManagerコンポーネントのmessageプロパティに注入します.アクションリスナーを起動し、選択したMessageをリストから削除し、EntityManagerでremove()メソッドを呼び出します.この呼び出しの最後に、SeamはmessageListコンテキスト変数をリフレッシュし、messageというコンテキスト変数をクリアします.次に、EJBコンテナがトランザクションをコミットし、Messageをデータベースから削除します.最後に、Webページを再レンダリングし、メッセージのリストを再度表示します.
//$Id: Message.java 902 2006-01-13 14:19:20Z theute $
package org.jboss.seam.example.messages;
import static org.jboss.seam.ScopeType.EVENT;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
@Entity
@Name("message") @Scope(EVENT)
public class Message implements Serializable
{
private Long id;
private String title;
private String text;
private boolean read;
private Date datetime;
@Id @GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@NotNull @Length(max=100)
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@NotNull @Lob
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
@NotNull
public boolean isRead() {
return read;
}
public void setRead(boolean read) {
this.read = read;
}
@NotNull
@Basic @Temporal(TemporalType.TIMESTAMP)
public Date getDatetime() {
return datetime;
}
public void setDatetime(Date datetime) {
this.datetime = datetime;
}
}
-------------------------------------------------------------------------------------------------------------------------
session :
//$Id: MessageManager.java 1584 2006-05-23 05:30:24Z gavin $
package org.jboss.seam.example.messages;
import javax.ejb.Local;
@Local
public interface MessageManager
{
public void findMessages();
public void select();
public void delete();
public void destroy();
}
---------------------------------------------------------------------------------------------------------------------------------
session bean:
//$Id: MessageManagerBean.java 2711 2006-11-19 21:01:33Z gavin $
package org.jboss.seam.example.messages;
import static javax.persistence.PersistenceContextType.EXTENDED;
import static org.jboss.seam.ScopeType.SESSION;
import java.io.Serializable;
import java.util.List;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
@Stateful
@Scope(SESSION)
// Seam 。 ,
。( Seam , 。) @Name("messageManager")
public class MessageManagerBean implements Serializable, MessageManager
{
@DataModel
private List<Message> messageList;
// @DataModel java.util.List JSF javax.faces.model.DataModel 。
JSF <h:dataTable> 。 ,DataModel messageList 。
@DataModelSelection //@DataModelSelection Seam List 。
@Out(required=false) // @Out 。 , ,
Message Bean , (outjected) message 。
private Message message;
@PersistenceContext(type=EXTENDED)
//EJB3 (extended persistence context)。 Bean , 。
, Bean EntityManager 。
private EntityManager em;
@Factory("messageList")
// JSP ,messageList ,@Factory Seam
MessageManagerBeanのインスタンスを呼び出し、findMessages()メソッドを呼び出してコンテキスト変数を初期化します.
私たちはfindMessages()をmessagesの工場方法としています.
public void findMessages()
{
messageList = em.createQuery("select msg from Message msg order by msg.datetime desc").getResultList();
}
public void select()
{
if (message!=null) message.setRead(true);
//select() Message , 。
}
public void delete()
{
if (message!=null)
{
messageList.remove(message);
em.remove(message);
message=null;
}
//delete() Message 。
}
@Remove @Destroy
public void destroy() {}
// Bean,Seam @Remove @Destroy
Seam Bean, 。
}
------------------------------------------------------------------------------------------------------------------
:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://jboss.com/products/seam/taglib" prefix="s" %>
<html>
<head>
<title>Messages</title>
</head>
<body>
<f:view>
<h2>Message List</h2>
<h:outputText value="No messages to display" rendered="#{messageList.rowCount==0}"/>
<h:dataTable var="msg" value="#{messageList}" rendered="#{messageList.rowCount>0}">
<h:column>
<f:facet name="header">
<h:outputText value="Read"/>
</f:facet>
<h:selectBooleanCheckbox value="#{msg.read}" disabled="true"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Title"/>
</f:facet>
<s:link value="#{msg.title}" action="#{messageManager.select}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Date/Time"/>
</f:facet>
<h:outputText value="#{msg.datetime}">
<s:convertDateTime type="both" dateStyle="medium" timeStyle="short"/>
</h:outputText>
</h:column>
<h:column>
<s:button value="Delete" action="#{messageManager.delete}"/>
</h:column>
</h:dataTable>
<h3><h:outputText value="#{message.title}"/></h3>
<div><h:outputText value="#{message.text}"/></div>
</f:view>
</body>
</html>
-----------------------------------------------------------------------------------------------------------------------
さぎょうげんり
私たちがmessagesを初めて見たときjspページの場合、このJSPページは、返信(postback)のJSF(ページリクエスト)またはブラウザから直接のGETリクエスト(ページリクエストではない)にかかわらず解析されます.
Messagelistコンテキスト変数.コンテキスト変数はまだ初期化されていないため、Seamはファクトリメソッドfindmessages()を呼び出し、データベースクエリを実行し、DataModelを外部に注入します.DataModelは、
ユーザが
ユーザが