整理: MyEclipse 5.5 实战教程(持续更新,转帖)

来源:互联网 发布:网络广告公司 编辑:程序博客网 时间:2024/06/06 14:09

引用自:BeanSoft's Java Blog
http://www.blogjava.net/beansoft/archive/2007/09/04/142716.html

 

此贴乃是将以前所发的几个零散的短文以及视频整理在一块, 便于学习用. 本文将不断更新, 并对格式进行美化.

启航 - 第一次接触 MyEclipse

MyEclipse + Tomcat 开发视频: 下载,安装,配置,开发并运行Web项目

 

基础开发: JSP, Swing

河南话讲解 MyEclipse + Tomcat Servlet 开发入门视频

Video with speech: Using MyEclipse to Develop Swing Applications 

UML 开发

MyEclipse UML 入门视频2 - 根据代码反向工程生成 UML

MyEclipse UML 入门视频

轻量级开源框架: SSH 应用开发

MyEclipse Hibernate 快速入门中文版

用 MyEclipse 2 分钟开发一个 Hibernate 应用的步骤

用 MyEclipse, 就有必要把 MyEclipse 快速开发的功能熟悉一下. 当我们熟悉了基本的开发过程之后, 就需要考虑用顺手的 IDE 来让我们的开发速度有个飞跃了.

这次讨论的主题包括: Hibernate 快速开发, Spring 快速开发, Struts 登录应用开发, UML 建模, 可视化Swing界面开发这些个内容.

首先就是大家可以看 MyEclipse 的帮助文档进行学习了, 里面很全, 图文并茂, 唯一缺点呢就是文档是英文的. 具体方法:
菜单 Help -> Help Contents, 然后会在浏览器里打开 MyEclipse 帮助文档, 展开左边的 MyEclipse Learning Center, 就能看到详细的开发教程了. 其中 "JEE Application Development" 的部分是我们重点关注的内容.

使用的开发工具是 MyEclipse 5.5.1 GA,  Windows/Linux 版本均可.

好了, 现在简单介绍一下 用 MyEclipse 2 分钟开发一个 Hibernate 应用的步骤.
1. 在 MyEclipse 视图下的 Servers 面板上, 启动 MyEclipse Derby 这个服务器. 相信大家都很熟悉这个过程了.
2. 选择菜单 Window -> Open Persipective -> MyEclipse Database Explorer, 打开新的数据库浏览视图.
3. 在最左边的 DB Browser 面板下选中 MyEclipse Derby 项, 点击右键并选择弹出菜单中的菜单项 Open Connection 来打开数据库连接并显示所有的数据库和表格.
4. 展开 MyEclipse Derby  节点, 单击选中第一项 Connected to MyEclipse Derby, 点击右键并选择弹出菜单中的菜单项 New SQL Editor.
5. 在 SQL 编辑器里键入下列建表语句:

createtable testUser(id intnotnull,username varchar(200),age int,primarykey ("ID"))


