千里冰封
JAVA 浓香四溢
posts - 151,comments - 2801,trackbacks - 0
上一篇大概说了一下WEB工程里面要添加的配置文件以及要引用到的库文件,现在来对EJB工程进行一些改造,让它可以成为SEAM工程的一部份.
相对于WEB工程来说,EJB工程的更改就不太多了,可以新建一个EJB工程,然后在源文件的根目录下,也就是netbeans的default package下面,添加一个文件,叫seam.properties,无论你有没有用到,也要添加这么一个文件,否则你的EJB工程就是一个普通的EJB工程了,就不能被SEAM所管理,并且里面的Session Bean就不能被用来当做JSF的backingbean,这一点要特别注意.然后就可以像建普通EJB一样编写EJB代码了,你可以用netbeans来生成,也可以自己手工编写,先编写接口,再编写Bean,这都无所谓.然后为了让我们的EJB能被当做JSF的backingbean,我们需要在我们编写的EJB里面添加如下注释:@Name,它是SEAM框架带的注释,这就相当于声明了一个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 + "]";
    }
}

我这个EntityBean是用netbeans生成的,然后自己再添加一些内容,让netbeans生成的好处是它可以自动为你生成equals和hashCode方法,在我们这个类里面,由于添加了@Name注释,那么它的值user就可以当做一个backingbean的名字,而直接在JSF页面里面使用了.至于别的注释,等我们编写第一个简单的SEAM应用的时候再详细解释.
上面看到的是实体类,其实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(
"注册了新的用户,名字是: #{user.username}");
            
return "/registered.jsp";
        } 
else {
            FacesMessages.instance().add(
"用户 #{user.username} 已经存在");
            
return null;
        }
    }
}

它也用了注释:@Name,当我们在JSF页面里面调用register的时候,就可以直接调用这个无状态会话Bean的方法做为action了.这就是SEAM的特点,让我们的JSF和EJB无缝的连接到了一起.
在SEAM里面,支持双向注射,可以使用@In来注入,也可以用@Out来射出.
看完代码之后,我们还要添加一个文件ejb-jar.xml,这个文件是EJB2.X的时候一定要用到的,当EJB3.0可以使用注释以后,它就变成可有可无的了,但是为了SEAM能知道我们EJB里面的方法并拦截它,因为只有它能拦截我们的方法,才能在我们调用某个方法的时候,为我们注入我们需要的对象.
ejb-jar.xml里面的内容绝大多数情况内容如下:
<?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>

它只是定义了一个拦截器,指定的一个拦截器,拦截此JAR包里面的所有的EJB方法调用.这个千万不能少,否则的话,就不能在我们调用EJB方法之前注入我们需要的对象了.
当然,如果你使用了Entity bean的话,就会有persistence.xml了,它一般是由netbeans自动生成的,关于这个文件就和以前的一样了,不用过多的介绍.
当然,我们还要说说EJB工程里面要引用到的库文件,比如我们的@Name注释和@In和@Out注释,都是SEAM的包里面的.下面是一般要用到的库文件:
jboss-seam.jar   Seam的核心库

其的它就不用了,其实很多库,既可以和WEB的工程目录相关,也可以和EJB的工程目录相关,反正最后是一个Enterprise Application,会把WEB和EJB的工程统一打包成EAR文件的.

关于前面的配置就这些了,其实SEAM的配置也不是很复杂,对于WEB工程来说,只是加了几个XML文件,而对于EJB工程来说,几乎什么都没有加,只是加了一个SEAM的核心库而已.

下一章,我们将用Netbeans开发一个完整的SEAM应用,一个非常简单的SEAM应用,接受注册,以及验证输入.如果验证通过就把输入的内容保存到数据库里面.











尽管千里冰封
依然拥有晴空

你我共同品味JAVA的浓香.
posted on 2008-05-07 14:03 千里冰封 阅读(2947) 评论(2)  编辑  收藏 所属分类: JAVAEENetbeans

FeedBack:
# re: 使用Netbeans开发Seam应用(二)[未登录]
2008-05-19 22:25 | eric
期待下一章  回复  更多评论
  
# re: 使用Netbeans开发Seam应用(二)
2008-09-06 22:11 | 88250
可以不用写ejb-jar.xml的,在Session Beans头注释:
@Interceptors({org.jboss.seam.ejb.SeamInterceptor.class})
就可以了,不过每个Session Bean都要写还是有点麻烦的,: )  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: