GWT 2 Spring 3 JPA 2 Hibernate 3.5 教程(译)
原文:http://www.javacodegeeks.com/2010/05/gwt-2-spring-3-jpa-2-hibernate-35.html(简单 google l 一下,好像还没人翻译,就翻译一下。但水平有限,以意译为主,如果翻译不正确,请帮忙指正)
?
这个入门教材将教你如何实现一个简单的 web 应用程序,这个程序用 Google's Web Toolkit (GWT) 作为前台富客户端,用 spring 作为后台的服务器框架。这个例子将实现对数据库的增删改查,即CRUD (Create Retrieve Update Delete) 的功能。我们将使用以 hibernate 实现的 jpa 作为数据访问层,用 Hypersonic 作为数据库。当然,你也可以通过修改配置来选择你喜欢的数据访问层和数据库。我们将会把这个应用程序部署到 Apache Tomcat 上。
?
我们首选的开发环境是 Eclipse,因此,作为先决条件,你需要有一个安装了 GWT 插件的 Eclipse。关于 GWT plugin for Eclipse 不在我们这个教程的讨论范围内。下面列出开发时需要用到的组件:
- Eclipse 从 这里下载GWT Plugin for Eclipse 在 这里下载Spring 框架从 这里下载Hibernate 持久层从 这里下载Hypersonic 数据库从 这里下载Apache commons-logging 包从 这里下载AOP Alliance (Java/J2EE AOP Standard) 包从 这里下载SLF4J 包从 这里下载Apache log4j 包从 这里下载最后,下载 GWT 与 Spring 集成包 spring4gwt 从 这里下载
在这个教程里,我们的 Eclipse 版本是 Galileo,GWT 版本是 2.0.3,Spring 版本是 3.0.1,Hibernate 版本是 3.5.2,Hypersonic 版本是 1.8.1.2,Apache commons-logging 版本是 1.1.1, AOP Alliance (Java/J2EE AOP Standard) 版本是 1.0,SLF4J 版本是 1.5.8,Apache log4j 版本是 1.2.16,spring4gwt 版本是 0.0.1。
?
嗦了一大堆,现在让我们开始吧!
- 建立一个新的 GWT 工程,点击 File → New Web Application Project我们将我们的工程命名为 GWTSpring。基本的包名是 com.javacodegeeks.gwtspring。因为我们仅仅使用了 Google Web Toolkit,因此在工程向导窗口中不要选择“Use Google App Engine”。
现在我们简单介绍一下这个工程的目录结构:
- /src 文件夹中包含了这个程序的全部的源文件
{包名}.client 子包,包含了全部仅在客户端使用的源文件{包名}.server 子包,包含了全部仅在服务器端使用的源文件{包名}.shared 子包,包含了全部的同时在客户端和服务器端都使用的源文件/test 文件夹包含了全部的单元测试源文件/war 文件夹包含了建立一个web应用而必须包含的基本文件
为了正确地集成 Spring 和 GWT,我们必须为web工程提供全部的必须的库文件。因此,复制下面列表中的文件到 web 工程的 /war/WEB-INF/lib 目录下(如果你使用不同的版本,请复制相应版本的文件)
?
从 Spring 中复制:
/dist/org.springframework.expression-3.0.1.RELEASE-A.jar/dist/org.springframework.beans-3.0.1.RELEASE-A.jar/dist/org.springframework.oxm-3.0.1.RELEASE-A.jar/dist/org.springframework.jms-3.0.1.RELEASE-A.jar/dist/org.springframework.jdbc-3.0.1.RELEASE-A.jar/dist/org.springframework.core-3.0.1.RELEASE-A.jar/dist/org.springframework.context-3.0.1.RELEASE-A.jar/dist/org.springframework.asm-3.0.1.RELEASE-A.jar/dist/org.springframework.aspects-3.0.1.RELEASE-A.jar/dist/org.springframework.transaction-3.0.1.RELEASE-A.jar/dist/org.springframework.context.support-3.0.1.RELEASE-A.jar/dist/org.springframework.aop-3.0.1.RELEASE-A.jar/dist/org.springframework.orm-3.0.1.RELEASE-A.jar/dist/org.springframework.instrument-3.0.1.RELEASE-A.jar/dist/org.springframework.instrument.tomcat-3.0.1.RELEASE-A.jar/dist/org.springframework.test-3.0.1.RELEASE-A.jar/dist/org.springframework.web-3.0.1.RELEASE-A.jar/dist/org.springframework.web.portlet-3.0.1.RELEASE-A.jar/dist/org.springframework.web.servlet-3.0.1.RELEASE-A.jar/dist/org.springframework.web.struts-3.0.1.RELEASE-A.jar从 Hibernate 中复制:
hibernate3.jar/lib/required/antlr-2.7.6.jar/lib/required/commons-collections-3.1.jar/lib/required/dom4j-1.6.1.jar/lib/required/javassist-3.9.0.GA.jar/lib/required/jta-1.1.jar/lib/required/slf4j-api-1.5.8.jar/lib/jpa/hibernate-jpa-2.0-api-1.0.0.Final.jar/lib/optional/c3p0/c3p0-0.9.1.jar从 Hypersonic 中复制:
/lib/hsqldb.jar从 Apache Commons Logging 中复制:
commons-logging-1.1.1.jar从 AOP Alliance (Java/J2EE AOP Standard) 中复制:
aopalliance.jar从 SLF4J 中复制:
slf4j-log4j12-1.5.8.jar从 Apache log4j 中复制:
log4j-1.2.16.jar从 sping4gwt 中复制:
spring4gwt-0.0.1.jar我们要注意我们 Eclipse 工程的依赖库. 下列的 jar 库将被包含到工程的构建路径中:
hibernate-jpa-2.0-api-1.0.0.Final.jarorg.springframework.beans-3.0.1.RELEASE-A.jarorg.springframework.context-3.0.1.RELEASE-A.jarorg.springframework.core-3.0.1.RELEASE-A.jarorg.springframework.orm-3.0.1.RELEASE-A.jarorg.springframework.transaction-3.0.1.RELEASE-A.jar下一步是对web工程进行配置,使得web工程启动时把 Spring 容器加载进来,同时也使得 spring4gwt 的客户端和服务器端能正常地通讯,客户端发出远程调用能正确地传递给服务器端的 Spring 服务。
?
打开在 /war/WEB-INF 下的 web.xml 文件并添加下列内容:
?
配置服务器启动时加载 Spring 容器
?
这里需要注意的是:如果你要把这个应用程序发布到一个提供 JTA 事务的 J2EE 应用服务器里,如 JBoss ,或者使用其他的数据库,如 Oracle, MySQL 等,请参考 《JBoss Spring JPA Hibernate 教程》 里的配置文件。
?
现在让我们开始建立用于 Spring 容器的配置文件 applicationContext.xml。这个文件建立到 /war/WEB-INF 目录下。下面是一个 applicationContext.xml 的例子:
?
这里有几点需要注意的:
把 context:component-scan 元素的属性 base-package 的属性值改成你自己项目的基本包名,这样 Spring 的组件就可以被容器注入进来(services、DAOs 等)。修改 entityManagerFactory bean 的属性值为你在 persistence.xml 里定义的 persistence-unit 元素的名字。如果你要把这个应用程序发布到一个提供 JTA 事务的 J2EE 应用服务器里,如 JBoss ,或者使用其他的数据库,如 Oracle, MySQL 等,请参考 《JBoss Spring JPA Hibernate 教程》 里的配置文件。
接下来,我们将介绍用于传送服务器与客户端之间的数据的数据传输对象(DTO),这种对象被用来访问数据库,并被 Spring 服务用它把数据传输给 GWT web 客户端来显示。
?
DTO 是能够同时被用于服务器和客户端的对象,因此你应该在 “shared” 包里建立一个 “dto” 子包,并把 DTO 对象放在这里。下面我们将建立一个包含了雇员信息的 EmployeeDTO 对象:
?
?
最后,我们将建立为 GWT 客户端访问的服务接口与实现类。这个服务接口将会被服务器端和客户端同时访问,因此我们把它放到我们工程的 “shared” 子包下。现在建立一个 “services” 子包,并准备在里面放置服务接口类。下面是该接口的例子代码:
终于完成了!但我们还将要开发 GWT 用户接口来访问我们的 Spring 服务。 尽管事实上 GWT 的用户接口开发不属于我们这个教程的讨论范围,但我们还是提供了一个基本的用户接口来展示这些如何调用这些 Spring 服务。
先定位到你的 GWT 应用程序的入口点。这个文件应该这样命名:{工程名}.java,在我们这个程序里是 GWTSpring.java,并把它放到 “client” 子包下或我们的主包下,以下是这个类的代码:?
正如你所见到的那样,对于客户端来说,调用 Spring 服务就像调用传统的 GWT 服务那样调用。
最后,打开你工程的 web 主文件。这个文件应该象{工程名}.html 这样来命名,在我们这里的命名是 GWTSpring.html,并把这个文件放到 /war 目录下。下面是这个文件的代码?
要编译这个应用,右键点击工程名并选择 Run As → Compile GWT Application。
要发布这个应用,只需复制这个 /war 目录到 Apache Tomcat 的 “webapps” 目录下。你可以修改 war 这个目录名为你喜欢的任何名字,最好是把它命名为这个工程的名字,例如 GWTSpring。
在浏览器地址栏输入以下地址即可浏览这个应用:
http://localhost:8080/GWTSpring/
如果一切正常的话,你就可以看到这个应用的 web主页了,里面有两个文本框,每个文本框后面有一个按钮。在第一给文本框中,你可以保存或更新职员数据倒数据库中。录入一个 id、名字、姓氏和一个工作的描述,用一个空白符来分开。点击 “SaveOrUpdate” 按钮,提供的数据库就将被保存到数据库中。对应已经存在的职员数据(相同的 id),将会执行更新。第二个文本框用于查询存在的职员数据。输入一个职员的 id 并点击 “Retrieve” 按钮,如果这个职员存在的话,你就可以看到这个职员的 id、名字、姓氏和工作描述。
哦,这真是一个大的教程!
你可以从 here 下载这个应用,前面所说的第三方库并没用包含在里面。
希望你喜欢这个教程。
Justin?
译者注:这是我第一次翻译外文技术文章。让我感触较深的是,自己看懂这篇文章容易,但要翻译起来却要花费很多的时间。往往原文的一句话要翻译出来,必须对这句话进行多遍的阅读,并在阅读的过程中慢慢组织成我们的语言。但最后翻译完成后,还是有很多地方感觉很生涩。不得已,还把少量的不影响阅读和理解的段落进行了简化,如关于事务的介绍部分。如果你需要了解更多,或觉得这篇文章难以理解,请阅读原文,或给我留言,也欢迎您把我翻译错误的地方指出来。
?
而促使我翻译这篇文章的动机是,前些日子里,我在思考,为什么我的生活总过得很窘迫?(通俗点说就是为什么我总是没钱?)以一个程序员的思维,我反过来问自己,我凭什么有钱?我相信这个世界有一个真理,就是要有收获,就必须有付出。那么,我付出了什么?我付出了很多的时间去学习?但我为这个世界做了什么?为家人、为朋友、为认识和不认识的人做了什么?我答不上来。相反地,在思考过程中,我觉得我从这个世界里,获得了很多我想要的东西,比如知识、亲情、友情、爱情、食物、工作等等。那么,不管如何,我是不是该做点什么,不是为了自己,而是为别人而做的事情?我想,是的,我要为别人做点事,做点简单的事,做点力所能及的事。不为钱财名誉,不为个人利益,只为反哺这个世界。于是,就是有了这篇文章。感谢你阅读这篇文章,希望能给你一点帮助。当然,如果你愿意,希望你也能为这个世界的做点自己力所能及的事。谢谢。
1 楼 ccx410 2011-12-19 安装gwt报错,unable to retrieve osgi.bundle,com.google.gwt.eclipse.sdkbundle如何解决 2 楼 lqixv 2011-12-20 对于 gwt ,我没用过,也没打算用。我只关注了除了 gwt 外的前面的部分。所以,对于 gwt 我也没办法给你任何建议。 3 楼 Jack1488 2012-02-08 lqixv,您好,我仔细阅读了您的文章,写的非常不错,我已经实验了。
Sending request to the server:
3
Server replies:
Employee Information Id : 3 Name : jack Surname : yang Job Title : hello1
最为感动的是一下这段话:而促使我翻译这篇文章的动机是,前些日子里,我在思考,为什么我的生活总过得很窘迫?(通俗点说就是为什么我总是没钱?)以一个程序员的思维,我反过来问自己,我凭什么有钱?我相信这个世界有一个真理,就是要有收获,就必须有付出。那么,我付出了什么?我付出了很多的时间去学习?但我为这个世界做了什么?为家人、为朋友、为认识和不认识的人做了什么?我答不上来。相反地,在思考过程中,我觉得我从这个世界里,获得了很多我想要的东西,比如知识、亲情、友情、爱情、食物、工作等等。那么,不管如何,我是不是该做点什么,不是为了自己,而是为别人而做的事情?我想,是的,我要为别人做点事,做点简单的事,做点力所能及的事。不为钱财名誉,不为个人利益,只为反哺这个世界。于是,就是有了这篇文章。感谢你阅读这篇文章,希望能给你一点帮助。当然,如果你愿意,希望你也能为这个世界的做点自己力所能及的事。谢谢。
总之,谢谢您,向您学习。