作者:Chris
翻译:ShiningRay @ Nirvana Studio
0. 前言
在Trails的首页上有一段Trails的指导视频,它比本文说得更为详细。你可以看看它,另外根据Firebird设置一节中的内容,设置一下和Firebird相关的东西。
1. 什么是Trails?
Trails是一个领域驱动开发框架,它使用了Hibernate、Spring和Tapestry。其中,Hibernate 被用作数据访问层,Tapestry用来给用户显示数据。而Spring 则是把Hibernate和Tapestry连接在一起。
Trails自带了几乎所以必需的jar文件——你只需要安装一下Firebird的数据库驱动,它可以在 http://firebirdsql.sf.net上下载。
1.1 Hibernate
Hibernate是一个O/RM工具。O/RM的意思是:对象关系映射。O/RM可以让你把 java 对象映射到后台数据库中。Hibernate使用了XDoclet来指明映射信息所需的信息,以便在数据库中存储复杂的对象。而XDoclet使用了javadoc注释来告诉Hibernate如何映射对象。例如:
[code lang=”java”]/**
* @hibernate.class table=”PERSON”
*/
public class Person {
}
[/code]
这段代码会告诉Hibernate要将一个指定的对象(在这里是Person)映射到PERSON表。
Hibernate 的主页是:www.hibernate.org.
1.2 Tapestry
Tapestry 是(简而言之)一个Web框架。更确切地说,Taspetry是一个基于组件的Web框架,它将表示和逻辑清晰地分离开来了。
在Tapestry中,一个页面和一个.html文件相关,这个文件负责这个页面的外观,和一个Java类,它负责对.html文件提供数据,还有一个.
page或者是一个.jwc文件(这由你是要作为一个真正的页面还是一个单独的组件),这两个负责把前两个层次连接起来。
组件是通过ognl语言来访问的,形式如:
1 |
<a href="#" jwcid="@PageLink" page="myPage">Goto MyPage</a><br/> |
jwcid 指明了使用的组件——这里是一个PageLink,它是一个HTML表现中的<a></a>标签的一个组件。page属性指明了你要链接的页面的名称。
Tapestry 的主页在jakarta.apache.org/tapestry
2. 安装Trails。
首先从trails.dev.java.net下载Trails.
当前的版本是0.5.1。先把下载的文件解压缩(在https://trails.dev.java.net上有一个很棒的演示,教你如何利用Trails来写应用程序)。
解压缩trails,并进入新建的文件夹。更改build.properties文件以匹配你的tomcat路径,
然后做以下这些事情:
通过运行下面的指令来创建trail.jar(我在我的机器上必须这样做)
1 |
#> ant jar<br/> |
3. 写一个新的应用程序
3.1 创建一个新的trail应用:
1 |
#> ant create-project<br/> |
这是在问你,把工程的根目录放在哪里(在MacOS X上我输入的是/Users/chris/Desktop/projects——Windows用户可能要输入诸如c:\path\to\new\project的路径)
输入工程名称
然后,一个目录包括所有必须的jar文件就被创建好了。
3.2 启动
3.3 创建一个新的 “Java Project”
- 输入工程名称
- 选择 “Create project at external location”(在外部位置创建工程) 并指向新创建的文件夹。
- 点击 “next”
- 点击 “add folders”
- 选择 “src”,然后点击OK
- 点击 “finish”
新创建的工程就会被导入到Eclipse中。
4. 设置
4.1 改变tomcat的主目录
- 打开Eclipse中的open build.properties 文件并将tomcat.home改称你的tomcat的目录。
4.2 更改数据库驱动:
- 打开文件 context/WEB-INF/hibernate.properties 并把其中的设置改为::
1 |
hibernate.dialect=net.sf.hibernate.dialect.FirebirdDialect<br/><br/>hibernate.show_sql=true<br/>hibernate.hbm2ddl.auto=update<br/>hibernate.connection.driver_class=org.firebirdsql.jdbc.FBDriver<br/>hibernate.connection.url=jdbc:firebirdsql:127.0.0.1:myapplication<br/>hibernate.connection.username=sysdba<br/>hibernate.connection.password=masterkey<br/> |
4.3 在主机上创建一个新数据库(这里是127.0.0.1)
1 |
#>isql -user sysdba -password masterkey<br/>#>create database '127.0.0.1:/path/to/mydatabase.fdb';<br/>#>commit;<br/>#>exit;<br/> |
并且在 FIREBIRD_HOME/aliases.conf 中添加一个别名,这样写:
1 |
myapplication = /path/to/mydatabase.fdb<br/> |
在生产系统中,你还要为以后要连接的用户更改用户名和密码 :-)
4.4 安装Firebird数据库驱动
从firebird.sf.net下载Firebird的JCA-JDBC驱动,解压缩并把jar文件安装到CATALINE_HOME/common/lib下(详细内容参见 JayBird FAQ)。
5. 开始编码
5.1 创建一个领域对象(Domain Object)
领域对象可以简单地说成是POJO(Plain Old Java Objects),它是Hibernate用来在数据库中存放数据的。
- 在Eclipse中选择src文件夹并点击 File -> New -> Class(文件->新建->类)
- 输入一个包名(de.test.data)
- 在Name输入框中输入类名:Person
- 点击 “finish”
成功新建并打开了一个类。
5.2 告诉Hibernate要使用的表格:
把表格名称作为XDoclet的hibernate.classabove标签添加到类的说明中。XDoclet任务以 @ 符号开始,后面跟着一个名空间(在这里是hibernate)和一个动作,指明要做什么(更多信息参见hibernate.sf.net)。
XDoclet标签 @hibernate.class table=”PERSON” 将告诉Hibernate把这个对象中的数据存储在一个叫做PERSON的表中。
表格的名称无需和类名相匹配——你也可以指定一个MY_PERSON作为名称 :-)。
5.3 创建属性:
- 先输入以下内容:
1 |
public class Person {<br/> private Integer PersonID;<br/> private String Name;<br/> private String SurName;<br/> private LSalutation Salutaion;<br/><br/>}<br/> |
- 在“Outline”(大纲)中选择PersonID并右键点击它。
- 选择Source -> Generate Getters and Setters
- 两个都选中并点击OK
现在已经有了getter和setter例程,而且已经添加了注释。然后我们添加下面的注释:
1 |
* @hibernate.id generator-class="sequence" column="PERSON_ID"<br/> * @hibernate.generator-param name="sequence" value="SQ_PERSON_ID" |
这将告诉Hibernate使用表格的PERSON_ID列来存储表格的主键,同时通过使用一个生成器来自动新建这个字段的值。
键将由SQ_PERSON_ID生成器来生成。
在大纲中选择name并且右键点击它(选择 source
-> generate getters and setters,选择Name和SurName然后点OK :-) )
这次,我们不再需要主键——我们仅仅需要一个字段来存放姓名。所以我们继续并添加以下javadoc注释:
[code lang=”java”] /**
* @hibernate.property column=”LAST_NAME” not-null=”true”
*/
public String getName() {
return Name;
}
[/code]
以及surname属性
1 |
/**<br/> * @return Liefert den surName zurueck.<br/> * @hibernate.property<br/> */<br/> public String getSurName() {<br/> return SurName;<br/> }<br/> /**<br/> * @param surName The surName to set.<br/> */<br/> public void setSurName(String surName) {<br/> SurName = surName;<br/> }<br/> |
由名称属性而来的getter上的列是必须出现的,因为我们要覆盖默认的行为。Hibernate会假设一个叫“NAME”的字段——但这在Firebird中是一个关键字,所以我们必须另外选择一个名称。
记住:Hibernate标记必须总是设置在getter上——而不是setter。
如果需要,我们可以通过在Hibernate的XDoclet标记中添加not-null=”true”属性来设置一个null值——默认值为false。
5.4 创建查询表
现在提示有一个错误——是LSalutation。
这时把你的鼠标移到LSaltutation上并且按下Ctrl+1(在Apple Macintosh上你要按Command + 1)。然后会出现以下对话框:
输入要创建的文件的包名,点击“finish”,然后做以下几步动作:
- 给他一个ID
- 个它一个名称
- 生成getter和setter
- 并且指明给表格设置的类名,以及ID和属性字段
1 |
package de.test.data;<br/><br/>/**<br/> * @author chris<br/> *<br/> * @hibernate.class table="SALUTATION"<br/> */<br/>public class LSalutation {<br/> private Integer SalutaionID; <br/> private String Salutation;<br/> /**<br/> * @return Liefert den salutaionID zurueck.<br/> * @hibernate.id generator-class="sequence" column="SALUTATION_ID"<br/> * @hibernate.generator-param name="sequence" value="SQ_SALUTATION_ID"<br/> */<br/> public Integer getSalutaionID() {<br/> return SalutaionID;<br/> }<br/> /**<br/> * @param salutaionID The salutaionID to set.<br/> */<br/> public void setSalutaionID(Integer salutaionID) {<br/> SalutaionID = salutaionID;<br/> }<br/> /**<br/> * @return Liefert den salutation zurueck.<br/> * @hibernate.property not-null="true"<br/> */<br/> public String getSalutation() {<br/> return Salutation;<br/> }<br/> /**<br/> * @param salutation The salutation to set.<br/> */<br/> public void setSalutation(String salutation) {<br/> Salutation = salutation;<br/> }<br/>}<br/><br/> |
现在,又是另一个对象可以被Hibernate映射了。对于Hibernate,这已经可以用了,但对于Trails,还少个东西:
- 一个 equals() 和一个 toString() 方法
toString() 方法是用来在列表视图中能正确显示属性,而equals方法是用来标示对象的。所以只要添加以下代码到LSalutation类中:
1 |
public boolean equals(Object obj){<br/> return ((LSalutation)obj).getSalutationId().equals(getSalutationId());<br/> }<br/><br/> public String toString(){<br/> return getSalutation();<br/> }<br/> |
返回到Person.java中并且为Saltuation属性创建getter和setter。
由于我们要给salutations使用另一个表中的数据,所以这里我们要用另一个属性。所以这里我们要用一个多对一的关系。也就是,我们要把javadoc注释改成:
1 |
/**<br/> * @return Liefert den salutaion zurueck.<br/> * @hibernate.many-to-one column="SALUTATION_ID"<br/> */<br/> public LSalutation getSalutaion() {<br/> return Salutaion;<br/> }<br/> |
现在Hibernate已经了解如何引用salutation类了。
这就是我们要写的全部代码了。 :-)
6. 构建应用程序:
打开build.xml文件,右件点击war目标并选择 ant -> build
这将调用ant来构建.war文件(Trails的指南说,使用deploy目标可以部署程序——这不能在我的机器上运行)。然后我把project.war文件复制到TOMCAT_HOME/webapps中去。
7. 访问应用程序:
打开浏览器并输入127.0.0.1:8080/project_name
现在,享受一下浏览和输入数据的乐趣吧 :-)
无任何担保——Chris