- 浏览: 1617131 次
- 性别:
- 来自: 长春
文章分类
- 全部博客 (309)
- ext (19)
- web (13)
- PHP (19)
- 互联网新闻 (3)
- oracle (3)
- Mootools (1)
- FLEX (3)
- 人在职场 (2)
- hibernate (24)
- spring2 (1)
- J2SE (24)
- WEB_UI (14)
- 其它 (11)
- Log4J (1)
- iText (10)
- SQL (11)
- 设计模式 (3)
- lucene (6)
- 开源项目 (2)
- javascript (20)
- 软件&破解补丁 (48)
- Quartz (2)
- 解决方案 (1)
- 工作存档 (2)
- JAVA对文件操作 (2)
- C&C#&VC (1)
- struts2 (3)
- 版本控制 (2)
- 软考基础 (23)
- JBPM (2)
- velocity (4)
- javamail (3)
- HttpClient (9)
- 虚拟化技术 (2)
- 报表 (3)
- ibatis (5)
- Spring (4)
- 信用卡 (0)
- 芒果钱包 (0)
- 养卡 (0)
最新评论
-
a601962168:
...
通过JAVA与串口(RS232)通信实例 -
olive009:
...
Adobe Acrobat 9 Pro & Pro Extended 中文版/英文版 下载及破解补丁 -
overshit:
api更新了,一加filter就Callback filter ...
深入浅出CGlib-打造无入侵的类代理 -
u010778233:
写得很不错,已经用起来了,谢谢
将jdbc结果集转换成对象列表 -
924060929:
我想找就是要这个功能!!!!!!!!
velocity基础教程--2自定义ResourceLoader实现字符模板
Struts 2,Spring 2,Hibernate 整合
开发工具Eclipse 6.5/6.6 GA
1.首先创建一个web工程,我们暂且启明为s2sh
这里我们选择的是Java EE 5.0
finish
2.向工程加入hibernate支持,这里我们使用的是hibernate 3.2
默认就可以,不要忘记将jar包加入到/WebRoot/WEB-INF/lib
接着next
实际上这里的hibernate.cfg.xml不起作用,因为该配置文件的内容由后面的spring配置文件进行管理,我们可以在创建之后将其删除
默认next
我们根本不用hibernate.cfg.xml,所以这里根本不需要进行数据库配置,当然默认也无所谓。
继续next
sessionFactory我们在之后也会直接使用spring为我们提供的,所以这里不需要创建。
finish
3.向工程加入spring支持,这里我们使用的是spring2
这里我们选择的是spring2,
不要忘记选中这5个库包:
Spring 2.0 AOP Libraries
Spring 2.0 Core Libraries
Spring 2.0 Persistence Core Libraries
Spring 2.0 Persistence JDBC Libraries
Spring 2.0 Web Libraries
也不要忘记将jar包加入到/WebRoot/WEB-INF/lib。
next
这里我们不需要Enable AOP 所以不需要选中
不要忘记将配置文件applicationContext.xml指定在/WEB-INF目录下,不然服务器启动时无法加载
next
这里的sessionFactory我们也不需要,之后会手动配置。
finish
4.加入struts2支持,由于MyEclipse并没有加入Struts2的支持,所以我们需要手动导入相关jar包。
这里我们使用的是struts 2.0.11版本
需要的相关jar包如下:
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.11.jar
xwork-2.0.4.jar
struts2-spring-plugin-2.0.11.jar
4.进行相关文件的配置
首先我们需要在src下加入struts的配置文件struts.xml
接下来我们配置web.xml
到目前为止我们的整合工作已经完成。我们可以将该工程打包,以备下次直接使用。
这里由一个问题就是如果采用myeclipse加载hibernate和spring的lib包形式发布项目的时候会出现异常,我们可以手动去掉一个asm-2.2.3jar即可。
5.下面我们做一个简单的应用来验证。
(1)首先我们使用的是mysql,不要忘记将mysql-jdbc的jar包导入到我们的工程中
我们创建s2sh数据库,并创建表person
(2)首先我们创建test.s2sh.bean包,在下面创建我们person表对应的Entity Bean及其映射文件
Person.java
Person.hbm.xml
(3)在spring配置文件applicationContext.xml配置hibernate的连接数据库信息及sessionFactory创建方式
如果出现乱码问题,可以考虑如下解决方案
或者将url后面加入编码串,如下
注意 : 这里我的数据库编码是utf-8
具体那种方案好用大家可以尝试一下,我基本上直接将两种方式都加上了。
(4)下面我们开始写DAO层,首先创建test.s2sh.dao包放置Dao类的接口,创建test.s2sh.dao.impl包放置Dao类的实现。
PersonDAO.java
由于使用了spring,所以DAO的实现类我们可以继承HibernateDaoSupport进行实现
PersonDAOImpl.java
(5)下面我们开始进行service层的设计,这里的service层仅是简单调用DAO层的的方法。
同样是创建接口包(test.s2sh.service),实现包和接口类(test.s2sh.service.impl),实现类
PersonService.java
这里我们需要使用spring的ioc将DAO诸如到service中,所以不要忘记在service实现类中加入DAO作为属性。
PersonServiceImpl.java
(6)接下来我们开始对action层进行设置,实际项目中的action可能会有很多,所以我们这里需要对action进行分包,因为我们这里针对Person进行操作,所以我们创建test.s2sh.action.person.
这里先做保存操作
SavePersonAction.java
下面创建一个保存人员的提交页面
save.jsp
操作成功页面
save-success.jsp
接下来我们需要配置struts.xml,创建action
由于现在的action的创建已经由spring所接管,所以这里class里面使用的是别名,该别名与applicationContext.xml中的id对应.
接下来我们需要配置applicationContext的ioc。
这里说明一下spring中的单例与设计模式中的单例不同,设计模式的单例是在jvm中只产生一个实例,而spring中的单例
是针对每个ioc容器来言,如果存在两个ioc容器,那么每个ioc容器都会生成唯一的类实例
将sessionFactory注入Dao中,这里的Dao来说是无状态的,可以设置为单例singleton。这里的action是使用spring创建的。
struts2与struts1的action有所不同,因为struts2中的action中可能存在属性,这里是Person,所以struts2的action可能是有状态的。
如果是有状态的我们就需要将scope设置成原型模式,即每次请求都新建一个action。
不然可能会出现如果表单提交的第一次出错,之后就再也提交不过去了,值就是应为使用默认的singleton,
当第一次的时候就将FieldError中加入了错误,每次都是这个action,始终带着这个错误,所以就提交不过去了。
到目前为止这个整合已经完成了。
工程下载
dao是和数据库交互,service是业务逻辑,action是也页面交互,你觉得跳过逻辑层那样更好?
开发工具Eclipse 6.5/6.6 GA
1.首先创建一个web工程,我们暂且启明为s2sh
这里我们选择的是Java EE 5.0
finish
2.向工程加入hibernate支持,这里我们使用的是hibernate 3.2
默认就可以,不要忘记将jar包加入到/WebRoot/WEB-INF/lib
接着next
实际上这里的hibernate.cfg.xml不起作用,因为该配置文件的内容由后面的spring配置文件进行管理,我们可以在创建之后将其删除
默认next
我们根本不用hibernate.cfg.xml,所以这里根本不需要进行数据库配置,当然默认也无所谓。
继续next
sessionFactory我们在之后也会直接使用spring为我们提供的,所以这里不需要创建。
finish
3.向工程加入spring支持,这里我们使用的是spring2
这里我们选择的是spring2,
不要忘记选中这5个库包:
Spring 2.0 AOP Libraries
Spring 2.0 Core Libraries
Spring 2.0 Persistence Core Libraries
Spring 2.0 Persistence JDBC Libraries
Spring 2.0 Web Libraries
也不要忘记将jar包加入到/WebRoot/WEB-INF/lib。
next
这里我们不需要Enable AOP 所以不需要选中
不要忘记将配置文件applicationContext.xml指定在/WEB-INF目录下,不然服务器启动时无法加载
next
这里的sessionFactory我们也不需要,之后会手动配置。
finish
4.加入struts2支持,由于MyEclipse并没有加入Struts2的支持,所以我们需要手动导入相关jar包。
这里我们使用的是struts 2.0.11版本
需要的相关jar包如下:
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.11.jar
xwork-2.0.4.jar
struts2-spring-plugin-2.0.11.jar
4.进行相关文件的配置
首先我们需要在src下加入struts的配置文件struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="s2sh" extends="struts-default"> </package> </struts>
接下来我们配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 配置struts2的过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 配置spring的监听器 --> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
到目前为止我们的整合工作已经完成。我们可以将该工程打包,以备下次直接使用。
这里由一个问题就是如果采用myeclipse加载hibernate和spring的lib包形式发布项目的时候会出现异常,我们可以手动去掉一个asm-2.2.3jar即可。
5.下面我们做一个简单的应用来验证。
(1)首先我们使用的是mysql,不要忘记将mysql-jdbc的jar包导入到我们的工程中
我们创建s2sh数据库,并创建表person
-- Table "person" DDL CREATE TABLE `person` ( `id` int(11) NOT NULL, `name` varchar(20) NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
(2)首先我们创建test.s2sh.bean包,在下面创建我们person表对应的Entity Bean及其映射文件
Person.java
package test.s2sh.bean; public class Person { private Integer id; private String name; private int age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Person.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="test.s2sh.bean.Person" table="person"> <id name="id" type="java.lang.Integer" column="id"> <generator class="increment"></generator> </id> <property name="name" type="string" column="name" length="20"></property> <property name="age" type="java.lang.Integer" column="age"></property> </class> </hibernate-mapping>
(3)在spring配置文件applicationContext.xml配置hibernate的连接数据库信息及sessionFactory创建方式
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="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"> <!-- apache.dbcp连接池的配置 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/s2sh?useUnicode=true&characterEncoding=UTF-8"></property> <property name="username" value="root"></property> <property name="password" value=""></property> <!-- 最大活动连接数 --> <property name="maxActive" value="100"></property> <!-- 最大可空闲连接数 --> <property name="maxIdle" value="30"></property> <!-- 最大可等待连接数 --> <property name="maxWait" value="500"></property> <!-- 默认的提交方式(如果不需要事务可以设置成true,在实际应用中一般设置为false,默认为false) --> <property name="defaultAutoCommit" value="true"></property> </bean> <!-- 这里直接使用spring对hibernate3支持的sessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <!-- hibernate方言等相关配置 --> <property name="hibernateProperties"> <props> <prop key="connection.useUnicode">true</prop> <prop key="connection.characterEncoding">utf-8</prop> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> <!-- hbm.xml的映射文件 --> <property name="mappingResources"> <list> <value>test/s2sh/bean/Person.hbm.xml</value> </list> </property> </bean> </beans>
如果出现乱码问题,可以考虑如下解决方案
<property name="hibernateProperties"> <props> <prop key="connection.useUnicode">true</prop> <prop key="connection.characterEncoding">utf-8</prop> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> </props> </property>
或者将url后面加入编码串,如下
<property name="url" value="jdbc:mysql://localhost:3306/s2sh?useUnicode=true&characterEncoding=UTF-8"></property>
注意 : 这里我的数据库编码是utf-8
具体那种方案好用大家可以尝试一下,我基本上直接将两种方式都加上了。
(4)下面我们开始写DAO层,首先创建test.s2sh.dao包放置Dao类的接口,创建test.s2sh.dao.impl包放置Dao类的实现。
PersonDAO.java
package test.s2sh.dao; import java.util.List; import test.s2sh.bean.Person; public interface PersonDAO { void savePerson(Person p); void removePerson(Person p); Person findPersonById(Integer id); List<Person> findAllPersons(); void updatePerson(Person p); }
由于使用了spring,所以DAO的实现类我们可以继承HibernateDaoSupport进行实现
PersonDAOImpl.java
package test.s2sh.dao.impl; import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import test.s2sh.bean.Person; import test.s2sh.dao.PersonDAO; public class PersonDAOImpl extends HibernateDaoSupport implements PersonDAO { public List<Person> findAllPersons() { String hql = "from Person p order by p.id desc"; return (List<Person>)this.getHibernateTemplate().find(hql); } public Person findPersonById(Integer id) { Person p = (Person) this.getHibernateTemplate().get(Person.class, id); return p; } public void removePerson(Person p) { this.getHibernateTemplate().delete(p); } public void savePerson(Person p) { this.getHibernateTemplate().save(p); } public void updatePerson(Person p) { this.getHibernateTemplate().update(p); } }
(5)下面我们开始进行service层的设计,这里的service层仅是简单调用DAO层的的方法。
同样是创建接口包(test.s2sh.service),实现包和接口类(test.s2sh.service.impl),实现类
PersonService.java
package test.s2sh.service; import java.util.List; import test.s2sh.bean.Person; public interface PersonService { List<Person> findAll(); void save(Person p); void delete(Person p); Person findById(Integer id); void update(Person p); }
这里我们需要使用spring的ioc将DAO诸如到service中,所以不要忘记在service实现类中加入DAO作为属性。
PersonServiceImpl.java
package test.s2sh.service.impl; import java.util.List; import test.s2sh.bean.Person; import test.s2sh.dao.PersonDAO; import test.s2sh.service.PersonService; public class PersonServiceImpl implements PersonService { private PersonDAO personDAO; public void delete(Person p) { this.personDAO.removePerson(p); } public List<Person> findAll() { return this.personDAO.findAllPersons(); } public Person findById(Integer id) { return this.personDAO.findPersonById(id); } public void save(Person p) { this.personDAO.savePerson(p); } public void update(Person p) { this.personDAO.updatePerson(p); } public PersonDAO getPersonDAO() { return personDAO; } public void setPersonDAO(PersonDAO personDAO) { this.personDAO = personDAO; } }
(6)接下来我们开始对action层进行设置,实际项目中的action可能会有很多,所以我们这里需要对action进行分包,因为我们这里针对Person进行操作,所以我们创建test.s2sh.action.person.
这里先做保存操作
SavePersonAction.java
package test.s2sh.action.person; import test.s2sh.bean.Person; import test.s2sh.service.PersonService; import com.opensymphony.xwork2.ActionSupport; public class SavePersonAction extends ActionSupport { private Person p; private PersonService service; public Person getP() { return p; } public void setP(Person p) { this.p = p; } public PersonService getService() { return service; } public void setService(PersonService service) { this.service = service; } public String execute() throws Exception { this.service.save(p); return this.SUCCESS; } public void validate() { if(p.getName()==null||"".equals(p.getName())){ this.addFieldError("p.name", "name is not null"); } } }
下面创建一个保存人员的提交页面
save.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Save Person</title> </head> <body> <s:form action="savePerson"> <s:textfield name="p.name" label="name"></s:textfield> <s:textfield name="p.age" label="age"></s:textfield> <s:submit></s:submit> </s:form> </body> </html>
操作成功页面
save-success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Save OK</title> </head> <body> 保存成功 <br> </body> </html>
接下来我们需要配置struts.xml,创建action
<action name="savePerson" class="savePersonAction"> <result name="success" type="redirect">/save-success.jsp</result> <result name="input">/save.jsp</result> </action>
由于现在的action的创建已经由spring所接管,所以这里class里面使用的是别名,该别名与applicationContext.xml中的id对应.
接下来我们需要配置applicationContext的ioc。
<bean id="personDAO" class="test.s2sh.dao.impl.PersonDAOImpl" scope="singleton"> <!-- 由于该类是继承于HibernateDaoSupport,所以需要将sessionFactory注入 --> <property name="sessionFactory" > <ref bean="sessionFactory"/> </property> </bean> <bean id="personService" class="test.s2sh.service.impl.PersonServiceImpl"> <property name="personDAO" ref="personDAO"></property> </bean> <bean id="savePersonAction" class="test.s2sh.action.person.SavePersonAction" scope="prototype"> <property name="service" ref="personService"></property> </bean>
这里说明一下spring中的单例与设计模式中的单例不同,设计模式的单例是在jvm中只产生一个实例,而spring中的单例
是针对每个ioc容器来言,如果存在两个ioc容器,那么每个ioc容器都会生成唯一的类实例
将sessionFactory注入Dao中,这里的Dao来说是无状态的,可以设置为单例singleton。这里的action是使用spring创建的。
struts2与struts1的action有所不同,因为struts2中的action中可能存在属性,这里是Person,所以struts2的action可能是有状态的。
如果是有状态的我们就需要将scope设置成原型模式,即每次请求都新建一个action。
不然可能会出现如果表单提交的第一次出错,之后就再也提交不过去了,值就是应为使用默认的singleton,
当第一次的时候就将FieldError中加入了错误,每次都是这个action,始终带着这个错误,所以就提交不过去了。
到目前为止这个整合已经完成了。
工程下载
评论
10 楼
Wesley.S
2014-10-06
GA 这是eclipse 还是 MyEclipse??
9 楼
taney_911
2012-04-19
在action 里面,单是save 就要单独写一个类,如果每一个action都写一个类,是不是太麻烦了,可以把针对person的所有的action都写在一起么?,还有就是我安装上面的步骤啦配置,在myeclipse里面redeploy的时候tomcat 这个项目就起不来,最后被我搞的tomcat的直接崩溃了,服务都起不来了,不知道怎么回事~~~
8 楼
scjingying
2012-03-29
zyb12qq 写道
弱弱地问下,action调用service的方法,然后servive调用DAO方法,在action里直接用DAO的方法不就行了?求指教!
dao是和数据库交互,service是业务逻辑,action是也页面交互,你觉得跳过逻辑层那样更好?
7 楼
zyb12qq
2011-10-03
弱弱地问下,action调用service的方法,然后servive调用DAO方法,在action里直接用DAO的方法不就行了?求指教!
6 楼
王文丰
2011-09-26
楼主的工程放的jar包有时并不适合所有的环境,我下了后加入自己的jar包,顺利运行了
5 楼
Mr.Cheney
2011-04-21
很感谢你 我心目中的大神!
4 楼
WSZ1102.shu
2011-03-21
我这里有例子,没有使用struts2的tag!
3 楼
pslff
2011-01-06
我自己也试过S2SH,但是每次都是添加spring,但是运行时根本没去spring配置文件去读bean,还是需要手动实例化每个类或action,web.xml中spring的监听器也加了的,就是不成功,请问有没有什么差不多的原因?
2 楼
fan243741016
2010-08-17
有没有更详细一点的例子啊?比如加上拦截器处理异常,出现异常跳转到一个错误页面,限时错误信息,加上log4j日志打印,把错误信息打印到文件。这方面我一直做不好!谢谢你了!
1 楼
243108698
2010-03-22
太感谢了,我下了好多个例子都没成功,谢谢你~~~
相关推荐
S2SH整合S2SH整合S2SH整合S2SH整合S2SH整合S2SH整合S2SH整合
包含了s2sh 整合所用的所有jar包,适合eclipse中导入实用。
s2sh整合的完整代码,希望大家喜欢。里面包含了一些基本的有用的东西
s2sh整合 所需其他jar包 打包下载 spring-dao.jar mysql-connector-java-5.1.6-bin.jar commons-dbcp.jar cglib-nodep.jar
最新S2SH整合所需jar包,最新的jar包,导入就可以编写代码了。
S2SH整合实例S2SH整合实例S2SH整合实例
s2sh整合annotation s2sh整合annotation s2sh整合annotation s2sh整合annotation s2sh整合annotation
基于Annotation的s2sh整合配置实现分页功能基于Annotation的s2sh整合配置实现分页功能基于Annotation的s2sh整合配置实现分页功能基于Annotation的s2sh整合配置实现分页功能基于Annotation的s2sh整合配置实现分页功能
s2sh整合实现增删改查带整合包可直接运行
本人也是一名自学者 该ssh框架整合包适合初学者,jar包比较全面,亲测成功,
s2sh整合步骤及配置文件配置s2sh整合步骤及配置文件配置s2sh整合步骤及配置文件配置s2sh整合步骤及配置文件配置
s2sh整合,s2sh,langsin,浪曦oa工作流源码。上传有限。里面没带jar文件 配置完整.
s2sh整合 源码 struts2 hibernate spring
s2sh常用的jar所用能够使用的jar份文件整理了方便使用
S2SH 整合全部jar包 S2SH 整合全部jar包 S2SH 整合全部jar包 S2SH 整合全部jar包 S2SH 整合全部jar包
该资源包含了一个S2SH整合的完整代码,注释详细,简单易懂。
做了一个简单的S2SH整合项目,实现注册、登录功能,附加了所用的jar包,所有代码都带有注释,一看就明白,有问题可以联系
s2sh整合总结(struts2.1.8-spring2.5-hibernate3.2) 三大框架
s2sh整合所需要的所有包 s2sh整合所需要的所有包 s2sh整合所需要的所有包
亲测,可用S2SH整合jar包 Struts2.16 Hibernate3.2 spring2.0