ssh环境搭建步骤

 

更系统地掌握Struts1.x/Struts2.x+Hibernate+Spring框架组合,请学习SpringSideAppfuse

终于,终于将SSH整合成功了,弄了几个小时,可以休息了(有的朋友弄了半个月,甚至重装了系统也没弄好,哎,庆幸啊)。碰到问题千万不要放弃,要相信没有解决不了的问题!

项目结构图:

jsp部分为:index.jsp;success.jsp;fail.jsp

UserDAO.java,User.hbm.xml自动生成,HibernateSessionFactory是多余的。

相关的配置文件、类文件详细信息,请参看

以前是整过这三个框架的,可是工作期间都不曾用过,不知不觉之中,学的东西全忘了。这次又要开始找工作了,看着招聘启事上都写着:要求熟练掌握Struts,Hibernate或Spring框架……,没得办法,重新学呗。

Spring in Action中文版下载地址(ftp协议) ftp://222.214.218.61/book5/20080228/cf8b35cc-5bcd-4973-b6b7-37ae3ec78391.rar 如果无法下载,可以在http://www.gougou.com里重新搜索

首先开始搭建项目环境,步骤如下:

使用平台:MyEclipse 6.0

框架版本:Struts 1.2 Hibernate 3.0 Spring 2.0

1> 添加过程:

<1> 新建项目。 Package Explorer视图下,右键单击 New -> Web Project;

<2> 添加Struts框架。菜单栏MyEclipse -> Capabilities,或者右键单击新建的项目名,选择快捷菜单中的"MyEclipse"下的二级菜单;设置相关的包名后,请写一个Struts的小例子,用来测试Struts是否可用;
<3> 添加Spring。步骤同2所述,只不过这次是加入Spring Capabilities。详细添加步骤如下图所示;

 

<4> 配置数据源。打开数据库视图,Windows -> Open Perspective -> MyEclipse DataBase Explorer。新建数据源, 在DB Browser下,右键单击 New ,配置信息类似下图,

 

点击Next,选择"Display all schemas","Finish"完工。

<5> 点击MyEclipse右上角 >>按钮,返回到MyEclipse Java Enterprise视图。按类似于2的步骤,添加Hibernate框架,详细步骤如图所示

请选择Hibernate 3.0的版本

 

 

 

 

<6>通过MyEclipse生成操作数据库的Dao类(UserDao),并自动生成映射表的配置文件(在本示例中包含在applicationContext.xml中),将视图切换到MyEclipse Database Explorer,打开我们在前面配置的数据链接,选择我们操作的表User,右键单击,选择:Hibernate Reverse Engineering。详细步骤如下图所示:

 

 

 

<7> 至此,项目环境己经搭建完成。

需要指出的是,为了使用日志管理的功能,你只须拷贝log4j.properties即可,将其放入到src根目录下。

log4j.properties配置内容如下(对具体配置不太了解的朋友可以在这之后学一下,此处,你只须修改日志文件存储路径即可):

log4j.rootLogger=info,A1

log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender

log4j.appender.A1.Append=true
# log文件存储路径,请转换为相应的目录
log4j.appender.A1.File=E:/workspace/ssh2/logs/log4j.log
log4j.appender.A1.DatePattern = '.'yyyy-MM-dd'.log'

log4j.appender.A1.layout=org.apache.log4j.PatternLayout

log4j.appender.A1.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} Method: %l%n%m%n 。

# 无详细类名、方法名信息

#log4j.appender.A1.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} %m%n

# -X号:X信息输出时左对齐;

# %p:日志信息级别
# %d{}:日志信息产生时间
# %c:日志信息所在地(类名)
# %m:产生的日志具体信息
# %n:输出日志信息换行

Spring,Hibernate已经整合在一起了,现在需要将Struts与Spring进行整合。Spring与Struts整合实现方式

第一,在struts-config.xml中加入

<!--配置一个插件去集成spring -->

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

第二,修改struts-config.xml中action节点的配置信息,将原来定义的

<action path="/validateUser"
type="com.wuwei.struts.action.ValidateUserAction" name="userForm">
<forward name="success" path="/success.jsp"></forward>
<forward name="fail" path="/fail.jsp"></forward>
</action>
中的type改为: type="org.springframework.web.struts.DelegatingActionProxy">或者你也可以不改,而在<plug-in>标签前加入如下定义

<!-- 加上controller就不用再配置action的type属性了/或者说type属性不用改为

type="org.springframework.web.struts.DelegatingActionProxy" -->
<controller
processorClass="org.springframework.web.struts.DelegatingRequestProcessor">
</controller>

第三,在applicationContext.xml中为ValidateUserAction添加定义,将userDao的实例化加给Spring,这也是Spring中的依赖注入

<!-- Struts -->
<bean name="/validateUser"
class="com.wuwei.struts.action.ValidateUserAction">
<property name="userDAO" ref="userDao" />

</bean>

当然,这里ref(引用)的Bean userDao也是在applicationContext.xml中己定义好的

<!-- 通过HibernateDaoSupport来操作数据库,需要植入sessionFactory

UserDao继承自HibernateDaoSupport
-->
<bean id="userDao" class="com.wuwei.struts.dao.UserDAO">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

相关的配置文件、类文件详细信息,请参看

如此这般,现在可以运行你的程序了。为了测试三个框架是否整合成功,你可以在action里什么都不做,只是写一条输入语句即可。因为搭建SSH项目时,最容易碰到的错误就是:Servlet action is not available。如果连action都访问不了,后面的就不需要谈了(文章B http://blog.csdn.net/shendiaodaxia/archive/2007/12/29/2002805.aspx应该可以解决此类问题)。测试不成功?依然是Servlet action is not available?这个时候log4j.log就起到关键作用了,你可以看下里面出现了什么异常。我在调试时碰到了:

1. java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor 和

2. net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null

Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.SecurityException: class "com.wuwei.struts.bean.User$$EnhancerByCGLIB$$1016ffbf"'s signer information does not match signer information of other classes in the same package

的错误。

1的解决办法是:

在使用Spring的AOP编程时,会用到这几个lib:

(版本不一样,文件名也不一样)
asm-2.2.3.jar
asm-commons-2.2.3.jar
asm-util-2.2.3.jar

Hibernate使用如下lib:
asm.jar
asm-attrs.jar

其中asm-2.2.3.jar与asm.jar存在类上的冲突!!!

使用其中之一或两者都使用,可能会出现如下错误:
java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor
java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor
java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit。。。。。。
解决办法是:
1.去掉类路径上的关于Hibernate的3个lib
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
2.加入Spring中的以下4个lib
asm-2.2.3.jar
asm-commons-2.2.3.jar
asm-util-2.2.3.jar
cglib-nodep-2.1_3.jar

2的解决办法是:

在….hbm.xml文件中,将class标签的lazy属性改为false(默认为true)<class name="com.wuwei.struts.bean.User" table="user" lazy="false">。如果有schema="dbo" catalog="test"配置信息,请将其删除

再次运行,打印语句成功 "I'm in a Action" 搭建成功!

 

 

补充:

我用的是SQLServer数据库,测试表是User表,调试时出现了

java.sql.SQLException: 在关键字 'user' 附近有语法错误。这是因为MS SQL中的User表是系统表,不能直接查询select username from user,需要将user用中括号包围[user],同样,为了保证hibernate能正常工作,需将user.hbm.xml中class元素的table改为 table="[user]"