, 然后点击编辑器上面的绿色的运行向右箭头按钮来创建表格.
6. 新建一个 Java Project 名字为 MyHibernateTest, 这个过程无需赘述了, 建议建项目的时候将 src 目录和 bin(或者classes)目录分开, 另外提示你切换透视图的时候一定要切换过去到 Java 透视图, 此时默认会在 Package Explorer 中选中刚才已经建好的 Java Project, 但是背景为灰色.
7. 首先单击一下左边的 Package Explorer 中新建的 MyHibernateTest 项目来使其高亮选中, 接着点击菜单项 MyEclipse -> Add Hibernate Capabilities..., 接着会弹出对话框 New Hibernate Project 提示你设置当前项目的 Hibernate 属性.
对话框的第一页选择 Hibernate 3.1, 其它保持默认;
第二页同样如此, 保持默认来创建新的 Hibernate 配置文件;
第三页Specify Hibernate database connection details则点击 DB Driver 下拉框选择 MyEclipse Derby, 这时候下面的输入框会自动填好数据库连接对应的值.
第四页 Define SessionFactory properties 则先点击 Java Package 一行最右侧的 New... 按钮来新建一个名字为 dao 的包. 这时候你可以看到 Finish 按钮终于不为灰色了,  点击它完成给项目加入 Hibernate 开发功能的操作, 包括 Hibernate 类库, jdbc 驱动和 Hibernate 配置文件都已经设置完毕了.
8. 选择菜单 Window -> Open Persipective -> MyEclipse Database Explorer, 打开数据库浏览视图. 展开 Connected to MyEclipse Derby 下面的 APP 节点, 再选中下面的 TABLE 目录,   点击右键并选择弹出菜单中的菜单项 Refresh 来刷新数据库表格列表, 这时候展开此节点可以看到下面出现了一个名为 TESTUSER 的表.
9. OK, 最关键的操作即将开始了. 请在 TESTUSER 节点上点击右键并选择弹出菜单中的菜单项 Hibernate Reverse Engineering..., 弹出一个对话框提示你 Save All Modified Resources, 点击 OK 并且选中 MyHibernateTest, 在 File name 右侧的文件名输入框中输入 create.sql 来保存我们最开始所写的那个建表的 SQL 文件.
10. 接着 Hibernate Reverse Engineering 对话框弹出了.
点击 Java src folder 一行最右侧的 Browser.. 按钮来选择源码目录,  并把下面的 Java package 右侧的输入框中输入包名 dao, 我们选择 /MyHibernateTest/src 目录并点击完成,  接着选中下面的三个复选框:
[x] Hibernate mapping file (*.hbm.xml) for each database table
[x] Java Data Object (POJO <> DB Table)
[x] Java Data Access Object (DAO) (Hibernate 3 only)

好了, 点击 Finish 按钮, 就可以看到反向工程的忙碌对话框. 最后当一切结束后弹出对话框提示切换视图到 MyEclipse Hibernate perspective 的时候点击 "OK" 按钮, 您就可以看到工作成果了, 包括下列文件:
HibernateSessionFactory.java
Testuser.hbm.xml
BaseHibernateDAO.java
IBaseHibernateDAO.java
Testuser.java
TestuserDAO.java
hibernate.cfg.xml
. 那么, 我们的 POJO 已经生成了, 就是 Testuser.java,  DAO 的代码也已经生成, 就是 TestuserDAO, 这些代码都已经帮我们写好, 当然我们可以做进一步的修改来适应我们的要求. 当你用工具生成代码的时候, 请确保您已经了解了 Hibernate 手工开发的步骤. 好了, 接下来的事情, 我们就可以
11. 修改 Testuser.hbm.xml 里面的主键生成方式为合适的方式(默认的是 <generator class="assigned" />),  或者一些属性映射关系, 这些仍然要求开发人员对 Hibernate 的配置文件有一定的了解;
或者
12. 继续重复 1, 3, 5, 8, 9, 10 来生成更多的 POJO 或者 DAO.
13. 编写测试代码来运行测试.

小结: 虽然这些步骤很繁琐,  但是当你熟练之后完全可以在2分钟内完成所有操作, 这样就省去了手工编写大量 Java 代码和 XML 配置文件的痛苦, 这也是实际中程序员采取的偷懒的步骤.
前提: 您一定要理解 Hibernate 手工开发的步骤和 JDBC 驱动的概念, 否则生成的文件有时候是有潜在的问题的, 工具只能帮你完成部分工作, 不能完成全部工作.

更多提示: 当你执行 第 9 步的时候, 还可以看到弹出的菜单中有 JPA 和 EJB 3 反向工程的选项, 这个就留给大家做练习了, 同样也能生成类似的 JPA 或者 EJB  3 实体类, 当然您实现要建好支持 JPA 或者 EJB 的项目.

如果能上网, 建议去看 MyEclipse 官方网站的操作动画:
Introduction to Hibernate Tutorial
http://www.myeclipseide.com/images/tutorials/quickstarts/introduction_to_hibernate/tutorial.html

