Java EE SSH框架之整合(登录功能)


SSH三大框架整合原理见下图:

了解大致原理之后就是导包

一、导包

(最终,WEB_INF的lib下一共40个jar包)

若懒得自己去找直接用我的也可以——》Baidu网盘链接:https://pan.baidu.com/s/1rVESEVjq_eAp8bUDFjrx_Q  密码:bcnl

Struts2:①apps下的Struts2-blank所有包,注意,图中选中的javassist包会与hibernate中的重复,导入的时候别导重了;

              ②Struts2整合Spring插件包struts2-spring-plugin,这个包一旦导入,Struts2在启动时就会寻找Spring容器,找不到将会抛出异常!

  


hibernate:①required下的所有包   ② jpa(java持久化规范,Java Persist API,里面都是接口) ③数据库连接资源

     


Spring:①4+2(core+beans+context+expression 和 logging+log4j)    ②整合Web:Web包(spring-web)     

              ③整合AOP:4个(spring-aop+spring-aspect+aop联盟+aopweaving)

              ④整合hibernate和事务:4个(spring-jdbc + spring-tx + spring-orm + c3p0)    ⑤ Junit4测试(spring-test)

Spring导包较为复杂,涉及到的路径大家可以参考我前几篇文章Spring,里面jar包的路径都已详细说明,点击上述链接即可。

补充一下spring-orm、spring-test、spring-web包的路径




二、单独整合Spring容器到Web项目

First. src下new一个applicationContext.xml配置文件,并导入约束(4个,beans、context、aop、tx)

详情请见我的Spring第一篇第二篇,完成之后如下


Second.  在创建一个UserAction类,添加到Spring容器中。


Third.  web.xml里配置监听器——让Spring容器随着Web的启动而创建

web-app标签下添加listener元素,及其子元素listener-class。

  Ctrl+Shift+T打开搜索ContextLoaderListener(该类在spring-web包中,保证该包已导入),copy它的完整类名到listener-class元素内容中,如下:



Forth.  继续在web.xml文件里配置Spring配置文件位置参数


在刚刚打开的ContextLoaderListener.class中,Ctrl进入ContextLoader类中,找到常量CONFIG_LOCATION_PARAM的值,复制粘贴到param-name中,param-value里为classpath:applicationContext.xml





三、单独整合Struts2到Web项目

First.  src下new一个Struts的配置文件struts.xml,导入DTD约束

在Java Resources->Libraries->Web App Libraries下找到之前导入的struts2-core的jar包,

展开,找到最新版本(2.3)的一个.dtd,打开,找到如下约束,copy到struts.xml的头部。


写一个临时的struts元素

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="SHH01" namespace="/" extends="struts-default">
		<action name="UserAction_*" class="com.zl.action.UserAction" method="{1}">
			<result name="success">/success.jsp</result>
		</action>
	</package>
</struts>

success.jsp 文件里面随便写点东西,就可以了,暂时不考虑其显示内容!


