随笔-75  评论-193  文章-5  trackbacks-0

    上次使用Seam自动生成了一个CRUD的例子,后来想还是自己白手起家做一个例子看看,于是开始动手。

    首先使用JBossTools工具生成项目,在生成项目的向导中,如果项目类型选择ear,则会生成四个项目,分别对应war、ear、ejb、test,觉得这样太过繁琐,还是选择war类型,又想要不使用tomcat作为运行服务器吧,因为JBoss也不太熟悉。没想到这一试倒试出问题来了,如果完全使用向导生成项目,选择tomcat作为运行服务器,则项目根本无法运行起来,总是提示缺少这个jar,那个jar。好,又换回JBoss,没问题了。仔细看了一下,原来在自动生成项目的WebContent/WEB-INF/lib目录中,只有大概十几个jar,连Hibernate的jar都没有,而在JBoss的Server/default/lib目录下则什么jar都有,怪不得不出错。

第一个教训:还是先使用JBoss作为运行环境,等整个Seam都搞熟了,再配一个Tomcat的运行环境。

    继续,将原来项目中的一个通用DAO和一个UserService拷贝过来,代码如下,启动服务器报错。分别为如下错误信息:

第二个错误解决:Caused by: java.lang.IllegalArgumentException: @PersistenceContext may only be used on session bean or message driven bean components: genericDao

    既然提示@PersistenceContext只能用在SessionBean中,因为原来的代码是使用的Spring框架,想了好长时间,在WebContent/WEB-INF/component.xml中看到这么一段,那么是不是通过@In来注入entityManager呢,修改@PersistenceContext为@In,编辑器自动提示没有发现名称为em的Component(这点好像不错),于是再修改为@In("entityManager") ,重启服务器,该问题解决。

<persistence:managed-persistence-context name="entityManager" auto-create="true" entity-manager-factory="#{testEntityManagerFactory}"/>

第三个错误解决:Caused by org.jboss.seam.RequiredException with message: "@In attribute requires non-null value: userService.genericDao"

    将UserService中的@In修改为@In(create = true, required = true)解决此问题。

    解决上述几个问题后,自己的例子终于运行起来了 :-)

    下一篇关于Seam In Action中对JSF的介绍及Seam如何增强JSF。

-------------------------------------------------------------------------------------------------

    项目生成的代码被分为两个目录,分别为Action和Model目录,检查JBoss中项目部署的目录,发觉Action目录下的代码编译生成的class文件被存放至WEB-INF/dev目录下,Model目录下的代码编译生成的class文件被存放至WEB-INF/classes目录下,google了一下,发现在Seam Reference中提到这是Seam的增量式重部署,支持对JavaBean组件的增量重部署,可以加快编辑/编译/测试的速度。

代码如下:

public interface GenericDao {
    public Object get(Class clazz, Serializable id);
    public
void save(Object object);
    public
void update(Object object);
    public
void remove(Class clazz, Serializable id);
    public
void remove(Object obj);
   
}


@Name("genericDao")
public class GenericDaoImpl implements GenericDao {
    @PersistenceContext 
---->   @In("entityManager")
    private EntityManager em;

    public Object get(Class clazz, Serializable id) {
       
if (id == nullreturn null;
       
else return em.find(clazz, id);
    }
   
}


public interface UserService {
    public
void findAllUsers();
}

@Name(
"userService")
public class UserServiceImpl implements UserService, SecurityUserService {

    @In
----> @In(create = true, required = true)
    protected GenericDao genericDao;
    private List
<User> resultList = null;

    public List
<User> getResultList() {
       
if (resultList == null) {
           
this.findAllUsers();
        }
       
return resultList;
    }

    public
void setResultList(List<User> resultList) {
       
this.resultList = resultList;
    }


    public
void findAllUsers() {
        String hql
= "from User order by userCode";
        resultList
= this.genericDao.query(hql);
    }
}

// 实体类
@Entity
@Table(name = "USER")
public class User implements IUser, Serializable {
    // 用户编码
    @Id
    private String userCode;

    // 用户姓名
    private String userName;
}


<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:s
="http://jboss.com/products/seam/taglib"
    xmlns:ui
="http://java.sun.com/jsf/facelets"
    xmlns:f
="http://java.sun.com/jsf/core"
    xmlns:h
="http://java.sun.com/jsf/html"
    xmlns:rich
="http://richfaces.org/rich"
    template
="layout/template.xhtml">

<ui:define name="body">
   
<rich:panel>
       
<f:facet name="header">User Search Results</f:facet>
       
<rich:dataTable id="userServiceTable"
                   
var="user"
                  value
="#{userService.resultList}">
           
<h:column>
               
<f:facet name="header">
                   
<h:outputText value="UserCode"/>
               
</f:facet>
               
<h:outputText value="#{user.userCode}"/>
           
</h:column>
           
<h:column>
               
<f:facet name="header">
                   
<h:outputText value="UserName"/>
               
</f:facet>
               
<h:outputText value="#{user.userName}"/>
           
</h:column>
       
</rich:dataTable>
      
</rich:panel>
</ui:define>
</ui:composition>

通过这个实践,小结一下:

1、发觉Seam确实简化了JSF开发,但由于它涉及的新东西相对较多,与传统的SSH走的路线不太一致,还是觉得其学习曲线比较陡峭,需要对Seam熟练掌握后(包括开发环境的搭建等)才能真正提高开发效率。

2、Seam提供了IOC的功能,有时需要跳出Spring,从一个新的角度去审视Seam。

posted on 2008-12-18 23:46 The Matrix 阅读(2151) 评论(0)  编辑  收藏 所属分类: JBoss Seam/JSF

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


网站导航: