千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          上一篇大概說了一下WEB工程里面要添加的配置文件以及要引用到的庫文件,現(xiàn)在來對(duì)EJB工程進(jìn)行一些改造,讓它可以成為SEAM工程的一部份.
          相對(duì)于WEB工程來說,EJB工程的更改就不太多了,可以新建一個(gè)EJB工程,然后在源文件的根目錄下,也就是netbeans的default package下面,添加一個(gè)文件,叫seam.properties,無論你有沒有用到,也要添加這么一個(gè)文件,否則你的EJB工程就是一個(gè)普通的EJB工程了,就不能被SEAM所管理,并且里面的Session Bean就不能被用來當(dāng)做JSF的backingbean,這一點(diǎn)要特別注意.然后就可以像建普通EJB一樣編寫EJB代碼了,你可以用netbeans來生成,也可以自己手工編寫,先編寫接口,再編寫B(tài)ean,這都無所謂.然后為了讓我們的EJB能被當(dāng)做JSF的backingbean,我們需要在我們編寫的EJB里面添加如下注釋:@Name,它是SEAM框架帶的注釋,這就相當(dāng)于聲明了一個(gè)backingbean,比如以下的類:
          import java.io.Serializable;
          import javax.persistence.Entity;
          import javax.persistence.GeneratedValue;
          import javax.persistence.GenerationType;
          import javax.persistence.Id;
          import javax.persistence.Table;
          import org.hibernate.validator.Length;
          import org.hibernate.validator.NotNull;
          import org.jboss.seam.ScopeType;
          import org.jboss.seam.annotations.Name;
          import org.jboss.seam.annotations.Scope;

          /**
           *
           * 
          @author hadeslee
           
          */
          @Entity
          @Name(
          "user")
          @Table(name 
          = "users")
          @Scope(ScopeType.SESSION)
          public class User implements Serializable {

              
          private static final long serialVersionUID = 1L;
              
          private Long id;
              
          private String username;
              
          private String password;
              
          private String name;
              @NotNull
              
          public String getName() {
                  
          return name;
              }
              
              
          public void setName(String name) {
                  
          this.name = name;
              }
              @NotNull @Length(min
          =5,max=15)
              
          public String getPassword() {
                  
          return password;
              }

              
          public void setPassword(String password) {
                  
          this.password = password;
              }
              @NotNull @Length(min
          =5,max=15)
              
          public String getUsername() {
                  
          return username;
              }

              
          public void setUsername(String username) {
                  
          this.username = username;
              }

              
          public void setId(Long id) {
                  
          this.id = id;
              }

              @Id
              @GeneratedValue(strategy 
          = GenerationType.AUTO)
              
          public Long getId() {
                  
          return 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 User)) {
                      
          return false;
                  }
                  User other 
          = (User) 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 "com.hadeslee.test1.User[id=" + id + "]";
              }
          }

          我這個(gè)EntityBean是用netbeans生成的,然后自己再添加一些內(nèi)容,讓netbeans生成的好處是它可以自動(dòng)為你生成equals和hashCode方法,在我們這個(gè)類里面,由于添加了@Name注釋,那么它的值user就可以當(dāng)做一個(gè)backingbean的名字,而直接在JSF頁面里面使用了.至于別的注釋,等我們編寫第一個(gè)簡(jiǎn)單的SEAM應(yīng)用的時(shí)候再詳細(xì)解釋.
          上面看到的是實(shí)體類,其實(shí)Session Bean也是一樣的,比如:

          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;

          /**
           *
           * 
          @author hadeslee
           
          */
          @Stateless
          @Name(
          "register")
          public class RegisterAction implements Register {

              @In
              
          private User user;
              @PersistenceContext
              
          private EntityManager em;
              @Logger
              
          private Log log;

              
          public String register() {
                  List existing 
          = em.createQuery("select username from User where username=#{user.username}").getResultList();
                  
          if (existing.size() == 0) {
                      em.persist(user);
                      log.info(
          "注冊(cè)了新的用戶,名字是: #{user.username}");
                      
          return "/registered.jsp";
                  } 
          else {
                      FacesMessages.instance().add(
          "用戶 #{user.username} 已經(jīng)存在");
                      
          return null;
                  }
              }
          }

          它也用了注釋:@Name,當(dāng)我們?cè)贘SF頁面里面調(diào)用register的時(shí)候,就可以直接調(diào)用這個(gè)無狀態(tài)會(huì)話Bean的方法做為action了.這就是SEAM的特點(diǎn),讓我們的JSF和EJB無縫的連接到了一起.
          在SEAM里面,支持雙向注射,可以使用@In來注入,也可以用@Out來射出.
          看完代碼之后,我們還要添加一個(gè)文件ejb-jar.xml,這個(gè)文件是EJB2.X的時(shí)候一定要用到的,當(dāng)EJB3.0可以使用注釋以后,它就變成可有可無的了,但是為了SEAM能知道我們EJB里面的方法并攔截它,因?yàn)橹挥兴軘r截我們的方法,才能在我們調(diào)用某個(gè)方法的時(shí)候,為我們注入我們需要的對(duì)象.
          ejb-jar.xml里面的內(nèi)容絕大多數(shù)情況內(nèi)容如下:
          <?xml version="1.0" encoding="UTF-8"?>
          <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>

          它只是定義了一個(gè)攔截器,指定的一個(gè)攔截器,攔截此JAR包里面的所有的EJB方法調(diào)用.這個(gè)千萬不能少,否則的話,就不能在我們調(diào)用EJB方法之前注入我們需要的對(duì)象了.
          當(dāng)然,如果你使用了Entity bean的話,就會(huì)有persistence.xml了,它一般是由netbeans自動(dòng)生成的,關(guān)于這個(gè)文件就和以前的一樣了,不用過多的介紹.
          當(dāng)然,我們還要說說EJB工程里面要引用到的庫文件,比如我們的@Name注釋和@In和@Out注釋,都是SEAM的包里面的.下面是一般要用到的庫文件:
          jboss-seam.jar   Seam的核心庫

          其的它就不用了,其實(shí)很多庫,既可以和WEB的工程目錄相關(guān),也可以和EJB的工程目錄相關(guān),反正最后是一個(gè)Enterprise Application,會(huì)把WEB和EJB的工程統(tǒng)一打包成EAR文件的.

          關(guān)于前面的配置就這些了,其實(shí)SEAM的配置也不是很復(fù)雜,對(duì)于WEB工程來說,只是加了幾個(gè)XML文件,而對(duì)于EJB工程來說,幾乎什么都沒有加,只是加了一個(gè)SEAM的核心庫而已.

          下一章,我們將用Netbeans開發(fā)一個(gè)完整的SEAM應(yīng)用,一個(gè)非常簡(jiǎn)單的SEAM應(yīng)用,接受注冊(cè),以及驗(yàn)證輸入.如果驗(yàn)證通過就把輸入的內(nèi)容保存到數(shù)據(jù)庫里面.











          盡管千里冰封
          依然擁有晴空

          你我共同品味JAVA的濃香.
          posted on 2008-05-07 14:03 千里冰封 閱讀(2962) 評(píng)論(2)  編輯  收藏 所屬分類: JAVAEENetbeans

          FeedBack:
          # re: 使用Netbeans開發(fā)Seam應(yīng)用(二)[未登錄]
          2008-05-19 22:25 | eric
          期待下一章  回復(fù)  更多評(píng)論
            
          # re: 使用Netbeans開發(fā)Seam應(yīng)用(二)
          2008-09-06 22:11 | 88250
          可以不用寫ejb-jar.xml的,在Session Beans頭注釋:
          @Interceptors({org.jboss.seam.ejb.SeamInterceptor.class})
          就可以了,不過每個(gè)Session Bean都要寫還是有點(diǎn)麻煩的,: )  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 改则县| 长春市| 武城县| 石河子市| 马龙县| 桑日县| 尤溪县| 奇台县| 长岛县| 武冈市| 宜君县| 皮山县| 阿城市| 平乐县| 天等县| 昌吉市| 西乡县| 谢通门县| 甘肃省| 宝兴县| 沅陵县| 华安县| 明水县| 鄱阳县| 卓资县| 会东县| 东宁县| 苍梧县| 福海县| 眉山市| 辽源市| 千阳县| 定兴县| 佛山市| 旬邑县| 岳普湖县| 伊宁市| 深州市| 郴州市| 宜良县| 普格县|