翻译:First JBoss Seam tutorial
说明
该文章翻译于《First JBoss Seam tutorial》,原文作者:Sebastian Hennebrueder,翻译者:JavaChen。
原文链接:http://www.laliluna.de/articles/posts/first-jboss-seam.html
一步一步的创建Jboss seam应用
介绍
这篇教程展示如何使用JBoss Seam、JSF和Facelets创建一个应用。我将为Tomcat和JBoss应用服务器列出一个配置。此外,你可以学习如何使用Maven定义依赖。
版本
教程版本:1.0 作者:Sebastian Hennebrueder
包版本
1.Seam 2.0.1.GA
2.Tomcat 6
3.JBoss Application Server 4.2 (not 4.0)
下载
教程PDF:
http://www.laliluna.de/download/first-jboss-seam-en.pdf
项目例子代码
http://www.laliluna.de/download/first-jboss-seam-source.zip
创建项目
使用你喜欢的IDE创建一个web工程。我将使用一个WAR包开发。
Seam配置文件
我们需要下面的配置文件。
components.xml
该文件配置Seam和我们的组件。我更喜欢使用注解配置文档组件而不用这个文件配置,但是在这里我们还是在该文件里定义。
位置:WAR包的WEB-INF目录下,JAR包的META-INF目录下。这里,我们使用的是WAR包。
告诉Seam我们不想让他管理事物(此刻)。
< ?xml version="1.0" encoding="UTF-8"?>
seam.properties
包括一些可以在components.xml使用的设置。除了这,他仅仅是标记告诉Seam一个存档文件(WAR或者JAR)包括Seam组件。所以只需要创建一个空文件。
位置:源文件的根目录下(你的Java classes目录下)。
pages.xml
包括导航规则,可以和JSF的faces-config.xml文件想比较有什么区别,此外我们还可以添加权限规则。
位置:一个WAR工程的 WEB-INF 目录下。
< ?xml version="1.0" encoding="UTF-8"?>
Unexpected error, please try again
faces-config.xml
普通的JavaServer Faces配置文件。Seam的默认渲染器是JavaServer Faces,这就是我们需要这个配置文件的原因。
我们定义默认的和可支持的语言以及资源文件的前缀。
本例子将会使用facelets用于渲染。这就是为什么我们要在该文件中定义facelets视图处理器的原因。
不要在该文件中添加JSF的导航规则,因为Seam会使用pages.xml来导航。
< ?xml version='1.0' encoding='UTF-8'?>
messages
en
en
com.sun.facelets.FaceletViewHandler
web.xml
位置:应该保存于webapp目录下
定义Seam和JSF的特定设置、过滤器和servlet。
< ?xml version="1.0" ?>
org.jboss.seam.servlet.SeamListener
Seam Filter
org.jboss.seam.web.SeamFilter
Seam Filter
/*
facelets.DEVELOPMENT
true
javax.faces.STATE_SAVING_METHOD
client
javax.faces.DEFAULT_SUFFIX
.xhtml
Faces Servlet
javax.faces.webapp.FacesServlet
1
Faces Servlet
*.seam
添加libraries
我们创建了一个配置最小化的JBoss Seam例子。所以libraries中你不必包括Seam Email、Seam PDF等等。
JBoss4.2已经提供了jsf-api和jsf-impl包。所以不用添加他们。当然Tomcat或Jetty需要添加他们。
手动添加
拷贝下面jar文件到WEB-INF目录下。你可以在你下载的JBoss Seam的lib目录下找到他们。
dom4j-1.6.1-jboss.jar
commons-beanutils-1.7.0.jar
hibernate-validator-3.0.0.ga.jar
javassist-3.3.ga.jar
jboss-el-2.0.1.GA.jar
jboss-seam-2.0.1.GA.jar
jboss-seam-ui-2.0.1.GA.jar
jsf-api-1.2_04-p02.jar
jsf-facelets-1.1.11.jar
jsf-impl-1.2_04-p02.jar
jta-1.1.jar
persistence-api-1.0.jar
使用Maven
可选的,你可以使用Maven。我喜欢用他来管理jar包。我们需要一个JBoss仓库。我的IntelliJ工程无意中部署了Maven加载的 el-api.jar。这在Tomcat 6和JBoss 4.2中会产生一个问题。确定该文件没有被部署。
下面是一个我们需要的pom.xml文件
4.0.0
de.laliluna
seamWeb
war
1.0-SNAPSHOT
seamWeb
http://maven.apache.org
seamWeb
org.apache.maven.plugins
maven-compiler-plugin
1.5
1.5
org.apache.maven.plugins
maven-idea-plugin
true
true
repository.jboss.org
http://repository.jboss.org/maven2
true
org.jboss.seam
jboss-seam
2.0.1.GA
compile
org.jboss.seam
jboss-seam-ui
2.0.1.GA
compile
javax.transaction
jta
1.1
javax.persistence
persistence-api
1.0
org.hibernate
hibernate-validator
3.0.0.ga
javax.faces
jsf-api
1.2_04-p02
javax.faces
jsf-impl
1.2_04-p02
com.sun.facelets
jsf-facelets
1.1.11
log4j
log4j
1.2.14
compile
Hello world
在根目录创建一个index.jsp文件。他会将我们重定向到hello页面。
< % response.sendRedirect("hello.seam"); %>
创建一个facelets页面hello.xhtml。
< ?xml version="1.0" encoding="UTF-8"?>
< !DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Welcome to your first Seam application
部署你的应用到Tomcat或者JBoss并且测试该页面。在我的工程中,我使用下面的url:
http://localhost:8080/seamWeb/
编写一个Seam组件
下一步改进hello页面。
我们的应用要处理hedgehogs并且第一件事是打印出hedgehogs 的列表。
package de.laliluna.seam;
public class Hedgehog {
private String name;
public Hedgehog() {
}
public String getName() {
return name;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("Hedgehog");
sb.append("{name='").append(name).append(''');
sb.append('}');
return sb.toString();
}
public void setName(String name) {
this.name = name;
}
public Hedgehog(String name) {
this.name = name;
}
}
创建一个HedgehogService类。他是一个Seam组件。Name注解标记他是个一个组件并定义他的名称。此外,我们可以使用Scope注解定义他将会被放置到哪里的上下文。
我们稍后将会看到我们可以使用名称来引用该组件。我们的服务类为JSF data table提供了一个数据模型-hedgehogs。
package de.laliluna.seam;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.ScopeType;
import java.util.List;
import java.util.ArrayList;
@Name("hedgehogService")
@Scope(ScopeType.SESSION)
public class HedgehogService {
@DataModel
private List hedgehogs;
public HedgehogService() {
hedgehogs = new ArrayList ();
hedgehogs.add(new Hedgehog("Holger"));
hedgehogs.add(new Hedgehog("Pete"));
hedgehogs.add(new Hedgehog("Sebastian"));
}
public String getHello() {
return "Your hedgehogService says hello";
}
}
最后,我们添加一些信息到English资源文件。
在src目录下创建一个messages_en.properties文件。
hello=Welcome to your Seam application
hedgehog.name=Name
改进hello.xhtml文件打印hedgehogs,提示信息来自资源文件和getHello方法。
< ?xml version="1.0" encoding="UTF-8"?>
< !DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
#{messages.hello}
#{hedgehogService.hello}
#{messages['hedgehog.name']}
#{h.name}
这就是所有的,再一次测试你的应用。
调试技巧
当你的应用启动的时候,将会打印所有被创建(Seam和你)的组件和他们所处的上下文。验证你新建的组件是否正确。
Seam有一个调试页面显示一些信息。
添加jboss-seam-debug.jar到WEB-INF目录。可选的,添加下面依赖到pom.xml文件。
org.jboss.seam
jboss-seam-debug
2.0.1.GA
在components.xml中激活调试模式。
打开你的浏览器并输入下面url进入调试页面
http://localhost:8080/seamWeb/debug.seam
添加Hibernate
这一步中我们将会从数据库中加载hedgehogs。
本例中,我将会使用PostgreSQL数据库。想改变数据库,只需要修改 hibernate.cfg.xml的设置并且替换jdbc驱动。
添加libraries
额外的,我们需要添加以下文件
antlr-2.7.6.jar
asm-1.5.3.jar
commons-beanutils-1.7.0.jar
asm-attrs-1.5.3.jar
hibernate-3.2.5.ga.jar
commons-collections-2.1.1.jar
c3p0-0.9.1.2.jar
postgresql-8.2-507.jdbc3.jar
backport-util-concurrent-3.0.jar
commons-logging-1.0.4.jar
hibernate-annotations-3.3.0.ga.jar
hibernate-commons-annotations-3.3.0.ga.jar
ehcache-1.3.0.jar
cglib-2.1_3.jar
jsr107cache-1.0.jar
如果你使用Maven,添加下面依赖
org.hibernate
hibernate
3.2.5.ga
compile
c3p0
c3p0
0.9.1.2
compile
net.sf.ehcache
ehcache
1.3.0
org.hibernate
hibernate-annotations
3.3.0.ga
compile
org.hibernate
hibernate-commons-annotations
3.3.0.ga
postgresql
postgresql
8.2-507.jdbc3
compile
Configuration
我们需要在源代码的根目录下添加一个hibernate.cfg.xml文件。
< ?xml version='1.0' encoding='UTF-8'?>
< !DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
jdbc:postgresql://localhost:5432/learninghibernate
postgres
p
org.postgresql.Driver
org.hibernate.dialect.PostgreSQLDialect
4
1
org.hibernate.cache.EhCacheProvider
org.hibernate.transaction.JDBCTransactionFactory
true
after_statement
update
4
在components.xml中你需要修改事物处理方式。工厂仅仅是为了解决命名问题。我们不能使用session作为名称注入到Hibernate session中,但是我想在我的应用中使用这个组件名称。
代码
我们必须添加加载和保存代码到HedgehogService 类中。
首先,我们需要注入session组件到我们的类中。
然后我们定义Data model有一个工程方法加载hedgehogs。
我改变了Scope的值为conversation 以便我们在创建一个新的hedgehog时候可以重新加载所有hedgehog。
@Name("hedgehogService")
@Scope(ScopeType.CONVERSATION)
public class HedgehogService implements Serializable {
@In
private Session session;
@DataModel
private List hedgehogs;
@Factory("hedgehogs")
public void loadHedgehogs() {
hedgehogs = session.createCriteria(Hedgehog.class).list();
}
public void createHedgehog() {
session.save(new Hedgehog("Name " + new Date()));
}
< ?pre>
Hedgehog类需要Hibernate的注解进行定义。
@Entity
public class Hedgehog implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
// getter and setter are omitted
前端页面
我们改进hello.xhtml页面。我们添加一个链接用于创建一个新的hedgehogs。
Create a hedgehog
No hedgehogs
#{messages['hedgehog.name']}
#{h.name}
结论
使用JBoss Seam创建一个Web应用是非常简单的。虽然该框架被设计于集成JSF和EJB3,我们可以在Tomcat应用服务器中的Pojo类上使用。我们甚至可以获得免费的事物管理。
手动创建一个应用的有点是我们可以仅仅添加需要的jar包而不需要添加整个package包。