Second.   web.xml中配置Struts2核心过滤器

    两个filter-name里的内容必须保持一致,内容是什么无所谓,url-pattern里填“/*”表示全部路径都经过Struts;

   元素filter-class里的内容:Ctrl+Shift+T打开搜索StrutsPrepareAndExecuteFilter,copy其完整类名

<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>


四、整合Struts2和Spring

First. 配置常量

在Java Resources->Libraries->Web App Libraries下找到之前导入的struts2-core的jar包下的default.properties文件找到如下常量,再在struts.xml中配置:

  



_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    在整合之前,简单添加了IUserService接口和UserServiceImpl类,还有实体类User。UserAction中添加了UserServiceImpl属性,及其setter方法!注意属性名与Spring中的一致。



_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _


Second. 

     整合方案一(不推荐): struts.xml的配置文件 action元素的class属性仍然配置Action的完整类名。

       这种方式相当于是一种半整合状态,Struts2仍然自己创建Action,由Spring负责组装Action中的依赖属性。

       这种方案不推荐使用,because,最好由Spring完整管理Action的生命周期,Spring的AOP等功能是针对Spring管理的对象才有的功能,这样的话,Spring中的功能才能应用到Action中。

         

     整合方案二:   struts.xml的配置文件 action元素的class属性填写Spring中Action对象的bean 的name。

         这种方式是完全由Spring管理Action的生命周期,包括Action的创建。注意:这种方式需要手动组装依赖属性! 

         applicationContext.xml里配置Action和Service

      

      这里我用的是setter方式注入的,注意UserAction类中的属性usi和这里的userAction的property元素的name要对应,否则会报错——Bean property '×××' is not writable or has an invalid setter method!


    下面struts.xml里配置Action,注意class属性的值是Spring中bean元素的name值

    


写了这么多,要测试一下,免的到最后错误一大堆,我们给UserAction里添加一个方法,名字随意,不过与待会儿要访问的路径有关,我写了一个login方法(左),打印usi对象(usi是Spring容器帮我们创建的,若uri打印成功说明我们到这一步就成功了,我在这里犯了一个错误就是setter注入usi时没有与Spring中的该对象名称保持一致)。

访问地址:http://localhost:8080/SSH01/UserAction_login




五、单独配置hibernate

User类

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zl.domain" >
	<class name="User" table="sys_user" >
		<id name="user_id"  >
			<generator class="native"></generator>
		</id>
		<property name="user_code"  ></property>
		<property name="user_name"  ></property>
		<property name="user_password"  ></property>
		<property name="user_state"  ></property>
	
	</class>
</hibernate-mapping>

hibernate主配置文件,注意“隔离级别”和“与当前线程绑定”的属性不要在hibernate主配置文件中配置,否则以后会与Spring中的冲突!

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=UTF-8</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

		<!-- 指定事务的隔离级别 ,spring事务管理中会管理 ,不要在这配
		<property name="hibernate.connection.isolation">4</property> -->
		
		
        <!-- Enable Hibernate's automatic session context management -->
        <!-- 指定session与当前线程绑定 ,spring中有管理session的机制,会冲突,不要在这配
        <property name="current_session_context_class">thread</property>-->


        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
         <property name="hibernate.format_sql">true</property> 

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>

        <mapping resource="com/zl/domain/User.hbm.xml"/>
        
    </session-factory>
</hibernate-configuration>

写一个测试类测试一下:

public class HibernateTest {
	@Test
	public void test01() {
		Configuration conf = new Configuration().configure();
		SessionFactory sf = conf.buildSessionFactory();
		Session session = sf.openSession();
		Transaction tx =session.beginTransaction();
		
		User u = new User();
		u.setUser_code("Tomy");
		u.setUser_name("haha");
		
		session.save(u);
		
		tx.commit();
		session.close();
        }
 }

    数据插入成功即可!

六、整合hibernate与Spring

First 将SessionFactory配置到Spring容器中

   Spring配置文件中再写一个bean,bean的name就用sessionFactory。Ctrl+Shift+T搜索LocalSessionFactory类,根据自己使用的hibernate版本(我的是5),打开该类,copy它的完整类名到class属性中

<!-- 将SessionFactory配置到Spring容器中 -->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"></bean>

Second. 加载配置,属性配置到sessionFactory中,有两个方案:

   方案一(不推荐,配置文件太多了):仍然使用外部的hibernate.cfg.xml配置信息

       在sessionFactory的bean元素中添加property元素

<!-- 将SessionFactory配置到Spring容器中 -->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>

   写一个测试方法,测试一下:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class HibernateTest {
	@Resource(name="sessionFactory")
	private SessionFactory sf;
	@Test
	public void test02() {
		//这里没有自己创建sessionFactory哟,是由Spring容器替我们创建的
		Session session = sf.openSession();
		Transaction tx =session.beginTransaction();
		
		User u = new User();
		u.setUser_code("小米");
		u.setUser_name("米兔");
		u.setUser_password("12345");
		session.save(u);
		
		tx.commit();
		session.close();
        }	
}

       数据库中插入了一条记录


   方案二(推荐):在Spring配置中放置hibernate配置信息,这样的话,之前的hibernate.cfg.xml就废弃掉了

<!-- 方案2  配置hibernate基本信息-->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
	<property name="hibernateProperties">
		<props>
			<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
			<prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/testhibernate?useUnicode=true&characterEncoding=UTF-8</prop>
			<prop key="hibernate.connection.username">root</prop>
			<prop key="hibernate.connection.password">123456</prop>
			<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
			<!-- 上面5个必须配置,下面三个可选 -->
			<prop key="hibernate.show_sql">true</prop>
			<prop key="hibernate.format_sql">true</prop>
			<prop key="hibernate.hbm2ddl.auto">update</prop>
		</props>
	</property>
	<!-- 引入ORM元数据,指定ORM元数据所在的包路径,Spring会自动读取包中的所有配置 -->
	<property name="mappingDirectoryLocations" value="classpath:com/zl/domain"></property>
</bean>

测试一下方案一中的代码,查看一下数据库。



七、Spring整合c3p0连接池

First.  src下新建一个db.properties文件

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///test
jdbc.user=root
jdbc.password=123456

Second.  Spring容器中配置c3p0连接池

<!-- 指定Spring读取db.properties配置 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置c3p0连接池 -->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
	<property name="driverClass" value="${jdbc.driverClass}"></property>
	<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
	<property name="user" value="${jdbc.user}"></property>
	<property name="password" value="${jdbc.password}"></property>
</bean>
hibernateProperties中获得数据库连接的四行注释掉或者删除掉


Third.  将dataSource注入到sessionFactory中

<!-- 将连接池注入到sessionFactory中,hibernate会通过连接池 获得连接-->
<property name="dataSource" ref="dataSource"></property>


八、HibernateTemplate模板操作数据库

First.  IUserDao接口,UserDaoImpl实现类继承HibernateDaoSupport,

这里是单表查询,涉及到的比较简单,所以没有用原生SQL语句查询,用HQL或者criteria查询

package com.zl.dao.impl;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate5.HibernateCallback;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.zl.dao.IUserDao;
import com.zl.domain.User;

//HibernateDaoSupport为dao注入sessionFactory
public class UserDaoImpl extends HibernateDaoSupport implements IUserDao {
	
	@Override
	public User getByUserCode(final String usercode) {
		//HQL
		return getHibernateTemplate().execute(new HibernateCallback<User>() {

			@Override
			public User doInHibernate(Session session) throws HibernateException {
				String hql = "from User where user_code = ?";
				Query query = session.createQuery(hql);
				query.setParameter(0, usercode);
				User user = (User) query.uniqueResult();
				return user;
			}
			
		});
		
		//Criteria
		/*DetachedCriteria dc = DetachedCriteria.forClass(User.class);
		dc.add(Restrictions.eq("user_code", usercode));
		
		List<User> list =(List<User>)getHibernateTemplate().findByCriteria(dc);
		if(list != null && list.size()>0) {
			return list.get(0);
		}else {
			return null;
		}*/
		
	}
}

