配置Struts2 + Spring + Hibernate详细步骤

本文详细介绍如何搭建Struts2+Spring+Hibernate(SSH)框架,包括配置步骤、代码示例及常见错误解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置Struts2 + Spring + Hibernate详细步骤

配置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(请参见Struts2Spring整合的要点);

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目录下。


 

2Spring配置(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.autocreate,则将重新创建数据库 -->

       <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.代码如下:

 

!—beanDAO层级类ref其它有关Hibernatebean以实现注入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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值