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
主页面,随便写点东西