Hello World, Seam!
嗯(⊙_⊙),用最简单的通讯录做一个Hello World, Seam!吧。
IDE用Eclipse JEE+JBoss Tools(主要是Seam Tools),前端JSF,会话bean和实体bean用EJB3。
首先在Eclipse里新建一个Seam Project,EAR类型的,起名叫Contacts 吧,在MYSQL里面建立一个叫contacts的数据库。
在SeamContacts-ejb项目里面建立两个包,分别是org.yoyo.contacts.entity和org.yoyo.contacts.session,存放实体Bean和会话Bean。
实体Bean如下:
package org.yoyo.contacts.entity; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.validator.NotNull; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; /** * 联系人实体 * @author YOYO * */ @Entity @Name("contact") @Scope(ScopeType.EVENT) @Table(name="contacts") public class Contact implements Serializable { /** * */ private static final long serialVersionUID = 1L; /** * 姓名 */ private String name; /** * 电话 */ private String telphone; /** * 邮箱 */ private String email; @Id @NotNull public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTelphone() { return telphone; } public void setTelphone(String telphone) { this.telphone = telphone; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
会话Bean分为接口和实现类:
本地接口
package org.yoyo.contacts.session; import javax.ejb.Local; /** * 地址簿接口 * * @author YOYO * */ @Local public interface AddressBook { /** * 添加联系人 * * @return */ public String addToBook(); /** * 开始编辑 * @return */ public String beginEdit(); /** * 编辑结束 * @return */ public String edited(); /** * 删除 * @return */ public String delete(); /** * 获得联系人列表 * * @return */ public void findContacts(); }
SFSB:
package org.yoyo.contacts.session; import java.io.Serializable; import java.util.List; import javax.ejb.Remove; import javax.ejb.Stateful; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContextType; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Begin; import org.jboss.seam.annotations.Destroy; import org.jboss.seam.annotations.End; import org.jboss.seam.annotations.Factory; import org.jboss.seam.annotations.In; 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; import org.yoyo.contacts.entity.Contact; /** * 地址簿会话Bean * * @author YOYO * */ @Stateful @Scope(ScopeType.SESSION) @Name("addressBook") @SuppressWarnings("unused") public class AddressBookAction implements Serializable, AddressBook { /** * */ private static final long serialVersionUID = 1L; /** * 当前JSF上下文 */ private FacesContext facesContext = FacesContext.getCurrentInstance(); /** * 联系人 */ @In(required = false) private Contact contact; /** * 联系人列表 */ @DataModel private List<Contact> contacts; /** * 当前选择的联系人 */ @DataModelSelection @In(required = false) @Out(required = false, scope = ScopeType.CONVERSATION) private Contact selectedContact; /** * 持久化容器 */ @PersistenceContext(type = PersistenceContextType.EXTENDED) private EntityManager em; /** * 添加联系人 */ public String addToBook() { long count = (Long) em.createQuery( "SELECT COUNT(*) FROM Contact WHERE name = :name") .setParameter("name", contact.getName()).getSingleResult(); if (count == 0) { em.persist(contact); findContacts(); return "home"; } else { facesContext.addMessage(null, new FacesMessage( "Name already exists!")); return null; } } /** * 开始编辑 */ @Begin public String beginEdit() { return "edit"; } /** * 编辑结束 */ @End public String edited() { em.persist(selectedContact); findContacts(); return "home"; } /** * 删除 */ public String delete() { em.remove(selectedContact); findContacts(); return "home"; } /** * 获得联系人列表 */ @SuppressWarnings("unchecked") @Factory("contacts") public void findContacts() { contacts = (List<Contact>) em.createQuery("from Contact") .getResultList(); } @Remove @Destroy public void destroy() { } }
前端在SeamContacts项目中,修改WebContent目录下的几个文件
home.xhtml(地址簿列表,进行查询和删除)主要代码:
<h:form> <h:dataTable value="#{contacts}" var="currentContact"> <h:column> <f:facet name="header"> <h:outputText value="Name" /> </f:facet> <h:outputText value="#{currentContact.name}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Telphone" /> </f:facet> <h:outputText value="#{currentContact.telphone}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="E-Mail" /> </f:facet> <h:outputText value="#{currentContact.email}" /> </h:column> <h:column> <h:commandLink value="Edit" action="#{addressBook.beginEdit}" /> </h:column> <h:column> <h:commandLink value="Delete" action="#{addressBook.delete}" /> </h:column> </h:dataTable> <h:commandLink action="add" value="Add Contact" /> </h:form>
add.xhtml(添加信息)主要代码:
<h:form> <p>add your contact people info:</p> <ul class="bullets"> <li><strong>Name</strong>:<h:inputText value="#{contact.name}" /></li> <li><strong>Telphone</strong>:<h:inputText value="#{contact.telphone}" /></li> <li><strong>EMail</strong>:<h:inputText value="#{contact.email}" /></li> <li><h:commandButton action="#{addressBook.addToBook}" value="Add Contact" /></li> </ul> </h:form>
edit.xhtml(修改信息)主要代码:
<h:form> <p>edit your contact people info:</p> <ul class="bullets"> <li><strong>Name</strong>:<h:outputText value="#{selectedContact.name}" /></li> <li><strong>Telphone</strong>:<h:inputText value="#{selectedContact.telphone}" /></li> <li><strong>EMail</strong>:<h:inputText value="#{selectedContact.email}" /></li> <li><h:commandButton action="#{addressBook.edited}" value="Edit Contact" /></li> </ul> </h:form>
以及跳转的配置(pages.xml部分代码):
<page view-id="*"> <navigation> <rule if-outcome="home"> <redirect view-id="/home.xhtml"/> </rule> <rule if-outcome="add"> <redirect view-id="/add.xhtml"/> </rule> <rule if-outcome="edit"> <redirect view-id="/edit.xhtml"/> </rule> </navigation> </page>
简单的Seam CRUD到此为止,但是对于其流程怎么走还是有点混乱,待继续研究。