配置Struts2 +Spring + Hibernate(SSH)
1.Struts2配置(2.3.4)
http://bloyoukuaiyun.com/yeness/article/details/7635009
基本jar包
1、commons-fileupload-1.2.2
2、commons-io-2.0.1
3、commons-lang3-3.1
4、commons-lang-2.4
5、commons-logging-1.1.1
6、commons-logging-api-1.1
7、freemarker-2.3.19
8、javassist-3.11.0.GA
9、ognl-3.0.5
10、struts2-core-2.3.4
11、xwork-core-2.3.4
(1)
在web.xml中添加struts2的核心控制器
<!-- Struts2 核心控制器配置在web.xml下-->
<filter>
<filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(2)
将Struts2的配置文件 默认名:struts.xml,放置于src目录下
(3)
struts.xml文档详细结构:
1).文档头文件:
<!DOCTYPEstrutsPUBLIC
"-//ApacheSoftware Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
2).<struts>标签体结构
<struts>标签下有<package>标签,配置了相关Action信息,
示例:
<struts>
<package name="ssh" namespace="/user" extends="struts-default">
<action name="*Action" class="myUserAction" method="{1}">
<result name="regSuccess">/user/regSuccess.html</result>
</action>
<action name="*">
<result>/user/{1}.jsp</result>
</action>
</package>
</struts>
讲解:
name为自定义当前package包的名字;为任意名,但必须唯一,其它包如果要继承该包,必须引用该属性来继承.
namespace为名字空间,常见表现形式为:浏览器url中紧接上下文名字的文字,须以“/”开头。如“/”,“/user”,不能以“/”结尾;
extends="struts-default",为继承struts2-core-2.3.4.jar中的struts-default.xml标准配置文档;
<package>下的<action>中的name,是指定的用户request请求的名字,当页面中为method=get时,可在浏览器中显示请求名及相关参数,struts2中的request请求可以“.action”后缀结尾,也可以不写,均可匹配<action>中的name(不以.action结尾);
class为action处理请求的类,格式为:包名.类名(必须为可实例化的类,不能为抽象类或接口),也可以为Spring配置中的<bean>的id(请参见Struts2与Spring整合的要点);
method为该action对应的处理请求的类要执行的方法名,可以指定固定方法名,也可以指定不定方法名,若为不定方法,以{n}(n>=1)表示,表示和name=”*Action”中的”*”通配符指定的文字相同的方法名,n表示按java代码执行的从上至下的顺序结构的同名重载方法的第几个方法(错误,应为:n表示 <action name=*_*Action...中的name属性值的第n个*指定的文字的在Java类中的同名方法,n>=1)(<result>/user/{1}.jsp</result>同理)(一般action处理类中采用无参方法,不使用重载);不写该method,则默认对应的class指定的实现类执行了 String execute()方法。
(4)
与Spring的整合
1).在<action>的class=””中引用Spring配置文档中的<bean>的id值。
2).将插件jar包:struts2-spring-plugin-2.3.4.jar导入WEB-INF/lib目录下。
2:Spring配置(spring-framework-3.0.5.RELEASE)
(仅为本人所学的Spring配置Ioc控制反转和依赖注入方面)
(1)
为使Struts2整合Spring容器功能,请在WEB-INF下:web.xml中
添加:(用予加载Spring容器功能,和标签<filter>,<filter-mapping>,<welcome-file-list>平级)
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
(ContextLoaderListener预设会读取默认文件名为applicationContext.xml的文档,您可以指定自定义Spring配置文档,只要在web.xml中的<context-param>中指定contextConfigLocation参数对应的<param-value>信息)
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml
</param-value>
</context-param>
(2)
为了便于web.xml的<listener>标签加载Spring容器,
若没有采用自定义Spring配置文档,请将默认文件名为applicationContext.xml的Spring配置文档放置与web.xml同级目录下,本处即为WEB-INF目录下。
(3)
Spring配置文档applicationContext.xml详细结构
1) applicationContext.xml文档标签<beans></beans>及相关信息 (加上本文档信息可以使Eclipse代码智能提示可用)
(<beans>为Spring配置文件的根元素,包含一个或多个bean元素)
<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-3.0.xsd">
2)编写<beans></beans>标签下的<bean></bean>标签内容信息
<bean>用于告诉Spring容器一个类及其它是如何配置的
详见:
http://wenku.baidu.com/view/6fe00dfcf705cc1755270931.html
http://wenku.baidu.com/view/79224bb8fd0a79563c1e72e0.html
结构示例:
<beanid="myUserAction"class="com.niit.user.action.UserAction">
<propertyname="userService"ref="myUserService">
</property>
</bean>
id:唯一标识名:可以看作类实例化时,存储实例的变量名,如A aa=new A(){};中的aa.
class:指定要实例化的类,格式为:包名.类名(必须为可实例化的类,不能为抽象类或接口)
property:为在实例化当前类时,为类中的某个成员变量(name指定成员变量名)“赋值”时,指定对应类型的变量值(用ref引用另一个<bean>的id)。
(4)
与Hibernate的整合:
1).代码分层,降低耦合。三层结构:Struts2中的Action层级类,Service中间服务层级类,DAO数据库操作层级类,按照开发需求和JavaBean结构编码完毕,详细请参见Hibernate配置中的有关三层结构的说明。
2).将分层结构,Action,Service,DAO类按照步骤(3)--2)中的方法配置成<bean>结构,存储在applicationContext.xml配置文件中。
3).有关Hibernate工厂注入和事务处理,请参见本文Hibernate配置。
3.Hibernate配置(hibernate-distribution-3.6.8.Final)
(1).向WEB-INF/lib中导入Hibernate的jar包,
hibernate-distribution-3.6.8.Final中的hibernate3.jar,和lib\required中的必须包、
导入你需要的数据库连接JDBC jar包,如:mysql-connector-java-5.1.6-bin.jar
(2)将文件hibernate.cfg.xml放置于src目录下
(3) Hibernate配置文件hibernate.cfg.xml 配置详解
1) hibernate.cfg.xml文档头信息(加上本文档头信息可以使Eclipse代码智能提示可用)
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/HibernateConfiguration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
2).hibernate.cfg.xml中的<hibernate-configuration>标签中,配置<session-factory>
分3部分:
1.<!--数据库连接信息 -->
2.<!--Hibernate其他配置 -->
3.<!--配置实体映射文件-->
示例:
(以MySQL为例,详细配置参考信息请见hibernate-distribution-3.6.8.Final\project\etc\hibernate.properties文件)
<!-- SessionFactory的配置 -->
<session-factory>
<!-- 数据库连接信息 -->
<propertyname="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<propertyname="hibernate.connection.url">jdbc:mysql://localhost:3306/ssh_demo</property>
<propertyname="hibernate.connection.username">root</property>
<propertyname="hibernate.connection.password">root</property>
<!-- Hibernate其他配置 -->
<!-- 当调用buildSessionFactory()时,如果hibernate.hbm2ddl.auto是create,则将重新创建数据库 -->
<propertyname="hibernate.hbm2ddl.auto">update</property>
<propertyname="hibernate.show_sql">true</property>
<propertyname="hibernate.format_sql">true</property>
<!-- 配置实体映射文件 -->
<mappingclass="com.niit.entity.User"/>
</session-factory>
部分参数讲解:
1)<propertyname="hibernate.hbm2ddl.auto">update</property>
update:表示自动根据model对象来更新表结构,启动hibernate时会自动检查数据库,如果缺少表,则自动建表;如果表里缺少列,则自动添加列。
还有其他的参数:
create:启动hibernate时,自动删除原来的表,新建所有的表,所以每次启动后的以前数据都会丢失。
create-drop:启动hibernate时,自动创建表,程序关闭时,自动把相应的表都删除。所以程序结束时,表和数据也不会再存在。
有关此参数的详细作用信息请见:
http://blog.youkuaiyun.com/zwhfyy/article/details/4514966
2)第3部分配置实体类映射文件 有两种方式,取其一,最好不要混用
【1】读取基于xml文件的实体类配置文件,格式为:类名.hbm.xml。
和对应的实体类java文件位于同一目录下。hibernate.cfg.xml文件中,关联实体映射文件的形式为:
<mappingresource="com/niit/entity/User.hbm.xml"/>
<mappingresource="包名/包名/包名/类名.hbm.xml"/>
【2】采用Annotation注解方式的实体类映射配置,直接注解到实体类java文件中。
hibernate.cfg.xml文件中,关联实体映射文件的形式为:
<mappingclass="com.niit.entity.User" />
<mappingclass="包名.类名" />
详解:
【1】 xml实体类配置文件:
1】.文档头:
<!DOCTYPE hibernate-mappingPUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
2】.实体类配置示例:各参数用法请网上查阅
博文1:Hibernate中<id>标签下的<generator>生成策略:
http://blog.youkuaiyun.com/tianping168/article/details/4069200
博文2:Hibernate总结:
http://blog.youkuaiyun.com/lxx2844/article/details/1750018
博文3: Hibernate的基本映射数据类型
http://book.51cto.com/art/201004/193525.htm
【2】.Annotation注解方式配置
示例:
注意,1.有关表名等信息请注解到java文件的class 类名上
2.版本Hibernate3xxx..中,在JavaBean实体类中的成员变量对应的getXxx()方法上注解相关字段的信息,作为数据库中的字段。
3.有关注解关键字的用法和说明,请网上搜索。
(4).手动建立数据库(名)
数据库要预先建立好,因为hibernate只会建表,不会建库
(5).Spring与Hibernate的整合:
1).编写Action,Service,DAO层级类代码:
【1】流程:Action调用Service层,Service调用DAO层,DAO层级的类中要注入Hibernate的sessionFactory工厂方法。
Action中的方法产生String类型的返回值到Struts2中的struts.xml调用对应的<action>中的<result>。
【2】 详解:1.请按照JavaBean结构编写三层类的代码,Action层级类定义Service类型的成员变量,并使用Eclipse的自动生该成员变量的getXxx(),setXxx()方法;Service层级类要定义DAO类型的成员变量,同样生成getXxx(),setXxx()方法。若您需要重载该JavaBean构造器,必须显式编写无参构造器。
2. Spring配置文件applicationContext.xml添加三层结构类对应的bean,并使用ref实现关联,图示:
3.DAO层级类的代码要extends Hibernate包中的抽象类HibernateDaoSupport,同时再在步骤【3】中配置工厂方法的注入。
4.Action层级类中的具体实现类可以extends Struts2包中的抽象类ActionSupport或implements 接口Action,然后override 方法String execute()或自定义执行方法;也可以不extends ActionSupport和implements Action,然后自定义执行方法(可以为String execute()方法),不过均须为String类型的返回值,为与Struts2的struts.xml中的<action>中的<result>对应。
【3】 实现sessionFactory注入和事务处理:
1:DAO层级的类extends Hibernate包中的抽象类HibernateDaoSupport,从而调用HibernateDaoSupport中的setSessionFactory(SessionFactorysessionFactory),从而实现sessionFactory注入和调用HibernateDaoSupport中的getHibernateTemplate()方法进行事务处理,操作数据库增删改查。
2:在Spring配置文件applicationContext.xml中添加Hibernate中的sessionFactory和Transaction的<bean>配置:并在DAO层级类中ref sessionFactory的<bean>.的id.代码如下:
!—此bean为DAO层级类ref其它有关Hibernate的bean以实现注入sesionFactory-->
<beanid="myUserDAO"class="com.niit.user.dao.impl.UserDAOImpl">
<propertyname="sessionFactory"ref="mySessionFactory"></property></bean>
<beanid="mySessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<propertyname="configLocation"value="classpath:hibernate.cfg.xml"></property>
</bean>
<beanid="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<propertyname="sessionFactory"ref="mySessionFactory"></property>
</bean>
<beanid="transactionIntercepor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<propertyname="transactionManager"ref="transactionManager"></property>
<propertyname="transactionAttributes">
<props>
<propkey="find*">PROPAGATION_REQUIRED,readOnly</prop>
<propkey="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<propertyname="beanNames">
<list>
<value>*DAO</value>
</list>
</property>
<propertyname="interceptorNames">
<list>
<value>transactionIntercepor</value>
</list>
</property>
</bean>
图示:
(6),在启动TomCat进行调试时,若出现log日志方向的警告,请在src目录下添加名为log4j.properties的属性文件,以消除警告,文件内容为:
# For JBoss: Avoid to setupLog4J outside $JBOSS_HOME/server/default/deploy/log4j.xml!
# For all other servers:Comment out the Log4J listener in web.xml to activate Log4J.
log4j.rootLogger=INFO, stdout,logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=${petstore.root}/WEB-INF/petstore.log
log4j.appender.logfile.MaxFileSize=512KB
# Keep three backup files.
log4j.appender.logfile.MaxBackupIndex=3
# Pattern to output: datepriority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
常见错误汇总:
http://blog.youkuaiyun.com/nihaoma71121/article/details/7338457
java常见的ClassNotFoundException
1 - java.lang.ClassNotFoundException:org.apache.commons.logging.LogFactory
添加包common-logging.jar
2 - java.lang.ClassNotFoundException:javax.transaction.Synchronization
添加包jta.jar(hiberante)
3 - java.lang.ClassNotFoundException:org.dom4j.DocumentException
添加包dom4j-1.6.1.jar
4 - java.lang.ClassNotFoundException:org.apache.commons.collections.SequencedHashMap
添加包commons-collections.jar
5 - java.lang.ClassNotFoundException: net.sf.cglib.proxy.CallbackFilter
java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter
添加包cglib-2.1.3.jar
6 - java.lang.ClassNotFoundException:org.objectweb.asm.Type
添加包asm.jar
7 - java.lang.ClassNotFoundException:antlr.ANTLRException
添加包antlr.jar
8 - java.lang.ClassNotFoundException:net.sf.ehcache.CacheException
添加包ehcache-1.2.3.jar
Caused by: java.lang.NoSuchMethodError:org.objectweb.asm.ClassWriter.<init>(I)V
将cglib.jar 由2.2版本改为 2.1.