全新S2SH配置一步一步过程详解

准备:

 #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` ;
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/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
              http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd
              http://www.springframework.org/schema/txhttp://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的入门实例,我每一个操作都测试通过.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值