相关的操作视频可以看这里: 用MyEclipse 4 分钟开发Spring整合Hibernate应用的视频

其它参考资料:
Hibernate 英文 PPT 及 MyEclipse 操作视频整理
推荐一点 MyEclipse 的官方Spring,Hibernate入门视频教程

有任何问题欢迎联系 beansoft@126.com  讨论.

 

用 MyEclipse 开发 Spring 入门操作

今天介绍的第二个课题就是介绍 Spring 的快速开发, 说是快速开发, 其实能帮助的地方除了语法高亮和自动添加类库外也没多少东西了.

1. 新建普通 Java 项目 MySpringTest. 这个过程无需赘述了, 建议建项目的时候将 src 目录和 bin(或者classes)目录分开, 另外提示你切换透视图的时候一定要切换过去到 Java 透视图, 此时默认会在 Package Explorer 中选中刚才已经建好的 Java Project, 但是背景为灰色.
2. 首先单击一下左边的 Package Explorer 中新建的 MySpringTest 项目来使其高亮选中, 接着点击菜单项 MyEclipse -> Add Spring Capabilities..., 接着会弹出对话框 Add Spring Capabilities 提示你设置当前项目的 Spring 属性.
对话框的第一页可以选择全部的 Spring 框架, 这是最保险的做法, 不过我们的例子只需要选中Spring 2.0 Core Libraries 就可以了. 点击 "Next" 继续.
第二页是 Add Spring bean configuration file. 保持默认值不变就可以了. 最后点击 Finish.
3. Spring 的开发没法自动生成 Bean, 这里大家只好手工来写了, 也很简单. 分别复制下面的三个代码, 然后在 MyEclipse src 目录上点击右键后选择菜单项 Paste 就可以生成 Java 类文件了.

publicinterface Action {   public String execute(String str); } publicclass UpperAction implements Action {   private String message;   public String getMessage() {    return message;   }   publicvoid setMessage(String string) {     message = string;   }   public String execute(String str) {    return (getMessage() + str).toUpperCase();   } } import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext; publicclass TestAction {  publicstaticvoid main(String[] args) {  ApplicationContext ctx = new ClassPathXmlApplicationContext(    "applicationContext.xml");  Action bean = (Action) ctx.getBean("theAction");  System.out.println(bean.execute("Rod")); }} 

4. 双击左侧在第2步生成的 applicationContext.xml, 然后选择菜单项 Window -> Show View -> Other..., 在弹出的对话框中选择 MyEclipse Enterprise Workbench 节点下的 Spring Beans 子节点打开视图 Spring Beans. 此视图讲出现在主界面的右下侧.

5. 展开此视图中的 MySpringTest 父节点, 并选中 src/applicationContext.xml 子节点, 在此节点上点击右键并选择弹出菜单项中的 New Bean 来打开 Create a new Spring bean 对话框, 并按照下图输入对应的内容.
Bean Id: [theAction]
Bean class: [UpperAction]
接下来请单击一下 Tab 面板 Properties 并点击其中的 Add... 按钮, 在接下来弹出的 Property Wizard 对话框中按照下图输入/选择内容:
Name: [message]
Spring type: [value]
Type: [java.lang.String]
Value:[Hello_]
最后点击两次 Finish 按钮关闭所有向导对话框. 然后点击菜单 File -> Save. 此时可以看到 applicationContext.xml 的内容如下所示:

<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"><beanid="theAction"class="UpperAction"abstract="false"lazy-init="default"autowire="default"dependency-check="default"><propertyname="message"><valuetype="java.lang.String">Hello_</value></property></bean></beans>

然后双击 Package Explorer 下 MySpringTest/src/TestAction.java 打开源代码, 然后点击菜单 Run -> Run As -> 1. Java Application, 如果没有错误的话将会出现如下的输入, 您的第一个 Hello Spring 运行成功了:
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
HELLO_ROD

接着您就可以对着参考书继续创建类, 修改 applicationContext.xml 做更多的练习了.

开发整合 Hibernate 的关键操作点截图:
1. 在数据库浏览器中选择反向工程菜单;