Second.  Spring容器配置dao

<!-- dao --> 
<bean name="userDao" class="com.zl.dao.impl.UserDaoImpl">
    <!-- 注入sessionFactory -->
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>

测试一下:





九、整合Spring的AOP事务

First.   Spring中配置核心事务管理器

<!-- 配置核心事务管理器 -->
<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>

Second.   配置AOP事务,可以用XML配置,也可以注解配置

    方式一:XML配置:

        配置通知:

<!-- 配置通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
	 <!-- 以后配置大量事务时,需要使用通配符配置增删改查 -->
	 <!-- 以方法为单位,指定方法应该有什么事务属性,isolation隔离级别,propagation传播行为,read-only是否只读 -->
	 <tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
	 <tx:method name="persist*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
	 <tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
	 <tx:method name="motified*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
	 <tx:method name="remove*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
	 <tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
	 <tx:method name="get*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/>
	 <tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/>
    </tx:attributes>
</tx:advice>

        配置织入:

<!-- 配置将通知织入目标对象 -->
<aop:config>
    <!-- 配置切点 -->
    <aop:pointcut expression="execution(* com.zl.service.impl.*ServiceImpl.*(..))" id="txPc"/>
    <!-- 配置切面 -->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPc"/>
</aop:config>

   !!! 配置织入时,注意表达式:(* com.zl.service.impl.*ServiceImpl.*(..))中,*和后面的一定要有空格,否则会报如下的错误信息: Pointcut is not well-formed: expecting 'name pattern' at character position...


