/**
* @Description TODO(采用Spring的注解调试,仅仅支持Spring3.1及以上)
* @author Ni Shengwu
*
*/
/*
* Spring3.1后多了个spring-test-4.2.4.RELEASE.jar包,这个jar包专门用来支持JUnit基于注解的测试的,该jar包在spring-4.2.4-core中
* 该jar包里有个SpringJUnit4ClassRunner.class,用@RunWith注解加进来即可
*
* 注解@ContextConfiguration表示将ApplicationContext对象注入进来,就不用像以往那样在测试程序里先new了,直接使用
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:beans.xml")
public class SSHTest {
@Resource
private Date date;
@Test //测试Spring IOC的开发环境
public void springIoc() {
System.out.println(date);
}
}
drop database if exists shop; create database shop default character set utf8; use shop; drop table if exists category; create table category ( /* 类别编号,自动增长 */ id int not null auto_increment, /* 类别名称 */ type varchar(20), /* 类别是否为热点类别,热点类别才有可能显示在首页*/ hot bool default false, /* 设置类别编号为主键*/ primary key (id) );
public class HibernateSessionFactory {
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); //sessionFactory中用的是线程池技术
private static org.hibernate.SessionFactory sessionFactory; //sessionFactory:创建session的工厂
private static Configuration configuration = new Configuration();
private static ServiceRegistry serviceRegistry;
static { //类加载时初始化sessionFactory
try {
configuration.configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry); //Hibernate4中创建sessionFactory的方法
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
private HibernateSessionFactory() { //私有构造方法阻止new出对象,保证sessionFactory的单例
}
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get(); //从线程池中拿session
if (session == null || !session.isOpen()) { //如果线程池是空的,或者session打开失败
if (sessionFactory == null) {
rebuildSessionFactory(); //如果sessionFactory是空的,那就再创建一次,和static部分一样的
}
session = (sessionFactory != null) ? sessionFactory.openSession() : null; //sessionFactory不为空就创建一个session
threadLocal.set(session); //然后把这个session放到线程池中,下次再拿
}
return session;
}
public static void rebuildSessionFactory() {
try {
configuration.configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
} catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
public static org.hibernate.SessionFactory getSessionFactory() {//提供一个公共接口让外界获得这个单例sessionFactory
return sessionFactory;
}
public static Configuration getConfiguration() {
return configuration;
}
}
public interface CategoryService {
public void save(Category category); //用来测试Hibernate环境
}
public class CategoryServiceImpl implements CategoryService {
@Override //没有和Spring整合的情况
public void save(Category category) {
//通过刚刚生成的sessionFactory获取session
Session session = HibernateSessionFactory.getSession();
try {
//手动事务
session.getTransaction().begin();
//执行业务逻辑
session.save(category);
//手动提交
session.getTransaction().commit();
} catch(Exception e) {
session.getTransaction().rollback();
throw new RuntimeException(e);
} finally {
HibernateSessionFactory.closeSession();
}
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:beans.xml")
public class SSHTest {
@Resource
private Date date;
@Test //测试Spring IOC的开发环境
public void springIoc() {
System.out.println(date);
}
@Test //测试Hibernate的开发环境,因为没有整合,可以直接new
public void hihernate() {
CategoryService categoryService = new CategoryServiceImpl();
Category category = new Category("男士休闲", true);
categoryService.save(category);
}
}
<!-- com.mchange.v2.c3p0.ComboPooledDataSource类在c3p0-0.9.5.1.jar包的com.mchange.v2.c3p0包中 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/shop" /> <property name="user" value="root" /> <property name="password" value="root" /> </bean>
<!-- org.springframework.orm.hibernate4.LocalSessionFactoryBean类在spring-orm-4.2.4.RELEASE.jar包的org.springframework.orm.hibernate4包中 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:hibernate.cfg.xml" /> <!-- 加载hibernate配置文件 --> </bean>
<!-- org.springframework.orm.hibernate4.HibernateTransactionManager类spring-orm-4.2.4.RELEASE.jar包的org.springframework.orm.hibernate4包中 --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
<tx:advice id="advice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="*" propagation="SUPPORTS"/> </tx:attributes> </tx:advice>
<aop:config> <!-- 配置哪些包的类要切入事务 --> <aop:pointcut id="pointcut" expression="execution(* cn.it.shop.service.impl.*.*(..))" /> <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/><!-- 连接了<span style="font-family:Microsoft YaHei;">上</span>面的advice和上面的pointcut --> <!-- aop:pointcut要写在aop:advisor上面,否则会报错 --> </aop:config>
<bean id="date" class="java.util.Date" /> <bean id="categoryAction" class="cn.it.shop.action.CategoryAction" scope="prototype"> <property name="categoryService" ref="categoryService" /> <!-- 依赖的categoryService用上面和Hibernate整合时配置好的categoryService --> </bean>
<struts>
<package name="shop" extends="struts-default">
<!-- class对应的是Spring中配置该Action的id值,因为要交给Spring管理 -->
<action name="category_*" class="categoryAction" method="{1}">
<result name="index">/index.jsp</result>
</action>
</package>
</struts>
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>E_shop</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <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>*.action</url-pattern> </filter-mapping> <!-- web.xml中监听器的启动优先级要高于过滤器,所以配在下面无所谓的 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </context-param> </web-app>
public class CategoryAction extends ActionSupport {
private Category category;//设置一个私有成员变量接收url带过来的参数,注意下面要写好get和set方法
private CategoryService categoryService;
public void setCategoryService(CategoryService categoryService) {
this.categoryService = categoryService;
}
public String update() {
System.out.println("----update----");
System.out.println(categoryService);//由于已经和Spring整合,所以可以拿到这个categoryService了,打印出来就不是null了
categoryService.update(category); //新加一条语句,来更新数据库
return "index";
}
public String save() {
System.out.println("----save----");
System.out.println(categoryService);
return "index";
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
}
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<a href="${pageContext.request.contextPath }/category_update.action?category.id=2&category.type=gga&category.hot=false">访问update</a>
<a href="category_save.action">访问save</a>
</body>
</html>
----update---- cn.it.shop.service.impl.CategoryServiceImpl@7c5ecf80 Hibernate: update category set hot=?, type=? where id=?
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有