大家转载的时候,一定要注明出处,多谢!!
准备:
#mysql5.0
#eclipse 3.5
#jdk 1.6
#java EE 5.0
#tomcat 7.0
#struts 2.2.1
#hibernate 3.5.5
#spring 2.5.6 (关于spring3.0.4,期待下次吧)
#junit 4.8
创建数据库mytestdb
===============================================================
DROP DATABASE IF EXISTS `mytestdb`;
CREATE DATABASE `mytestdb` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `mytestdb`;
#
# Source for table wl_user
#
DROP TABLE IF EXISTS `wl_user`;
CREATE TABLE `wl_user` (
`USERID` int(11) NOT NULL,
`USERNAME` varchar(30) DEFAULT NULL,
`PASSWORD` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
===============================================================
1、建立一个新空的web项目 testWeb,里面只有一个index.jsp 部署到tomcat测试(测试通过)
2、配置Struts2 (Struts2.2.1 测试通过)
# 配置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>
# classpath目录下新建struts.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!--这部分内容必不可少,是文档定义格式 begining.......-->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<!--这部分内容必不可少,是文档定义格式endding.......-->
<struts>
</struts>
#加入最少jar包
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
freemarker-2.3.16.jar
javassist-3.7.ga.jar
ognl-3.0.jar
struts2-core-2.2.1.jar
xwork-core-2.2.1.jar
说明:struts2的相关错误提示,见blog.csdn.net/coolwzjcool
3、配置Hibernate (Hibernate3.5.5Final 测试通过)
#加入最少jar包
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
jta-1.1.jar
slf4j-api-1.6.1.jar
slf4j-nop-1.6.1.jar
hibernate3.jar
#新建Hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://192.168.100.56:3306/mytestdb</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="show_sql">true</property>
<mapping resource="cn/com/wzj/domainobjects/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
#数据库驱动(这里使用mysql)
mysql-connector-java-3.0.17-ga-bin.jar(mysql 5.0 驱动)
#新建User javaBean类
public class User implements Serializable{
private Integer userid;
private String username;
private String password;
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
#新建User.hbm.xml (所有的属性必须是User类属性的子集)
<?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 package="cn.com.wzj.domainobjects">
<class name="User" table="WL_USER">
<id name="userid" column="USERID">
<generator class="increment" />
</id>
<property name="username" type="string" column="USERNAME" />
<property name="password" type="string" column="PASSWORD" />
</class>
</hibernate-mapping>
#测试Hibernate
@新建HibernateUtil类
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
@测试类
public class SaveUser {
public void saveHibUser(){
User user = new User();
user.setUsername("testHib");
user.setPassword("123");
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
Transaction tx= session.beginTransaction();
session.save(user);
tx.commit();
session.close();
}
public static void main(String arg[]){
SaveUser u = new SaveUser();
u.saveHibUser();
}
}
直接java Application运行SaveUser即可,保存数据到mysql数据库.测试成功
#测试Hibernate二:
@修改LoginAction 在“return SUCCESS;”前增加如下代码
User user = new User();
user.setUsername(username);
user.setPassword(password);
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
Transaction tx= session.beginTransaction();
session.save(user);
tx.commit();
session.close();
@修改web.xml 增加下面参数
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:hibernate.cfg.xml
</param-value>
</context-param>
在初始页面login.jsp 输入admin,001 提交,即可看到数据库有记录插入
#问题:
@属性的定义尽量不使用int,long等,使用Integer,Long.....
@直接运行HibernateUtil类,能否创建数据表?启动web容器能否创建表?我这里都没有自动创建,create属性是添加了。请大家帮忙!
@session.save(Object o);的前面必须添加Transaction,之后要commit();否则数据将不能更新到数据库。
在sessionFactory.openSession()中,hibernate会初始化数据库连接,与此同时,将其AutoCommit 设为关闭状态(false)。而其后,在Session.beginTransaction 方法中,Hibernate 会再次确认Connection 的AutoCommit 属性被设为关闭状态( 为了防止用户代码对session 的Connection.AutoCommit属性进行修改)。
这也就是说,我们一开始从SessionFactory获得的session,其自动提交属性就已经被关闭(AutoCommit=false),下面的代码将不会对数据库产生任何效果:
session = sessionFactory.openSession();session.save(user);session.close();
session = sessionFactory.openSession();
session.save(user);
session.close();
这实际上相当于 JDBC Connection的AutoCommit属性被设为false,执行了若干JDBC操作之后,没有调用commit操作即将Connection关闭。如果要使代码真正作用到数据库,我们必须显式的调用Transaction指令:
session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(user);
tx.commit();
session.close();
4、配置Spring (Spring2.5.6 测试通过)
#加入最少jar包
spring.jar
commons-logging.jar
说明:spring.jar是包含有完整发布的单个jar包,spring.jar中包含除了 spring-mock.jar里所包含的内容外其它所有jar包的内容,
因为只有在开发环境下才会用到spring-mock.jar来进行辅助测试,正式应用系统中是用不得这些类的。除了spring.jar文件,
Spring还包括有其它13个独立的jar包,各自包含着对应的Spring组件,用户可以根据自己的需要来选择组合自己的jar包,
而不必引入整个spring.jar的所有类文件。这里,为了使用方便,我们引入整个spring.jar。
#在classpath下新建applicationContext.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
</beans>
#测试spring
@新建SpringUtil.java
public class SpringUtil {
public static void main( String[] args ) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) ac.getBean("User");
System.out.println( "Hello:" + user.getUsername() + ";password is " + user.getPassword() );
}
}
@在applicationContext.xml中增加<bean>
<bean id="User" class="cn.com.wzj.domainobjects.User">
<property name="username" value="张飞"></property>
<property name="password" value="123"></property>
</bean>
测试结果: Hello:小张;password is 123
#测试spring二
@修改web.xml文件 增加如下内容,web容器加载applicationContext.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>
@其它配置,该测试不进行了,下面会说到S2SH的集成.
5、Spring与Struts整合
#导入jar包
struts2-spring-plugin-2.2.1.jar
#配置Web.xml 增加listener
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
此外添加:(不知道listener能否得到applicationContext.xml,我这里只有添加下面的信息,才可以使用。)
<param-value>
classpath:applicationContext.xml
</param-value>
注意:Web.xml中加载顺序为:context-param -> listener -> filter -> servlet
加载顺序与它们在 web.xml 文件中的先后顺序无关,但同一类,还是按照顺序加载的
#在applicationContext.xml中增加Action的Bean
<bean id="loginAction" class="cn.com.wzj.action.LoginAction" scope="prototype">
</bean>
#修改struts.xml文件,将loginAction的class属性换成spring里配置的bean名
<action name="login" class="cn.com.wzj.action.LoginAction">...</action>
<action name="login" class="loginAction"></action>
这里,class值设为了loginAction,即LoginAction类的bean的ID。这样我们就把LoginAction类交给了spring管理。
6、Spring与Hibernate整合
主要是对hibernate的Session进行管理,包含Session的生命周期管理。使用Aop对事务进行管理。
#配置sessionFactory,让spring来创建Session,applicationContext.xml中增加代码:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
#去掉Web.xml里关于Hibernate的配置
<param-value>
classpath:hibernate.cfg.xml
</param-value>
#配置事务处理
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!--事务通知 对于以save、del、update开头的方法应用事务-->
<tx:advice id="smAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 给cn.com.wzj.service.impl下的所有类的所有方法应用smAdvice -->
<aop:config>
<aop:pointcut id="smMethod" expression="execution(* cn.com.wzj.service.impl.*.*(..))"/>
<aop:advisor pointcut-ref="smMethod" advice-ref="smAdvice"/>
</aop:config>
7、其余配置与编码修改
#新增UserService接口
public interface UserService {
public void saveUser(User user);
}
#新增service.impl下UserService实现类UserServiceImpl
public class UserServiceImpl implements UserService{
public void saveUser(User user){
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session session = sf.openSession();
Transaction tx= session.beginTransaction();
session.save(user);
tx.commit();
session.close();
}
}
#修改LoginAction
@增加属性userService,并生成getter/setter方法
@增加如下代码:
//一般来说,页面form提交过来的就是一个bean不需要进行再赋值.本实例需要如此操作!
User user = new User();
user.setUsername(username);
user.setPassword(password);
userService.saveUser(user);
#修改applicationContext.xml文件
@增加userService Bean
<bean id="userService" class="cn.com.wzj.service.impl.UserServiceImpl" scope="prototype">
</bean>
@修改loginAction Bean
<bean id="loginAction" class="cn.com.wzj.action.LoginAction" scope="prototype">
<property name="userService"></property>
</bean>
#增加jar包
aspectjweaver.jar 解决org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException异常
至此,SSH的配置完成以及测试成功.
8、进一步完善
可以发现UserServiceImpl的saveUser(User user)里面写的是不合理的,怎么能够再一次调用config文件?
由于配置了Spring的AOP事务进行如下操作:
#配置applicationContext.xml文件,将sessionFactory作为属性注入到userService
<bean id="userService" class="cn.com.wzj.service.impl.UserServiceImpl" scope="prototype">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
#修改cn.com.wzj.service.impl.UserServiceImpl文件
@增加sessionFactory属性,并生成getter/setter方法
@修改saveUser(User user)方法
public class UserServiceImpl implements UserService{
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void saveUser(User user){
Session session=sessionFactory.openSession();
Transaction tx= session.beginTransaction();
session.save(user);
tx.commit();
System.out.println("commit..");
}
}
至此,这一阶段的工作就结束了。
如果有精力,还可以将saveUser(User user)里面的方法再进行封装,
简单来说,可以使用dao类来调用,这个dao类可以进行一些保存等操作.最终就是里面只有一个dao.save(user);
浪费了一天,终于写完了一个S2SH的入门实例,我每一个操作都测试通过.
下面是完整的源码列表界面,如果谁要源码,可以加我索要!