SSH2整合完整案例(四十三)

阅读更多
注解配置:Struts2+Spring2.5+Hibernate3.3+Oracle11g

本文介绍
1.Struts2+Spring2.5+Hibernate3.3的整合
2.采用单元测试
3.加入了lob类型的操作配置
4.介绍oralce驱动 本文采用oracle11g
5.在HIbernate中采用“枚举”设置映射关系


jar的下载:
Struts2:   http://struts.apache.org/download.cgi#struts2013
Hibernate: http://www.hibernate.org/  点击Hibernate Core 下载
Spring:    http://www.springsource.org/download

Oracle的驱动介绍

class12.jar(jdk 1.2 / 1.3 ) 
class14.jar(jdk 1.4 / 1.5)
其实只要安装了oracle 就不用下载驱动包了,在安装程序中就有D:\app\Admin\product\11.1.0\db_1\jdbc\lib 这个目录下 根据使用的jdk 选择对应的驱动包就可以了。(例如: ojdbc6.jar)



SSH2整合需要的Jar
1.Strusts
javassist-3.4.GA.jar
commons-fileupload-1.2.1.jar
commons-logging-1.0.4.jar
freemarker-2.3.15.jar
ognl-2.7.3.jar
struts2-core-2.1.8.jar
xwork-core-2.1.6.jar
struts2-spring-plugin-2.1.8.jar


2.Hibernate
commons-collections-3.1.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
ejb3-persistence.jar
hibernate-annotations.jar
hibernate-cglib-repack-2.1_3.jar
hibernate-commons-annotations.jar
hibernate-entitymanager.jar //为了使用 枚举 类型的映射 这个包
hibernate3.jar
javassist-3.4.GA.jar
jta-1.1.jar
log4j.jar
slf4j-api-1.5.2.jar
slf4j-log4j12.jar


3.Spring
aspectjrt.jar
aspectjweaver.jar
c3p0-0.9.1.2.jar
cglib-nodep-2.1_3.jar
common-annotations.jar
log4j-1.2.15.jar
spring.jar


整合步骤先整合 Spring2.5+Hibernate3.3 成功后在整合 Struts2 这样就不容易报错,而且 报错误后也便于找出问题。

spring配置文件模版可以到 spring自带的一些例子中进行拷贝。

applicationContext.xml










   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   



 




  
  
   	
  




	
	
	
	
	
		
			
			hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
			
			hibernate.hbm2ddl.auto=update
			
			hibernate.format_sql=false
			
			hibernate.show_sql=false
		
	
	
	
    	
 	
	 
	
		
			com/sh/employee/model/Employee.hbm.xml
		
	




	
	








Employee.java
package com.sh.employee.model;

public class Employee {
	private String username;
	private String password;
	//枚举类型
	private Gender gender=Gender.MAN;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Gender getGender() {
		return gender;
	}
	public void setGender(Gender gender) {
		this.gender = gender;
	}
	public Employee(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}
	public Employee() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Employee(String username, String password, Gender gender) {
		super();
		this.username = username;
		this.password = password;
		this.gender = gender;
	}
	
}



Gender.java
package com.sh.employee.model;

public enum Gender {
	//分为字面值 :MAN   /  WOMAN
	//索引值:0 1 
	MAN,WOMAN
	
}


Employee.hbm.xml



	
		
		
		
			
				com.sh.employee.model.Gender
				
				12
			
		
	



web.xml


  
 
  
  	contextConfigLocation
  	
  	classpath:applicationContext.xml
  
  
  
  
  	org.springframework.web.context.ContextLoaderListener
  
  
  
  
  	struts2
  	org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  
  
  	struts2
  	/*
  
  
  
    index.jsp
  



EmployeeService.java
package com.sh.employee.interfaces;

import java.util.List;

import com.sh.employee.model.Employee;

public interface EmployeeService {
	void save(Employee employee);
	void update(Employee employee);
	Employee find(String userName);
	void delete(String... userName);
	List list();
}


EmployeeServiceBean.java
package com.sh.employee.service;

import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.sh.employee.interfaces.EmployeeService;
import com.sh.employee.model.Employee;

/**
 *@author LuoB.
 */

//@Service: 定义业务层。采用扫描加注解  将这个类交给spring管理 。
//-----此时 在spring容器中默认的bean的名称为 这个类的简单类名 employeeServiceBean

//@Transactional:定义这个类采用事物管理。这样所有的方法都有事物特性了。
//-----如果某个方法不需要事物 采用这个标识:@Transactional(propagation=Propagation.NOT_SUPPORTED)
@Service @Transactional
public class EmployeeServiceBean implements EmployeeService {
	//采用注解方式注入SessionFactory
	//factory.openSession(); 表示开启一个新的session,这样就不能使用spring的事物管理了
	//spring的事物管理一般是先获取当前的session,然后 将这个begin。
	//factory.getCurrentSession();【在Hibernate3.0后才提供的这样的一个方法】得到 spring事物管理创建好的session
	
	
	@Resource SessionFactory factory;
	public void delete(String... userName) {
		//中间的load 替换了 get方法  因为速度和效率 比get 高
		for (String string : userName) {
			factory.getCurrentSession().delete(factory.getCurrentSession().load(Employee.class, string));
		}
	}

	@Transactional(propagation=Propagation.NOT_SUPPORTED)
	public Employee find(String userName) {
		// TODO Auto-generated method stub
		return (Employee)factory.getCurrentSession().get(Employee.class, userName);
	}

	@SuppressWarnings("unchecked")
	public List list() {
		//Hql 进行查询
		/*Session session=factory.openSession();
		Transaction ts= session.beginTransaction();
		ts.commit();
		ts.rollback();*/
		return factory.getCurrentSession().createQuery("from Employee").list();
	}

	public void save(Employee employee) {
		//持久化方法 -内部还是调用save方法
		factory.getCurrentSession().persist(employee);
	}

	public void update(Employee employee) {
		// merge对update更新了有 save和update的功能
		factory.getCurrentSession().merge(employee);
	}

}


EmployeeAction.java
package com.sh.employee.action;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionContext;
import com.sh.employee.interfaces.EmployeeService;

//@Controller 标识这个action为spring中的一个控制层,在spring中为类的简单类名
@Controller
public class EmployeeAction {
	@Resource EmployeeService employeeService;
	public String execute(){
		ActionContext.getContext().put("employees",employeeService.list());
		return "list";
	}
}


EmployeeManageAction.java
package com.sh.employee.action;

import javax.annotation.Resource;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionContext;
import com.sh.employee.interfaces.EmployeeService;
import com.sh.employee.model.Employee;

//因为Struts2在每次接受到请求后,会迅速的创建actionContext,ValueStack,action 
//然后把Action存在在ValueStack中 所以Action可以被OGNL访问.
//但是把Action交给Spring管理后,action 就是单利模式了,这样 就违背了Struts2的设计理念。
//所以 我们需要 将action 声明为 原型 @Scope("prototype")
@Controller @Scope("prototype")
public class EmployeeManageAction {
	@Resource EmployeeService employeeService;
    
	//如果 某个action 不声明为原型(比如: EmployeeAction) 千万不要在该action中 保存用户提交过来的数据 
	//比如下面 如果是但单利模式 所有的请求都可以访问这个对象了
	private Employee employee;
	
	public Employee getEmployee() {
		return employee;
	}

	public void setEmployee(Employee employee) {
		this.employee = employee;
	}

	public String addUI(){
		return "add";
	}
	
	public String add(){
		employeeService.save(employee);
		ActionContext.getContext().put("msg", "保存成功!");
		return "message";
	}
}



struts.xml




	
	
	
	
	
		
		
		
			/WEB-INF/page/employee.jsp
		
		
		
		
			/WEB-INF/page/employeeAdd.jsp
			/WEB-INF/page/message.jsp
		
	




employee.jsp
 
    	采用OGNL表达式获取
,,

采用JSTL/EL表达式获取
${emp.username},${emp.password},${gender}
[url=员工添加[/url]


employeeAdd.jsp
 
    	
    		用户名:
密码:
性别:


message.jsp

    

${msg}

[url=${pageContext.request.contextPath}/employee/list.action]返回员工列表[/url]


--访问http://localhost:8080/SSH2/employee/list.action
--访问http://localhost:8080/SSH2/employee/list.action

Spring,Struts,Hibernate,Oracle
Struts2, Spring, Hibernate, Oracle, prototype
  • Struts_jar.zip (3.5 MB)
  • 下载次数: 275
  • Spring_jar.zip (5.1 MB)
  • 下载次数: 289
  • Hibernate_jar.zip (4.9 MB)
  • 下载次数: 229
  • WEB-INF.zip (3.2 KB)
  • 下载次数: 196
  • src.zip (9.9 KB)
  • 下载次数: 205
  • ojdbc6.jar (1.9 MB)
  • 下载次数: 154

你可能感兴趣的:(spring,hibernate,struts,prototype,oracle)