上次使用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 ==null) returnnull;
elsereturn 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。
分享到:
相关推荐
jbossseam eclipse安装 例子学习.doc jfreechart flex
java jboss seam jboss-seam-selectitems
JBoss Seam JBoss Seam JBoss Seam
JBoss_Enterprise_Application_Platform-5.0.1-Seam_Reference_Guide-en-US.pdf
JBoss_Seam--中文、Seam教程,中文Seam针对初学者很好的讲解及实例。希望对您有所收获。
JBOSS SEAM组件中文手册 Seam_2.0_Reference_zh_CN
Jboss Seam中文参考手册,通过大量的实例详细介绍seam的使用
整理自jboss seam 中文站,压缩为chm格式,便于广大jboss seam爱好者阅读,所有版权归jboss seam中文站所有。
CJ电子书系列(1) 网上一篇介绍JBoss Seam的好文深入浅出《JBoss Seam》,有人把它翻译成中文,我把它制作成PDF,希望更多的人能够读到更好的java 技术文章。
[TipTec Development] JSF & Facelets & JBoss Seam 核心技术 (英文版) [TipTec Development] Essential JSF, Facelets & JBoss Seam (E-Book) ☆ 出版信息:☆ [作者信息] Kent Ka Iok Tong [出版机构] TipTec ...
jboss seam 参考,英文, seam包内的参考文档
JavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-commonJavaEE源代码 jboss-...
JBoss Seam的简介 入门开发的领路杰作
Seam在JAAS和JBoss规则之上,创建了一个新的基于规则的安全框架。甚至有用来渲染PDF、在线电子邮件和图表及wikitext的JSF标签库。 Seam组件可以同时作为一个Web Service进行调用,异步地从客户端JavaScript或者...
jboss seam 和jsf2 开发好书
Seam 是一种业级 企 Java 的应规用程序框架。它的灵感源自下列原 : 只有一种“工具” Seam为 应 业务业业 义 种统 组 你的 用程序中所有的 定 了一 一的 件模型。 Seam组件可能是 态义 关关 态 有状 的,包含与几...
赠送jar包:jboss-logging-3.3.2.Final.jar; 赠送原API文档:jboss-logging-3.3.2.Final-javadoc.jar; 赠送源代码:jboss-logging-3.3.2.Final-sources.jar; 赠送Maven依赖信息文件:jboss-logging-3.3.2.Final....
jboss -seam 绝对有用教程,
jboss-seam2.0文档.rar,希望大家能够喜欢,谢谢大家的支持,嘿嘿
JBOSS_SEAM配置