Struts2+Spring+Hibernate导包

1.1   Struts2导入jar包:

* struts2/apps/struts2-blank.war/WEB-INF/lib/*.jar

* 导入与spring整合的jar

* struts2/lib/struts2-spring-plugin-2.3.15.3.jar--- 整合Spring框架

* struts2/lib/struts2-json-plugin-2.3.15.3.jar--- 整合AJAX

* struts2/lib/struts2-convention-plugin-2.3.15.3.jar--- 使用Struts2注解开发.

1.2 * 配置

web.xml

  struts2

  org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

  struts2

  /*

 

struts.xml

   

   

   

---------------------------------------------------------------------------------------------

2.1Spring导入jar包:

Spring3.2 开发最基本jar

spring-beans-3.2.0.RELEASE.jar

spring-context-3.2.0.RELEASE.jar

spring-core-3.2.0.RELEASE.jar

spring-expression-3.2.0.RELEASE.jar

com.springsource.org.apache.commons.logging-1.1.1.jar

com.springsource.org.apache.log4j-1.2.15.jar

AOP开发

spring-aop-3.2.0.RELEASE.jar

spring-aspects-3.2.0.RELEASE.jar

com.springsource.org.aopalliance-1.0.0.jar

com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

Spring Jdbc开发

spring-jdbc-3.2.0.RELEASE.jar

spring-tx-3.2.0.RELEASE.jar

Spring事务管理

spring-tx-3.2.0.RELEASE.jar

Spring整合其他ORM框架

spring-orm-3.2.0.RELEASE.jar

Springweb中使用

spring-web-3.2.0.RELEASE.jar

Spring整合Junit测试

spring-test-3.2.0.RELEASE.jar


(Spring没有引入c3p0和数据库驱动)

2.2* 配置:

applicationContext.xml

Log4j.properties

 

web.xml中配置监听器;

            

            

            

            org.springframework.web.context.ContextLoaderListener

            

            

            

            

            contextConfigLocation

            classpath:applicationContext.xml

            

---------------------------------------------------------------------------------------------

3.1Hibernatejar包导入:

* 核心包:hibernate3.jar

* lib/required/*.jar

* lib/jpa/*.jar

* 引入hibernate整合日志系统的jar:

* 数据连接池:

* 数据库驱动:

 

* 二级缓存:(可选的.)

* backport-util-concurrent.jar

* commons-logging.jar

* ehcache-1.5.0.jar

3.2* Hibernate的配置:

* hibernate.cfg.xml

* 映射:

* 格式:类名.hbm.xml

---------------------------------------------------------------------------------------------

SSH框架整(12)_第1张图片

---------------------------------------------------------------------------------------------------------------------------------

Struts2Spring的整合:

1.新建包结构:

* cn.ssh.action

* cn.ssh.service

* cn.ssh.dao

* cn.ssh.vo

2.创建实体类:

* Book

package cn.ssh.vo;
public class Book {
private Integer id;
private String name;
private Double price;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}

3.新建一个jsp页面:

* addBook.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags"  prefix="s"%>




Insert title here


添加图书

图书名称:
图书价格:

4.编写Action:

package cn.ssh.action;
import cn.ssh.vo.Book;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class BookAction extends ActionSupport implements ModelDriven {
// 模型驱动类
private Book book = new Book();
public Book getModel() {
return book;
}
// 处理请求的方法:
public String add() {
System.out.println("web层的添加执行了...");
return NONE;
}
}

5.配置struts.xml





    
    
    
    
    

    6.发布测试

信息: Server startup in 4928 ms
web层的添加执行了...


Struts2和Spring的整合两种方式:

Struts2自己管理Action:(方式一)多例


* Struts2框架自动创建Action的类.


Action交给Spring管理:(方式二)默认是单例

可以在标签上通过一个伪类名方式进行配置:

 
在spring的配置文件中:[scope="prototype"]


(*****)注意:Action交给Spring管理一定要配置scope=”prototype”

第二种方式测试:

Struts.xml配置文件修改为:

applicationContext.xml配置新增:



推荐使用二:

* 在Spring中管理的类,可以对其进行AOP开发.统一的管理.


Web层获得Service:

传统方式:
* 获得WebApplicationContext对象.
* 通过WebAppolicationContext中getBean(“”);
 
实际开发中:
* 引入了struts2-spring-plugin-2.3.15.3.jar
* 有一个配置文件 : struts-plugin.xml
开启常量 :

引发另一个常量的执行:(Spring的工厂类按照名称自动注入)
struts.objectFactory.spring.autoWire = name


初始化整合:

BookAction类,修改如下:

//这样就可以或得service对象(1)
private BookService bookService;
public void setBookService(BookService bookService) {
this.bookService = bookService;
}
...
// 处理请求的方法:
	public String add(){
		System.out.println("web层的添加执行了...");
		//有了(1)就可以直接调用bookService的方法了。
		bookService.add(book);
		return NONE;
	}

applicationContext.xml













测试结果:

web层的添加执行了...
Service层保存图书……
dao层保存图书...


Spring整合Hibernate:

Spring整合Hibernate框架的时候有两种方式:

零障碍整合:(第一种)

---------------------------------------------------------------------------------------------------------------------

可以在Spring中引入Hibernate的配置文件.

1.通过LocalSessionFactoryBean在spring中直接引用hibernate配置文件





2.Spring提供了Hibernate的模板.只需要将HibernateTemplate模板注入给DAO.

* DAO继承HibernateDaoSupport.






改写DAO:继承HibernateDaoSupport类.

public class BookDao extends HibernateDaoSupport{
public void save(Book book) {
System.out.println("DAO层的保存图书...");
this.getHibernateTemplate().save(book);
}
}


3.创建一个映射文件 (hibernate核心包hibernate-mapping-3.0.dtd头):










4.别忘记事务管理:

事务管理器:





5.注解管理事务:



6.在业务层类上添加一个注解:

@Transactional

ps:
@Transactional
public class BookService {}


测试结果:

启动tomcat 自动创建表
Hibernate: 
    insert 
    into
        book
        (name, price) 
    values
        (?, ?)


没有Hibernate配置文件的形式(二)


不需要Hibernate配置文件的方式,将Hibernate配置文件的信息直接配置到Spring中.
Hibernate配置文件中的信息 :
* 连接数据库基本参数:
* Hibernate常用属性:
* 连接池:
* 映射:


把Hibernate配置文件整合Spring中:

删除hibernate.xml连接池信息


	
	
		com.mysql.jdbc.Driver
	
	
		jdbc:mysql://192.168.1.188:3306/ssh1
	
	root
	123
	



org.hibernate.connection.C3P0ConnectionProvider


5

20

120

3000

在applicationContext.xml配置连接池:


	
	
	
	
	
		
		
		
		
	

--------------------------------------------------

Hibernate常用属性:

删除hibernate.xml方言信息




org.hibernate.dialect.MySQLDialect



true

true
false

update

修改applicationContext.xml配置

删除

                

org.hibernate.dialect.MySQLDialect

true

true

update

false

--------------------------------------------------

映射

删除hibernate.xml配置


添加applicationContext.xml配置




cn/ssh/vo/Book.hbm.xml


↓↓↓↓↓如果配置文件很多,用第二种方式。↓↓↓↓↓



classpath:cn/ssh/vo



如果需要做其他操作比如增删改操作,需要修改BookDao.java

HibernateTemplateAPI:


 Serializable save(Object entity)       :保存数据
 void update(Object entity)        :修改数据
 void delete(Object entity)        :删除数据
  T get(Class entityClass, Serializable id)   :根据ID进行检索.立即检索
  T load(Class entityClass, Serializable id)   :根据ID进行检索.延迟检索.
 ***List find(String queryString, Object... values)   :支持HQL查询.直接返回List集合.
 ***List findByCriteria(DetachedCriteria criteria)    :离线条件查询.
 ***List findByNamedQuery(String queryName, Object... values) :命名查询的方式.

BookDao修改

public void update(Book book) {
this.getHibernateTemplate().update(book);
}改
public void delete(Book book) {
this.getHibernateTemplate().delete(book);
}删
public Book findById(Integer id) {
return this.getHibernateTemplate().get(Book.class, id);
}查
// 查询多个
public List findAll() {
return this.getHibernateTemplate().find("from Book");
}
// 离线的特点把sql封装好,传过来
public List findByCriteria(DetachedCriteria criteria) {
return this.getHibernateTemplate().findByCriteria(criteria);
}
//命名查询,在映射文件里
public List findByName(String name) {
return this.getHibernateTemplate().findByNamedQuery("findByName",name);
}

Book.hbm.xml

		from Book where name = ?
	


//延迟加载查询
public Book findByIdLazy(Integer id){
return this.getHibernateTemplate().load(Book.class, id);
}

service层

public void update(Book book) {
// TODO Auto-generated method stub
System.out.println("Service层更新图书...");
bookDao.update(book);
}
public void delete(Book book) {
// TODO Auto-generated method stub
System.out.println("Service层删除图书...");
bookDao.delete(book);
}
public Book findById(Integer id) {
// TODO Auto-generated method stub
System.out.println("Service层findById图书...");
return bookDao.findById(id);
}
public List findAll() {
// TODO Auto-generated method stub
System.out.println("Service层findAll图书...");
return bookDao.findAll();
}
public List findByCriteria(DetachedCriteria criteria) {
// TODO Auto-generated method stub
System.out.println("Service层findByCriteria图书...");
return bookDao.findByCriteria(criteria);
}
public List findByName(String name) {
// TODO Auto-generated method stub
System.out.println("Service层findByName图书...");
return bookDao.findByName(name);
}
//延迟加载查询
public Book findByIdLazy(Integer id){
System.out.println("Service层findByIdLazy图书...");
return bookDao.findByIdLazy(id);
}


测试类:

package cn.ssh.test;
import java.util.List;
import cn.ssh.service.BookService;
import cn.ssh.vo.Book;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4Cla***unner;
@RunWith(SpringJUnit4Cla***unner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class sshtest {
@Autowired
@Qualifier("bookService")
private BookService bookService;
@Test
public void demo1() {
Book book = new Book();
book.setId(1);
book.setName("name");
book.setPrice(100d);
bookService.update(book);
}
@Test
public void demo2() {
Book book = new Book();
book.setId(1);
bookService.delete(book);
}
@Test
public void demo3() {
Book book = new Book();
book.setId(1);
System.out.println(bookService.findById(1));
;
}
@Test
public void demo4() {
List book = bookService.findAll();
for (Book list : book) {
System.out.println(list);
}
}
@Test
public void demo5() {
DetachedCriteria criteria = DetachedCriteria.forClass(Book.class);
criteria.add(Restrictions.eq("id", 2));
criteria.add(Restrictions.eq("name", "2"));
List book = bookService.findByCriteria(criteria);
for (Book list : book) {
System.out.println(list);
}
}
@Test
public void demo6() {
List book = bookService.findByName("2");
for (Book list : book) {
System.out.println(list);
}
}
}

直接访问:http://localhost:8080/spring3_ssh1_1/book_findByIDLazy.action会报错(解决方法web.xmlOpenSessionInViewFilter过滤器)

Stacktraces

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

    org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
    org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
    org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)

SSH框架整(12)_第2张图片
web.xml 

配置过滤器


OpenSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter


OpenSessionInViewFilter
/*

添加后测试如下:

Service层findByIdLazy图书...
Hibernate: 
    select
        book0_.id as id0_0_,
        book0_.name as name0_0_,
        book0_.price as price0_0_ 
    from
        book book0_ 
    where
        book0_.id=?
cn.ssh.vo.Book@1364b53


基于注解的方式整合SSH


导入以上工程jar包:
* 导入struts2的注解开发:
* struts2-convention-plugin-2.3.15.3.jar

* web.xml:

	
		
		org.springframework.web.context.ContextLoaderListener
	

	
	
		contextConfigLocation
		classpath:applicationContext.xml
	

	
	
		struts2
		org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
	
	
		struts2
		/*
	

* 创建包结构:

* 引入spring的配置文件、log4j、jdbc属性文件.


* 创建页面:

* 创建Action:

@Namespace("/")

@ParentPackage("struts-default")

public class BookAction extends ActionSupport implements ModelDriven{

private Book book = new Book();

public Book getModel() {

return book;

}


@Action(value="book_add")

public String add(){

System.out.println("web层添加图书...");

return NONE;

}

}


* Action---Service----Dao

将各层类使用注解装配Spring中:

@Controller

@Service

@@Repository


完成属性注入:

@Autowired

@Qualifier("bookService")


* 实体类:

@Entity

@Table(name="book")

public class Book {

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

private Integer id;

@Column(name="name")

private String name;

private Double price;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Double getPrice() {

return price;

}

public void setPrice(Double price) {

this.price = price;

}

@Override

public String toString() {

return "Book [id=" + id + ", name=" + name + ", price=" + price + "]";

}

}

* 事务管理:


* 模板注入:

详细测试代码如下:

BookAction.java

package cn.spring.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import cn.spring.service.BookService;
import cn.spring.vo.Book;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
//  
@Namespace("/")
@ParentPackage("struts-default")
@Controller("bookAction")
@Scope("prototype")
public class BookAction extends ActionSupport implements ModelDriven {
private Book book = new Book();
@Override
public Book getModel() {
return book;
}
//在action中注入service
@Autowired
@Qualifier("bookService")
private BookService bookService;
// 
@Action(value = "book_*")
public String add() {
System.out.println("web层添加图书..");
bookService.add(book);
return NONE;
}
}
BookDao.java

package cn.spring.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;
import cn.spring.vo.Book;
@Repository("bookDao")
public class BookDao {
@Autowired
@Qualifier("hibernateTemplate")
private HibernateTemplate hibernateTemplate;
public void save(Book book) {
// TODO Auto-generated method stub
System.out.println("DAO层的保存图书...");
hibernateTemplate.save(book);
}
}

BookService.java

package cn.spring.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.spring.dao.BookDao;
import cn.spring.vo.Book;
@Transactional
@Service("bookService")
public class BookService {
@Autowired
@Qualifier("bookDao")
private BookDao bookDao;
public void add(Book book) {
// TODO Auto-generated method stub
System.out.println("servcice 添加图书...");
bookDao.save(book);
}
}

Book.java

package cn.spring.vo;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="book")
public class Book {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Column(name="name")
private String name;
private Double price;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Book [id=" + id + ", name=" + name + ", price=" + price + "]";
}
}

applicationContext.xml




















org.hibernate.dialect.MySQLDialect
true
true
update
false




cn.spring.vo