您的位置:首页 > 其它

全新S2SH配置一步一步过程详解 转载请注明

2010-08-21 16:02 357 查看
大家转载的时候,一定要注明出处,多谢!!

准备:

#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的入门实例,我每一个操作都测试通过.

下面是完整的源码列表界面,如果谁要源码,可以加我索要!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: