<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    千里冰封
    JAVA 濃香四溢
    posts - 151,comments - 2801,trackbacks - 0
    上一篇大概說(shuō)了一下WEB工程里面要添加的配置文件以及要引用到的庫(kù)文件,現(xiàn)在來(lái)對(duì)EJB工程進(jìn)行一些改造,讓它可以成為SEAM工程的一部份.
    相對(duì)于WEB工程來(lái)說(shuō),EJB工程的更改就不太多了,可以新建一個(gè)EJB工程,然后在源文件的根目錄下,也就是netbeans的default package下面,添加一個(gè)文件,叫seam.properties,無(wú)論你有沒(méi)有用到,也要添加這么一個(gè)文件,否則你的EJB工程就是一個(gè)普通的EJB工程了,就不能被SEAM所管理,并且里面的Session Bean就不能被用來(lái)當(dāng)做JSF的backingbean,這一點(diǎn)要特別注意.然后就可以像建普通EJB一樣編寫EJB代碼了,你可以用netbeans來(lái)生成,也可以自己手工編寫,先編寫接口,再編寫B(tài)ean,這都無(wú)所謂.然后為了讓我們的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頁(yè)面里面使用了.至于別的注釋,等我們編寫第一個(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頁(yè)面里面調(diào)用register的時(shí)候,就可以直接調(diào)用這個(gè)無(wú)狀態(tài)會(huì)話Bean的方法做為action了.這就是SEAM的特點(diǎn),讓我們的JSF和EJB無(wú)縫的連接到了一起.
    在SEAM里面,支持雙向注射,可以使用@In來(lái)注入,也可以用@Out來(lái)射出.
    看完代碼之后,我們還要添加一個(gè)文件ejb-jar.xml,這個(gè)文件是EJB2.X的時(shí)候一定要用到的,當(dāng)EJB3.0可以使用注釋以后,它就變成可有可無(wú)的了,但是為了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è)千萬(wàn)不能少,否則的話,就不能在我們調(diào)用EJB方法之前注入我們需要的對(duì)象了.
    當(dāng)然,如果你使用了Entity bean的話,就會(huì)有persistence.xml了,它一般是由netbeans自動(dòng)生成的,關(guān)于這個(gè)文件就和以前的一樣了,不用過(guò)多的介紹.
    當(dāng)然,我們還要說(shuō)說(shuō)EJB工程里面要引用到的庫(kù)文件,比如我們的@Name注釋和@In和@Out注釋,都是SEAM的包里面的.下面是一般要用到的庫(kù)文件:
    jboss-seam.jar   Seam的核心庫(kù)

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

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

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











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

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

    FeedBack:
    # re: 使用Netbeans開發(fā)Seam應(yīng)用(二)[未登錄](méi)
    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})
    就可以了,不過(guò)每個(gè)Session Bean都要寫還是有點(diǎn)麻煩的,: )  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚洲国产主播精品极品网红| 日本免费一二区在线电影| a毛片免费全部播放完整成| 青娱乐在线免费观看视频| 亚洲AV无码之国产精品| 亚洲色WWW成人永久网址| 亚洲免费在线观看| 亚洲午夜激情视频| 国产亚洲人成网站在线观看| 国产精品亚洲αv天堂无码| 国产亚洲精品a在线观看| 亚洲日韩中文无码久久| 亚洲av最新在线网址| 久久国产亚洲精品无码| 亚洲高清美女一区二区三区| 亚洲成片观看四虎永久| 野花高清在线观看免费完整版中文| 综合在线免费视频| 天天操夜夜操免费视频| 国产成人在线观看免费网站 | 亚洲人成伊人成综合网久久久| 国产成人精品亚洲精品| 亚洲精品制服丝袜四区| 亚洲国产aⅴ综合网| 久久久青草青青国产亚洲免观| 中文字幕精品无码亚洲字| 亚洲人成网站在线播放vr| 亚洲av永久无码精品网站| 99亚洲精品高清一二区| 在线亚洲午夜片AV大片| 久久精品国产亚洲AV电影网| 大片免费观看92在线视频线视频 | 亚洲中文无码av永久| 午夜亚洲WWW湿好爽| 一区二区免费电影| 一区二区三区观看免费中文视频在线播放| 99视频在线看观免费| 成人无遮挡毛片免费看| 亚洲精品tv久久久久| 亚洲国产成人久久综合碰碰动漫3d| 亚洲福利电影一区二区?|