2. 对话框的选项说明

参考视频:

夏昕 <<Spring 开发指南入门>>1 分钟上手教程视频(不带解说) 

小电影: 用 MyEclipse 开发 Spring + Struts + Hibernate 的总结与操作视频(9分钟)

 

MyEclipse生成的Spring+Hibernate无法保存数据问题的解决方法

用 MyEclipse 的自动生成功能产生的 Spring + Hibernate 的 DAO 有时候会出现不能保存数据但是可以查询数据的问题, 这是因为默认生成的 Spring 配置文件里面没有包含对事务的操作, 也就是没有 commit Hibernate transaction 的调用所以无法保存数据. 也就是正确的调用需要 beginTran, save, commit, 但是现在就少了 tran 的调用代码部分. 因为刚刚接触 Spring 这个 "轻量级" 非侵入框架不久, 所以好多问题不是太熟悉, 最近收集了一些资料看了看总算解决了问题. 有问题不要紧, 只要能通过学习来解决它就可以了, 我个人并不很喜欢没事去精通 XXX 框架, 而是喜欢做一些解决问题和查资料能力的锻炼, 有了后面所提的能力, 不管改天是不是出了个 Winter 框架, 也不会担心落伍, 当然前提是基础知识要牢固, 否则很容易看不懂.

解决方法是在配置文件里"侵入性"(必须这样做, 做额外的配置和修改, 否则就无法正常工作, 所以是侵入性的)的加入事务配置后就可以正常的保存数据到 Derby, Oracle 等数据了, 也有其它的解决办法, 希望用 Spring 比较早的经验多的人提出建议:

1. 用 Ecipse 的重构给自动生成的 UsersDAO 类添加一个接口, 里面包含所有的方法声明, 例如 IUsersDAO, 加入接口的目的是为了使用 JDK 的动态代理方式实现的 Spring AOP 来工作, 也有另一种解决方案使用 CGLIB 的话就不需要这一步了, 这种方式下一次讨论.