测试:Service层和Dao层分别添加一个save方法:

      IUserService接口添加一个save方法,UserServiceImpl实现save方法且添加IUserDao属性和setter和getter方法:

          

     IUserDao接口添加一个save方法,UserDaoImpl实现save方法:

          

    测试方法数据库表的变化

         



   方式二:注解配置:

       Spring中开启注解事务:

<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

       在Service类中使用Transactional注解:

package com.zl.service.impl;

import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.zl.dao.IUserDao;
import com.zl.domain.User;
import com.zl.service.IUserService;

@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=true)
public class UserServiceImpl implements IUserService {
	private IUserDao ud;
	
	public IUserDao getUd() {
		return ud;
	}

	public void setUd(IUserDao ud) {
		this.ud = ud;
	}

	@Override
	public User getUserByCodePassword(User u) {
		System.out.println("getUserByCodePassword");
		return u;
	}

	@Override
	@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)
	public void saveUser(User u) {
		ud.save(u);
	}

}

 

十、扩大session作用范围

    为了使用懒加载时出现no-session问题,需要扩大session的作用范围。

在web.xml里面配置:

     注意:web.xml的执行是有顺序的。任何filter一定要在Struts的filter之前调用,因为Struts一旦进去流程,是没有放行代码的,后序的过滤器都将不会被执行。

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<display-name>SSH01</display-name>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	
	<!-- 让Spring容器随着Web的启动而创建的监听器 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
	<!-- 配置Spring配置文件位置参数 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	
	<!-- 扩大session作用范围 -->
	<!-- 注意:web.xml的执行是有顺序的。任何filter一定要在Struts的filter之前调用,因为Struts一旦进去流程,是没有放行代码的
            ,后序的过滤器都不会被执行-->
	<filter>
		<filter-name>openSessionInView</filter-name>
		<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>openSessionInView</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<!-- Struts2核心过滤器 -->
	<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>
</web-app>


***************************************************************************************************************

基本配置到此完成了,下面实现登录业务:

先从Action开始写

package com.zl.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.zl.domain.User;
import com.zl.service.IUserService;

public class UserAction extends ActionSupport implements ModelDriven<User>{
	private IUserService usi;
	private User user = new User();
	
	public void setUsi(IUserService usi) {
		this.usi = usi;
	}

	public String login() throws Exception {
		//1.调用Service执行登录逻辑
		User u = usi.getUserByCodePassword(user);
		//2.将返回的User对象放入session域
		ActionContext.getContext().getSession().put("user", u);
		//3.重定向到项目首页
		return "toHome";
	}

	@Override
	public User getModel() {
		
		return user;
	}
}

struts.xml


Service层的getUserByCodePassword()方法:

完整的UserServiceImpl类:

package com.zl.service.impl;

import com.zl.dao.IUserDao;
import com.zl.domain.User;
import com.zl.service.IUserService;

public class UserServiceImpl implements IUserService {
	private IUserDao ud;
	
	public IUserDao getUd() {
		return ud;
	}

	public void setUd(IUserDao ud) {
		this.ud = ud;
	}

	@Override
	public User getUserByCodePassword(User u) {
		//1.根据登录名称查询登录用户
		User existU = ud.getByUserCode(u.getUser_code());
		//2.判断用户是否存在,不存在=》抛出异常,提示用户名不存在
		if(existU == null) {
			throw new RuntimeException("用户不存在!");
		}
		//3.判断用户密码是否正确,不正确=》抛出异常,提示密码错误
		if(!existU.getUser_password().equals(u.getUser_password())) {
			throw new RuntimeException("用户密码错误!");
		}
		
		//4.返回查询到的用户对象
		return existU;
	}

	@Override
	public void saveUser(User u) {
		ud.save(u);
	}

}

struts.xml中添加Exception处理截图以及完整的struts.xml代码:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<!-- struts.objectFactory = spring    将Action的创建交给Spring容器
		 struts.objectFactory.spring.autoWire = name   Spring负责自动装配Action依赖属性-->
	<constant name="struts.objectFactory" value="spring"></constant>
	
	<package name="SHH01" namespace="/" extends="struts-default">
		
		<global-exception-mappings>
			<exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
		</global-exception-mappings>
		
		<action name="UserAction_*" class="userAction" method="{1}">
			<result name="toHome" type="redirect">/index.jsp</result>
			<result name="error">/login.jsp</result>
		</action>
	</package>
