SEAM学习(一)-----安装运行example
1.下載jboss seam并解壓
2.安裝ant:解壓bin版本,新建ANT_HOME,并將其bin目錄添加到系統path
3.更改seam的build.properties,添加jboss.home D:\\DevelopTool\\jboss-4.2.2.GA。注意路徑后邊不能有空格
4.用cmd轉到examples的registration目錄下,運行ant deploy
5.瀏覽器:http://localhost:8080/seam-registration
?
分析:
user
//$Id: User.java 2360 2006-10-25 20:17:46Z gavin $ package org.jboss.seam.example.registration;import static org.jboss.seam.ScopeType.SESSION;import java.io.Serializable;import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table;import org.hibernate.validator.Length; import org.hibernate.validator.NotNull; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope;@Entity/*Seam組件需要一個 組件名稱,此名稱由注解 @Name來指定。此名稱必須在Seam應用內唯一。
當JSF用一個與組件同名的名稱去請求Seam來解析上下文變量, 且該上下文變量尚未定義(null)時,
Seam就將實例化那個組件,并將新實例綁定給上下文變量。 在此例中,Seam將在JSF第一次遇到名為 user 的變量時實例化 User。
每當Seam實例化一個組件時,它就將始化后的實例綁定給組件中 默認上下文 的上下文變量。
默認的上下文由 @Scope注解指定。 User Bean是個會話作用域的組件。*/
@Table(name="users") public class User implements Serializable {private static final long serialVersionUID = 1881413500711441951L;private String username;private String password;private String name;public User(String name, String password, String username){this.name = name;this.password = password;this.username = username;}public User() {}@NotNullpublic String getName(){return name;}public void setName(String name){this.name = name;}public String getPassword(){return password;}public void setPassword(String password){this.password = password;} public String getUsername(){return username;}public void setUsername(String username){this.username = username;}@Overridepublic String toString() {return "User(" + username + ")";} }?---------------------------------------------------------------------------------------------register接口://$Id: Register.java 2056 2006-09-28 00:36:56Z gavin $ package org.jboss.seam.example.registration;import javax.ejb.Local;@Local public interface Register {public String register(); }?-----------------------------------------------------------------------------------------------register action//$Id: RegisterAction.java 5298 2007-06-20 00:08:47Z gavin $ package org.jboss.seam.example.registration;import java.util.List;import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext;import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Logger; import org.jboss.seam.annotations.Name; import org.jboss.seam.faces.FacesMessages; import org.jboss.seam.log.Log;@Statelesspublic class RegisterAction implements Register {注解 @In將Bean的一個屬性標記為由Seam來注入。 在此例中,此屬性由名為 user 的上下文變量注入(實例的變量名)。 private User user;@PersistenceContextprivate EntityManager em;@Loggerprivate static Log log;public String register(){List existing = em.createQuery("select u.username from User u where u.username=#{user.username}").getResultList();if ( existing.size()==0 ){em.persist(user);log.info("Registered new user #{user.username}");return "/registered.jspx";}else{FacesMessages.instance().add("User #{user.username} already exists");?//Seam提供了大量的 內置組件(built-in components) 來協助解決那些經常遇到的問題。 用 FacesMessages 組件就可很容易地來顯示模板化的錯誤或成功的消息。 內置的Seam組件還可由注入或通過調用 instance() 方法來獲取。 return null;//多個JSF動作監聽器方法返回一個字符串值的輸出,它決定了接下來應顯示的頁面內容。 空輸出(或返回值為空的動作監聽器方法)重新顯示上一頁的內容.}}}Seam組件需要一個 組件名稱,此名稱由注解 @Name來指定。此名稱必須在Seam應用內唯一。當JSF用一個與組件同名的名稱去請求Seam來解析上下文變量, 且該上下文變量尚未定義(null)時,Seam就將實例化那個組件,并將新實例綁定給上下文變量。 在此例中,Seam將在JSF第一次遇到名為 user 的變量時實例化 User。 每當Seam實例化一個組件時,它就將始化后的實例綁定給組件中 默認上下文 的上下文變量。默認的上下文由 @Scope注解指定。 User Bean是個會話作用域的組件。
?頁面:<?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:s="http://jboss.com/products/seam/taglib"xmlns:h="http://java.sun.com/jsf/html"xmlns:f="http://java.sun.com/jsf/core"><head><title>Register New User</title></head><body><f:view><h:form> <s:validateAll>這里的 <s:validateAll>標簽是Seam特有的。 該JSF組件告訴JSF讓它用實體Bean中所指定的Hibernat驗證器注解來驗證所有包含輸入的字段。<h:panelGrid columns="2">Username: <h:inputText value="#{user.username}" required="true"/>Real Name: <h:inputText value="#{user.name}" required="true"/>Password: <h:inputSecret value="#{user.password}" required="true"/></h:panelGrid></s:validateAll><h:messages/><h:commandButton value="Register" action="#{register.register}"/></h:form></f:view></body></html>?
registered
<?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:f="http://java.sun.com/jsf/core"><head><title>Successfully Registered New User</title></head><body><f:view>Welcome, #{user.name}, you are successfully registered as #{user.username}.</f:view></body></html>?--------------------------------------------------------------------------------------------------------------------部署描述文件:
(1)Seam組件部署描述文件:components.xml
如果你此前曾接觸過許多的Java框架,你就會習慣于將所有的組件類放在某種XML文件中來聲明,那些文件就會隨著項目的不斷成熟而不斷加大到最終到不可收拾的地步。 對于Seam應用,你盡可放心,因為它并不要求應用組件都要有相應的XML。大部份的Seam應用要求非常少量的XML即可,且XML文件大小不會隨著項目的增大而快速增長。
無論如何,若能為 某些 組件(特別是Seam內置組件)提供某些 外部配置往往是有用的。這樣一來,我們就有幾個選擇, 但最靈活的選擇還是使用位于 WEB-INF 目錄下的 components.xml 配置文件。 我們將用 components.xml 文件來演示Seam怎樣在JNDI中找到EJB組件:
<components xmlns="http://jboss.com/products/seam/components"xmlns:core="http://jboss.com/products/seam/core"><core:init jndi-pattern="@jndiPattern@"/> </components>此代碼配置了Seam內置組件 org.jboss.seam.core.init 的 jndiPattern 屬性。這里需要奇怪的@符號是因為ANT腳本會在部署應用時將正確的JNDI語法在標記處自動填補
(2)Web部署描述文件:web.xml
我們將以WAR的形式來部署此小應用的表示層,因此需要web部署描述文件。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><!-- Seam --><listener><listener-class>org.jboss.seam.servlet.SeamListener</listener-class></listener><!-- MyFaces --><listener><listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class></listener><context-param><param-name>javax.faces.STATE_SAVING_METHOD</param-name><param-value>client</param-value></context-param><servlet><servlet-name>Faces Servlet</servlet-name><servlet-class>javax.faces.webapp.FacesServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><!-- Faces Servlet Mapping --><servlet-mapping><servlet-name>Faces Servlet</servlet-name><url-pattern>*.seam</url-pattern></servlet-mapping></web-app>此 web.xml 文件配置了Seam和JSF。所有Seam應用中的配置與此處的配置基本相同。
(3)JSF配置:faces-config.xml
絕大多數的Seam應用將JSF來作為表示層。因而我們通常需要 faces-config.xml。SEAM將用Facelet定義視圖表現層,所以我們需要告訴JSF用Facelet作為它的模板引擎。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN""http://java.sun.com/dtd/web-facesconfig_1_0.dtd"> <faces-config><!-- A phase listener is needed by all Seam applications --><lifecycle><phase-listener>org.jboss.seam.jsf.SeamPhaseListener</phase-listener></lifecycle></faces-config>注意我們不需要申明任何JSF managed Bean!因為我們所有的managed Bean都是通過經過注釋的Seam組件。所以在Seam的應用中,faces-config.xml比原始的JSF更少用到。
實際上,一旦你把所有的基本描述文件配置完畢,你所需寫的 唯一類型的 XML文件就是導航規則及可能的jBPM流程定義。對于Seam而言, 流程(process flow) 及 配置數據 是唯一真正屬于需要XML定義的。
在此簡單的示例中,因為我們將視圖頁面的ID嵌入到Action代碼中,所以我們甚至都不需要定義導航規則。
(4)EJB部署描述文件:ejb-jar.xml
ejb-jar.xml 文件將 SeamInterceptor 綁定到壓縮包中所有的會話Bean上,以此實現了Seam與EJB3的整合。
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"version="3.0"><interceptors><interceptor><interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class></interceptor></interceptors><assembly-descriptor><interceptor-binding><ejb-name>*</ejb-name><interceptor-class>org.jboss.seam.ejb.SeamInterceptor</interceptor-class></interceptor-binding></assembly-descriptor></ejb-jar>(5)EJB持久化部署描述文件:persistence.xml
persistence.xml 文件告訴EJB的持久化層在哪找到數據源,該文件也含有一些廠商特定的設定。此例在程序啟動時自動創建數據庫Schema。
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"version="1.0"><persistence-unit name="userDatabase"><provider>org.hibernate.ejb.HibernatePersistence</provider><jta-data-source>java:/DefaultDS</jta-data-source><properties><property name="hibernate.hbm2ddl.auto" value="create-drop"/></properties></persistence-unit> </persistence>?
---------------------------------------------------------------------------------------------------------------------
工作原理
當提交表單時,JSF請求Seam來解析名為 user 的變量。由于還沒有值綁定到 user 上(在任意的Seam上下文中), Seam就會實例化 user組件,接著把它保存在Seam會話上下文后,然后將 User 實體Bean實例返回給JSF。
表單輸入的值將由在 User 實體中所指定的Hibernate驗證器來驗證。 若有非法輸入,JSF就重新顯示當前頁面。否則,JSF就將輸入值綁定到 User 實體Bean的字段上。
接著,JSF請求Seam來解析變量 register。 Seam在無狀態上下文中找到 RegisterAction 無狀態的會話Bean并把它返回。JSF隨之調用 register() 動作監聽器方法。
Seam攔截方法調用并在繼續調用之前從Seam會話上下文注入 User 實體。
register() 方法檢查所輸入用戶名的用戶是否已存在。 若存在該用戶名,則錯誤消息進入 facesmessages 組件隊列,返回無效結果并觸發瀏覽器重顯頁面。facesmessages 組件嵌在消息字符串的JSF表達式,并將JSF facesmessage 添加到視圖中。
若輸入的用戶不存在,"/registered.jsp" 輸出就會將瀏覽器重定向到 registered.jsp 頁。 當JSF來渲染頁面時,它請求Seam來解析名為 user 的變量,并使用從Seam會話作用域返回的 User 實體的屬性值。
轉載于:https://www.cnblogs.com/cxccbv/archive/2009/01/25/1380876.html
總結
以上是生活随笔為你收集整理的SEAM学习(一)-----安装运行example的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SharePoint Calendar
- 下一篇: 整合SharePoint MOSS 和S