publicinterface IUsersDAO {  publicabstractvoid save(Users transientInstance);} publicclass UsersDAO extends HibernateDaoSupport implements IUsersDAO {... publicvoid save(Users transientInstance) {  log.debug("saving Users instance");  try {   getHibernateTemplate().save(transientInstance);   log.debug("save successful");  } catch (RuntimeException re) {   log.error("save failed", re);   throw re; }...} 

2. 修改配置文件给原来的 UsersDAO 加入代理类来进行事务管理:

<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"><beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><propertyname="configLocation"value="file:src/hibernate.cfg.xml"></property></bean><!-- UsersDAO implements IUsersDAO 接口 --><beanid="UsersDAO"class="dao.UsersDAO"><propertyname="sessionFactory"><refbean="sessionFactory"/></property></bean><!-- 以下两个 Bean transactionManager 和 userDAOProxy 是新加入的内容, 用来配置事务 --><!-- 声明一个 Hibernate 3 的 事务管理器供代理类自动管理事务用 --><beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><propertyname="sessionFactory"><reflocal="sessionFactory"/></property></bean><!-- 这个代理类是最后对外公开的类, 否则因为没有进行事务操作,  保存时没有提交 hibernate 的事务, 这将无法对数据库进行改动, 也就是原来要调用 UsersDAO 的地方都要转而调用这个代理对象 userDAOProxy; 具体的属性配置在 target 参数那里指定了这个对象对原来的 UsersDAO 对象进行代理; 也因为要使用动态代理, 所以这里必须给 UsersDAO 抽象一个接口 IUsersDAO, 只有通过它来作为原来配置的 UsersDAO 的代理工作, 才能让 Spring 在保存数据的时候自动打开 Hibernate 的 Transaction 并提交, 即属性 transactionManager 配置的 HibernateTransactionManager --><beanid="userDAOProxy"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><propertyname="transactionManager"><refbean="transactionManager"/></property><propertyname="target"><reflocal="UsersDAO"/></property><propertyname="transactionAttributes"><props><!-- 这里的方法签名可以精确到方法, 先懒惰一下全配置上 --><propkey="*">PROPAGATION_REQUIRED</prop></props></property></bean></beans>

3. 修改调用代码, 原来调用 UsersDAO 的地方都要转而调用 userDAOProxy, 而且转换后的目标要修改为 IUsersDAO, 否则就会报 ClassCastException, 具体原因参考 Spring 的 AOP 实现部分的内容, 也可以用 cglib 来解决.
  原始代码:
  UsersDAO dao = applicationContext.getBean("UsersDAO");
  dao.save(users);// 可能无法保存数据, 因为没有事务管理
  修改为:
  IUsersDAO dao = applicationContext.getBean("userDAOProxy");
  dao.save(users);// 现在应该 OK 了, 因为事务提交了

 

MyEclipse生成的Spring+Hibernate无法保存数据问题的解决方法2 - 用 CGLIB 来实现事务管理

刘长炯 2007-08-08

上一小节讨论了用 JDK 的代理机制来实现事务管理的解决方案, 相比起来它有一个麻烦的地方就是必须需要生成一个 DAO 的接口才能工作. 那么另一种比较简单的解决方案就是用 CGBLIB, 可以不用编写接口, 那么下面是 Spring 参考文档中的内容:
7.5.3. 基于JDK和CGLIB的代理
这个小节作为说明性文档,解释了对于一个目标对象(需要被代理的对象),ProxyFactryBean是如何决定究竟创建一个基于JDK还是CGLIB的代理的。

注意
ProxyFactoryBean需要创建基于JDK还是CGLIB代理的具体行为在版本1.2.x和2.0中有所不同。现在ProxyFactoryBean在关于自动检测接口方面使用了与TransactionProxyFactoryBean相似的语义。

如果一个需要被代理的目标对象的类(后面将简单地称它为目标类)没有实现任何接口,那么一个基于CGLIB的代理将被创建。这是最简单的场景,因为JDK代理是基于接口的,没有接口意味着没有使用JDK进行代理的可能。 在目标bean里将被插入探测代码,通过interceptorNames属性给出了拦截器的列表。注意一个基于CGLIB的代理将被创建即使ProxyFactoryBean的proxyTargetClass属性被设置为false。 (很明显这种情况下对这个属性进行设置是没有意义的,最好把它从bean的定义中移除,因为虽然这只是个多余的属性,但在许多情况下会引起混淆。)

如果目标类实现了一个(或者更多)接口,那么创建代理的类型将根据ProxyFactoryBean的配置来决定。

如果ProxyFactoryBean的proxyTargetClass属性被设为true,那么一个基于CGLIB的代理将创建。这样的规定是有意义的,遵循了最小惊讶法则(保证了设定的一致性)。 甚至当ProxyFactoryBean的proxyInterfaces属性被设置为一个或者多个全限定接口名,而proxyTargetClass属性被设置为true仍然将实际使用基于CGLIB的代理。

如果ProxyFactoryBean的proxyInterfaces属性被设置为一个或者多个全限定接口名,一个基于JDK的代理将被创建。被创建的代理将实现所有在proxyInterfaces属性里被说明的接口;如果目标类实现了全部在proxyInterfaces属性里说明的接口以及一些额外接口,返回的代理将只实现说明的接口而不会实现那些额外接口。

如果ProxyFactoryBean的proxyInterfaces属性没有被设置,但是目标类实现了一个(或者更多)接口,那么ProxyFactoryBean将自动检测到这个目标类已经实现了至少一个接口, 一个基于JDK的代理将被创建。被实际代理的接口将是目标类所实现的全部接口;实际上,这和在proxyInterfaces属性中列出目标类实现的每个接口的情况是一样的。然而,这将显著地减少工作量以及输入错误的可能性。

好了, 详细阐述这个解决方案.

用 MyEclipse 的自动生成功能产生的 Spring + Hibernate 的 DAO 有时候会出现不能保存数据但是可以查询数据的问题, 这是因为默认生成的 Spring 配置文件里面没有包含对事务的操作, 也就是没有 commit Hibernate transaction 的调用所以无法保存数据. 也就是正确的调用需要 beginTran, save, commit, 但是现在就少了 tran 的调用代码部分. 因为刚刚接触 Spring 这个 "轻量级" 非侵入框架不久, 所以好多问题不是太熟悉, 最近收集了一些资料看了看总算解决了问题. 有问题不要紧, 只要能通过学习来解决它就可以了, 我个人并不很喜欢没事去精通 XXX 框架, 而是喜欢做一些解决问题和查资料能力的锻炼, 有了后面所提的能力, 不管改天是不是出了个 Winter 框架, 也不会担心落伍, 当然前提是基础知识要牢固, 否则很容易看不懂.

解决方法是在配置文件里"侵入性"(必须这样做, 做额外的配置, 否则就无法正常工作, 所以是侵入性的)的加入事务配置后就可以正常的保存数据到 Derby, Oracle 等数据了:

1. 修改配置文件给原来的 UsersDAO 加入代理类来进行事务管理:

<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"><beanid="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><propertyname="configLocation"value="file:src/hibernate.cfg.xml"></property></bean><!-- UsersDAO --><beanid="UsersDAO"class="dao.UsersDAO"><propertyname="sessionFactory"><refbean="sessionFactory"/></property></bean><!-- 以下两个 Bean transactionManager 和 userDAOProxy 是新加入的内容, 用来配置事务 --><!-- 声明一个 Hibernate 3 的 事务管理器供代理类自动管理事务用 --><beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><propertyname="sessionFactory"><reflocal="sessionFactory"/></property></bean><!-- 这个代理类是最后对外公开的类, 否则因为没有进行事务操作,  保存时没有提交 hibernate 的事务, 这将无法对数据库进行改动, 也就是原来要调用 UsersDAO 的地方都要转而调用这个代理对象 userDAOProxy; 具体的属性配置在 target 参数那里指定了这个对象对原来的 UsersDAO 对象进行代理; 也因为要使用代理, 只有通过它来作为原来配置的 UsersDAO 的代理工作, 才能让 Spring 在保存数据的时候自动打开 Hibernate 的 Transaction 并提交, 即属性 transactionManager 配置的 HibernateTransactionManager --><beanid="userDAOProxy"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><!-- 注意这个属性, 详细意义请参考文章开头的参考资料, 必须为 true 使用CGLIB才不用强制编写DAO接口 --><propertyname="proxyTargetClass"><value>true</value></property><propertyname="transactionManager"><refbean="transactionManager"/></property><propertyname="target"><reflocal="UsersDAO"/></property><propertyname="transactionAttributes"><props><!-- 这里的方法签名可以精确到方法, 先懒惰一下全配置上 --><propkey="*">PROPAGATION_REQUIRED</prop></props></property></bean></beans>

2. 修改调用代码, 原来调用 UsersDAO 的地方都要转而调用 userDAOProxy, 因为用了 CGLIB, 所以类型转换不会发生异常.
  原始代码:
  UsersDAO dao = applicationContext.getBean("UsersDAO");
  dao.save(users);// 可能无法保存数据, 因为没有事务管理
  修改为:
  UsersDAO dao = applicationContext.getBean("userDAOProxy");
  dao.save(users);// 现在应该 OK 了, 因为事务提交了

 

Spring 整合 Strus 要点
beansoft@126.com
2007-8-5

1. 项目需要有 Struts 包和 Spring 的 core, aop, web 三个包(注意不是 Spring 自己的 Web MVC), 具体的 .classpath 文件如下所示:

<?xmlversion="1.0"encoding="UTF-8"?><classpath><classpathentrykind="src"path="src"/><classpathentrykind="con"path="org.eclipse.jdt.launching.JRE_CONTAINER"/><classpathentrykind="con"path="com.genuitec.eclipse.j2eedt.core.J2EE14_CONTAINER"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/antlr.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/commons-beanutils.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/commons-digester.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/commons-fileupload.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/commons-logging.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/commons-validator.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/jakarta-oro.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/struts.jar"/><classpathentrykind="lib"path="WebRoot/WEB-INF/lib/mysql-connector-java-3.1.11-bin.jar"/><classpathentrykind="con"path="melibrary.com.genuitec.eclipse.springframework.MYECLIPSE_SPRING20_CORE"/><classpathentrykind="con"path="melibrary.com.genuitec.eclipse.springframework.MYECLIPSE_SPRING20_AOP"/><classpathentrykind="con"path="melibrary.com.genuitec.eclipse.springframework.MYECLIPSE_SPRING20_WEB"/><classpathentrykind="output"path="WebRoot/WEB-INF/classes"/></classpath>

2. 对 Struts 配置文件做修改加入 Spring 托管功能.

创建 Spring 配置文件,将文件放到src 目录下,文件名称为 applicationContext.xml, 编译后放到 WEB-INF/classes/ 下.

配置struts-config.xml文件,添加 spring的插件, 位置在 struts-config 文件的最末尾.

<plug-inclassName="org.springframework.web.struts.ContextLoaderPlugIn"><set-propertyproperty="contextConfigLocation"value="/WEB-INF/classes/applicationContext.xml"/></plug-in>

3. 修改 Struts 的 struts-config.xml 中的Action配置

原:

<actionattribute="loginForm"input="/login.jsp"name="loginForm"path="/login"scope="request"validate="true"type="com.test.struts.action.LoginAction"/>

改为:

<actionattribute="loginForm"input="/login.jsp"name="loginForm"path="/login"scope="request"validate="true"type="org.springframework.web.struts.DelegatingActionProxy"/>

type 部份为修改内容, 这里将使用spring的代理器来对Action进行控制.
当提交到/login.do是将控制权交给了spring,然后由spring来把它转回到struts的Action.

4. 配置spring 来实例化上一步中被删除的 Action 类.

<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEbeansPUBLIC"-//SPRING//DTD BEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd"><beans><beanname="/login"class="com.test.struts.action.LoginAction"></bean></beans>

Spring 通过 org.springframework.web.struts.DelegatingActionProxy 这个类, 然后根据 Struts 配置文件中的 <action path="/login" ..> 和 Spring 配置文件中的 <bean name="/login" ..> 来将 Spring 管理下的 Struts Action 类和提交的路径匹配起来, 这些就是关于转交控制权的配置内容.

实践的过程中发现必须把 singleton="false"去掉才行, 否则就会无法初始化 Spring 框架, 不知道具体的原因是什么.

既然这个 Struts 的 Action 已经通过 Spring 来初始化, 所以就可以加入依赖注入, 整合 Hibernate 的功能了. 例如典型的情况:

com.test.struts.action.LoginAction private UserManager userManager; public UserManager getUserManager()...publicvoid setUserManager(UserManager userMgmr) ... public ActionForward execute(ActionMapping mapping, ActionForm form,    HttpServletRequest request, HttpServletResponse response) {    System.out.println("userManager=" + getUserManager());    getUserManager().someBusinessMethods();    .....}

然后就可以配置:

<beanname="/login"class="com.test.struts.action.LoginAction"><propertyname="userManager"><refbean="userManagerBean"/></property></bean><beanid="userManagerBean"class="manager.UserManager"/>

同理 Spring 整合 Hibernate 和没 Struts 的时候一样, 也可以在这个文件中进行配置即可.

4. 最后一步, 测试, 只要能打印出来 userManager 不为空, 就说明整合成功了. 如果出现 404 action servlet 不可用的错误, 一般都是 Spring 配置文件出错导致的.

参考视频: 小电影: 用 MyEclipse 开发 Spring + Struts 的总结与操作视频(7分钟)

 

重量级框架: Java EE 5 开发

MyEclipse + JPA + Toplink 开发视频: 开发并运行第一个 JPA 项目

MyEclipse + JBoss 开发视频: 配置,开发并运行第一个 EJB 3 项目

 
原创粉丝点击