</struts>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context"
    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-4.2.xsd 
	        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd 
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd 
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
	
    <!-- 指定Spring读取db.properties配置 -->
    <context:property-placeholder location="classpath:db.properties"/>
    <!-- 配置c3p0连接池 -->
    <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
	<property name="driverClass" value="${jdbc.driverClass}"></property>
	<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
	<property name="user" value="${jdbc.user}"></property>
	<property name="password" value="${jdbc.password}"></property>
    </bean>
	
    <!-- 配置核心事务管理器 -->
    <bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
	<property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <!-- 配置通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
	<tx:attributes>
	    <!-- 以后配置大量事务时,需要使用通配符配置增删改查 -->
	    <!-- 以方法为单位,指定方法应该有什么事务属性,isolation隔离级别,propagation传播行为,read-only是否只读 -->
	    <tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
	    <tx:method name="persist*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
	    <tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
	    <tx:method name="motified*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
	    <tx:method name="remove*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
	    <tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
	    <tx:method name="get*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/>
	    <tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    <!-- 配置将通知织入目标对象 -->
    <aop:config>
	<!-- 配置切点 -->
	<aop:pointcut expression="execution(* com.zl.service.impl.*ServiceImpl.*(..))" id="txPc"/>
	<!-- 配置切面 -->
	<aop:advisor advice-ref="txAdvice" pointcut-ref="txPc"/>
    </aop:config>
	
    <!-- 将SessionFactory配置到Spring容器中 -->
    <!-- 方案1.引入hibernate主配置文件,不推荐
    <bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
	<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
    </bean>-->
    <!-- 方案2  配置hibernate基本信息-->
    <bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
	<!-- 将连接池注入到sessionFactory中,hibernate会通过连接池 获得连接-->
	<property name="dataSource" ref="dataSource"></property>
	<property name="hibernateProperties">
	    <props>
		<!-- c3p0连接池中配置
                <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
		<prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/testhibernate?useUnicode=true&characterEncoding=UTF-8</prop>
		<prop key="hibernate.connection.username">root</prop>
		<prop key="hibernate.connection.password">123456</prop>-->
		<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
		<!-- 上面5个必须配置,下面三个可选 -->
		<prop key="hibernate.show_sql">true</prop>
		<prop key="hibernate.format_sql">true</prop>
		<prop key="hibernate.hbm2ddl.auto">update</prop>
	    </props>
	</property>
	<!-- 引入ORM元数据,指定ORM元数据所在的包路径,Spring会自动读取包中的所有配置 -->
	<property name="mappingDirectoryLocations" value="classpath:com/zl/domain"></property>
    </bean>
	
    <!-- action -->
    <!-- 注意,Action对象作用范围一定是多例的,这样才符合Struts2架构 -->
    <bean name="userAction" class="com.zl.action.UserAction" scope="prototype">
	<property name="usi" ref="usi"></property>
    </bean>
	
    <!-- service -->
    <bean name="usi" class="com.zl.service.impl.UserServiceImpl">
	<property name="ud" ref="userDao"></property>
    </bean>
	
    <!-- dao --> 
    <bean name="userDao" class="com.zl.dao.impl.UserDaoImpl">
	<!-- 注入sessionFactory -->
	<property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
</beans>

jsp页面:

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录</title>
</head>
<body>
	<form name="form1" action="${pageContext.request.contextPath}/UserAction_login" method="post">
		<table align="center" border="0">
			<tr>
				<td>登录名:</td>
				<td><input type="text" name="user_code" value="${user_code}"></td>
			</tr>
			<tr>
				<td>密码:</td>
				<td><input type="password" name="user_password" value="${user_password}"></td>
			</tr>
		</table>
		<p align="center">
		 	<input type="submit" value="登录">  
			<input type="reset" value="重置">  <br>
			<font color="red"><s:property value="exception.message"/></font>
		</p>
	</form>
	<p align="center" ><font size="2">还没有账号?<a href="">马上去注册</a></font></p>
</body>
</html>

index.jsp

主页面,随便写点东西


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值