整合struts1.2+spring2.5+hibernate3.2实现简单登录

一、先准备写一份sql文件,用来创建数据库和表,我写了mysql和oracle版本的,比较简单,代码如下:

-- ---------------------------------------------
-- 使用mysql5.0
-- ---------------------------------------------
drop database if exists test_login;
-- 创建数据库
create database test_login;
use test_login;
-- 创建用户信息表t_user_info
create table if not exists t_user_info(
	uuid varchar(32) primary key,
	username varchar(32) not null,
	password varchar(32) not null,
	credits int,
	ip varchar(23),
	login_datetime datetime
)engine=InnoDB default charset=utf8;
-- 插入数据
insert into t_user_info values('32d222a5dfa','admin','123456',0,'176.19.35.2',now());
commit;
-- 创建用户日志表t_user_log
create table if not exists t_user_log(
	uuid varchar(32) primary key,
	user_id varchar(32),
	ip varchar(23),
	login_log_datetime datetime
)engine=InnoDB default charset=utf8;

-- ---------------------------------------
-- Oracle 10g 
-- ---------------------------------------
-- 创建用户
create user hyanqing identified by oracle;
-- 给用户授权
grant resource,connect,dba to hyanqing;
-- 创建用户信息表t_user_info
create table t_user_info(
  uuid varchar2(32) primary key,
  username varchar2(32) not null,
  password varchar2(32) not null,
  credits number,
  ip varchar2(23),
  login_datetime date
);
-- 插入数据
insert into t_user_info values('32d222a5dfa','admin','123456',0,'176.19.35.2',sysdate);
-- 创建用户日志表t_user_log
create table t_user_log(
  uuid varchar2(32) primary key,
  user_id varchar2(32),
  ip varchar2(23),
  login_log_datetime date
);

 二、打开myeclispe,创建一个web项目。再分别导入三者的jar包(别忘了要导入数据库驱动),我的导入顺序为:spring-hibernate-struts。在导入的时候可能会产生jar包冲突(这里有一些解决方式http://hyanqing1.iteye.com/admin/blogs/405329)。

三、为了方便切换mysql和oracle的连接池,新建了个属性文件(也可以直接写在spring的配置文件),顺便把日志文件log4j.properties也放到src源文件夹下,这样启动服务器可以看到更详细的信息。

#mysql
mysql.driverClassName = com.mysql.jdbc.Driver
mysql.url = jdbc:mysql://localhost:3306/test_login
mysql.username = root
mysql.password = root

mysql.dialect = org.hibernate.dialect.MySQLDialect

#Oracle
oracle.driverClassName = oracle.jdbc.driver.OracleDriver
oracle.url = jdbc:oracle:thin:@localhost:1521:orcl
oracle.username = hyanqing
oracle.password = oracle

oracle.dialect =org.hibernate.dialect.Oracle10gDialect

 然后打开spring的一个配置文件(加入spring时可以自动生成,若没有,新建一个spring bean文件)applicationContext.xml(名字自己定义,这里用这个),在里面加入如下代码:

	<!-- 使用外部属性文件 -->
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:jdbc.properties</value>
			</list>
		</property>
		<property name="fileEncoding" value="UTF-8"></property>
	</bean>
	<!-- 配置数据源 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${oracle.driverClassName}"/>
		<property name="url" value="${oracle.url}"/>
		<property name="username" value="${oracle.username}" />
		<property name="password" value="${oracle.password}" />
	</bean>

  四、在上面的步骤中顺便完成PO映射文件(不一定),这样可以来集成hibernate,把下面的一段代码继续加在applicationContext.xml中:

	<!-- 集成hibernate -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<property name="mappingResources">
			<list>
				<value>com/login/entity/UserInfo.hbm.xml</value>
				<value>com/login/entity/UserLoginLog.hbm.xml</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">${oracle.dialect}</prop>
				<prop key="hibernate.show_sql">true</prop>
			</props>
		</property>
	</bean>

    接下来,可以配置事务功能,(是在业务层添加的),采用spring2.x全新方式tx/aop方式的,如下:

	<!-- 配置Hibernate事务策略 -->
	<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	
	<!-- 配置tx/aop声明式事务 -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="find*" propagation="REQUIRED" read-only="true"/>
			<tx:method name="save*" propagation="REQUIRED"/>
			<tx:method name="update*" propagation="REQUIRED"/>
			<tx:method name="*" propagation="SUPPORTS" read-only="true" />
		</tx:attributes>
	</tx:advice>

	<aop:config>
		<aop:pointcut id="productServiceMethods" expression="execution(* com.login.business.*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="productServiceMethods" />
	</aop:config>

 

  这样hibernate就集成到了spring中,可以享用spring依赖注入和一些spring封装的hibernate模版。

五、写DAO层和Business层(整个过程都可以做的,这里略)

       下面是一段DAO层的配置代码:

    

	<!-- DAO层的配置 -->
	<bean id="userInfoDAO" class="com.login.DAO.UserInfoDAOImpl">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>

       下面是一段business层的配置代码如下:

 

	<!-- business层的配置 -->
	<bean id="userInfoManager" class="com.login.business.UserInfoManagerImpl">
		<property name="userInfoDAO" ref="userInfoDAO"></property>
		<property name="userLoginLogDAO" ref="userLoginLogDAO"></property>
	</bean>

    在实际的开发当中,这两层的配置文件都是单独出来,还有的是每个模块单独划出来,以减少团队的文件冲突数。

六、打开web.xml,引入spring框架

<!-- 引入spring -->
 <context-param>
 	<param-name>contextConfigLocation</param-name>
 	<param-value>classpath:config/*.xml,classpath:config/**/*.xml</param-value>
 </context-param>
 <listener>
 	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

 

七、整合struts。在加入struts时会自动在web.xml文件中载入如下代码(myeclispe自动生成,也可以手动配置):

<!-- struts -->
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

使用struts时,配置action的时候可以享用spring的注入,同时spring的配置文件中的bean的name属性与struts-config.xml中action配置的path一致且spring中的scope="prototype",因为每次请求都会产生一个实例,spring中配置如下:

	<!-- Struts Action -->
	<bean name="/userLogin" class="com.login.struts.action.UserLoginAction" scope="prototype">
		<property name="userInfoManger" ref="userInfoManager"></property>
	</bean>

 struts-config.xml中配置(注意action的type属性:type="org.springframework.web.struts.DelegatingActionProxy">,采用spring的代理)如下:

    <action
      input="/index.jsp"
      name="userInfoForm"
      path="/userLogin"
      scope="request"
      validate="true"
      type="org.springframework.web.struts.DelegatingActionProxy">
      <forward name="suc" path="/loginOk.jsp"></forward>
      <forward name="input" path="/index.jsp"></forward>
    </action>

 这样,三者之间的配置文件就差不多了,写的有点乱,这样你就可以根据上面的架子增加各层的文件,如PO映射文件、DAO层、business层、struts的FormBean和Action以及一些jsp页面等等。

你可能感兴趣的:(spring,oracle,Hibernate,bean,struts)