说明:简单SSH整合,struts版本2.3.32,spring版本3.2.9,hibernate版本3.6.10

一、开发步骤

1 引jar包,创建用户library。使用的包和之前博文相同,可以参考spring和hibernate整合,事务管理struts和spring整合

jar包如下

//struts_core
Struts2..32core\commons-fileupload-1.3..jar
Struts2..32core\commons-io-2.2.jar
Struts2..32core\commons-lang3-3.2.jar
Struts2..32core\freemarker-2.3..jar
Struts2..32core\javassist-3.11..GA.jar
Struts2..32core\ognl-3.0..jar
Struts2..32core\struts2-core-2.3..jar
Struts2..32core\xwork-core-2.3..jar //spring_core
spring3..9core\commons-logging-1.2.jar
spring3..9core\spring-beans-3.2..RELEASE.jar
spring3..9core\spring-context-3.2..RELEASE.jar
spring3..9core\spring-core-3.2..RELEASE.jar
spring3..9core\spring-expression-3.2..RELEASE.jar //struts_spring_web
struts-spring-web\struts2-spring-plugin-2.3..jar
struts-spring-web\spring-web-3.2..RELEASE.jar
struts-spring-web\spring-webmvc-3.2..RELEASE.jar //hibernate_core
hibernate3.6core\antlr-2.7..jar
hibernate3.6core\commons-collections-3.1.jar
hibernate3.6core\dom4j-1.6..jar
hibernate3.6core\hibernate3.jar
hibernate3.6core\hibernate-jpa-2.0-api-1.0..Final.jar
hibernate3.6core\javassist-3.12..GA.jar
hibernate3.6core\jta-1.1.jar
hibernate3.6core\slf4j-api-1.6..jar
hibernate3.6core\slf4j-nop-1.7..jar //DB_connector
DB-connector\c3p0-0.9.1.2.jar
DB-connector\mysql-connector-java-5.1.-bin.jar
DB-connector\spring-jdbc-3.2..RELEASE.jar //AOP
springAOP\aopalliance.jar
springAOP\aspectjrt.jar
springAOP\aspectjweaver.jar
springAOP\spring-aop-3.2..RELEASE.jar //spring_ORM
spring-ORM\spring-orm-3.2..RELEASE.jar
spring-ORM\spring-tx-3.2..RELEASE.jar

2 创建数据库表

CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR() NOT NULL,
depId INT,
FOREIGN KEY(depId) REFERENCES department(id)); CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR() NOT NULL);

3 写实体类

//Department
public class Department {
private int id;
private String dname;
private Set<Employee> dEmployees = new HashSet<Employee>(); public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
} public Set<Employee> getdEmployees() {
return dEmployees;
}
public void setdEmployees(Set<Employee> dEmployees) {
this.dEmployees = dEmployees;
} } // Employee
public class Employee { private int id;
private String ename;
private Department department = new Department(); public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
} @Override
public String toString() {
return "Employee [id=" + id + ", ename=" + ename + "]";
}
}

注意:在实体类中有属性是其他类,要进行初始化动作。否则可能在以后操作数据时有问题。

4 Dao/Service/Action

// EmployeeDao
public class EmployeeDao {
private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
} public void saveEmployee(Employee emp){
sessionFactory.getCurrentSession().save(emp);
} public Employee getEmployee(Employee emp){
Employee result = (Employee) sessionFactory.getCurrentSession().get(Employee.class, emp.getId());
return result;
} public boolean isExistEmployee(Employee emp){
Object result = sessionFactory.getCurrentSession().get(Employee.class, emp.getId());
return result!=null;
} public List<Employee> getAllEmployee(){
Query q = sessionFactory.getCurrentSession().createQuery("from Employee");
List<Employee>list = q.list();
return list;
}
} //EmployeeService
public class EmployeeService {
private EmployeeDao employeeDao; public void setEmployeeDao(EmployeeDao employeeDao) {
this.employeeDao = employeeDao;
} public void saveEmployee(Employee emp){
employeeDao.saveEmployee(emp);
} public Employee getEmployee(Employee emp){
Employee result = null;
if(employeeDao.isExistEmployee(emp)){
result = employeeDao.getEmployee(emp);
}
return result;
} public List<Employee> getAllEmployee(){
return employeeDao.getAllEmployee();
} } //EmployeeAction
public class EmployeeAction extends ActionSupport implements SessionAware,ApplicationAware,RequestAware{
private EmployeeService employeeService;
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application; public void setEmployeeService(EmployeeService employeeService) {
this.employeeService = employeeService;
} public String getAllEmployees(){
List<Employee> allEmployees = employeeService.getAllEmployee();
// ActionContext.getContext().getContextMap().put("allEmployees", allEmployees);
// ServletActionContext.getRequest().setAttribute("allEmployees", allEmployees);
request.put("allEmployees", allEmployees); return SUCCESS;
} @Override
public void setRequest(Map<String, Object> arg0) {
request = arg0;
} @Override
public void setApplication(Map<String, Object> arg0) {
application = arg0;
} @Override
public void setSession(Map<String, Object> arg0) {
session = arg0;
} }

注意:

1)在这些类中如果有私有对象,要设置对应的set方法。因为所有对象的创建都交给了spring,需要有set方法与之对应。

2)在Action方法保存对象到域中有3中方法。具体可以参考之前博文struts2开发流程及配置,域对象对数据存储的3种方式。比较方便的是继承SessionAware,ApplicationAware,RequestAware接口

5 对spring和hibernate进行配置,将所有和数据库相关的配置都在spring配置中配置,配置文件bean.xml;以后项目如果比较大可以将bean-dao.xml,bean-service.xml,bean-action.xml,bean-base.xml分开进行配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
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.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- dataSource config combopooleddatasource -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///day26?useSSl=true"></property>
<property name="user" value="root"></property>
<property name="password" value=""></property>
<property name="initialPoolSize" value=""></property>
<property name="maxPoolSize" value=""></property>
<property name="acquireIncrement" value=""></property>
<property name="maxStatements" value=""></property>
</bean> <!-- sessionFactory config -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 2.1 dataSource property -->
<property name="dataSource" ref="dataSource"></property> <!-- 2.2 DB other property, dialect/showsql/ -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<!-- <prop key="hibernate.hbm2ddl.auto">create</prop> -->
</props>
</property> <!-- 2.3 mapping file list -->
<property name="mappingLocations">
<list>
<value>classpath:com/huitong/entity/*.hbm.xml</value>
</list>
</property> </bean> <!-- 3 dao/service/action bean -->
<bean id="employeeDao" class="com.huitong.dao.EmployeeDao">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> <bean id="employeeService" class="com.huitong.service.EmployeeService">
<property name="employeeDao" ref="employeeDao"></property>
</bean> <bean id="employeeAction" class="com.huitong.action.EmployeeAction" scope="prototype">
<property name="employeeService" ref="employeeService"></property>
</bean> <!-- 4 transaction config -->
<!-- 4.1 transaction manager bean config -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean> <!-- 4.2 transaction advice -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice> <!-- 4.3 AOP config -->
<aop:config>
<aop:pointcut expression="execution(* com.huitong.service.EmployeeService.*(..))" id="emppt"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="emppt"/>
</aop:config> </beans>

6 struts配置,struts.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd"> <struts>
<package name="Employeepkg" extends="struts-default" >
<action name="employee_*" class="employeeAction" method="{1}">
<result name="success" type="dispatcher">/employeeList.jsp</result>
</action>
</package> </struts>

7 web.xml配置

<?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_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>SSH1</display-name> <!-- opensessioninview config, for lazyInitialization exception -->
<filter>
<filter-name>opensessionInview</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>opensessionInview</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping> <!-- struts config -->
<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> <!-- 2 spring config -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/bean*.xml</param-value>
  <!--另一种方案<param-value>classpath:bean*.xml</param-value> -->
</context-param> <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
</web-app>

注意:在spring中配置事务,由于使用了懒加载。在jsp页面访问关联数据不能访问。事务配置在了service方法中,在action方法中无法获取相关联的数据。解决办法有四种,

1)在action方法中将要用到的数据先获取一遍

2)关闭懒加载,不过这种方法对于数据关系复杂的情况不太好,它会加载所有相关数据而不是用到什么取什么。

3)使用openSessionInViewFilter,注意配置的时候filter mapping要在struts的filter mapping之前。否则不起效果。

4)在service层强行初始化代理对象

8 前台页面employeeList.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<%@taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %> <%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>所有员工信息</title>
</head> <body>
<div>
<table cellpadding="" cellspacing="" align="center" border="">
<tr>
<th>员工名</th>
<th>部门</th>
</tr>
<c:forEach items="${requestScope.allEmployees }" var="emp" varStatus="empStatus">
<tr>
<td>${emp.ename }</td>
<td>${emp.department.dname }</td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>

9 简单测试

public void fun1(){
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
EmployeeService empService = (EmployeeService) ac.getBean("employeeService");
System.out.println(empService); //spring ok? Employee emp1 = new Employee();
emp1.setEname("good"); Employee emp2 = new Employee();
emp2.setEname("nice"); Department department = new Department();
department.setDname("软件开发部"); emp1.setDepartment(department);
emp2.setDepartment(department); empService.saveEmployee(emp1);
empService.saveEmployee(emp2);//hibernate ok? }

项目在github上的地址https://github.com/crazyCodeLove/SSHpro1.git

struts输入表单中的隐藏域可以使用<s:hidden>

<s:hidden name="id"></s:hidden>

SSH整合简单例子的更多相关文章

  1. ssh整合 小例子

    实现了用户的查插删改操作. 原理:struts负责接收.分发请求.spring采用面向接口编程的思想整合整体框架,负责连接数据库.hibernate负责操作数据库语言. 思路: 1.配置struts的 ...

  2. [转]SSH整合 简单的增删改查

      Database 使用 Mysql , 建立User 表 CREATE TABLE `user` ( `id` int(11) NOT NULL, `firstName` varchar(20)  ...

  3. ssm整合简单例子

    1.首先新建一个maven项目 2.在pom.xml文件中加入以下代码引入包 <properties> <project.build.sourceEncoding>UTF-8& ...

  4. SSH整合简单实例

    1.配置struts.xml文件: <?xml version="1.0" encoding="UTF-8"?>  <!DOCTYPE str ...

  5. 【转载】Ssh整合开发介绍和简单的登入案例实现

    Ssh整合开发介绍和简单的登入案例实现 Ssh整合开发介绍和简单的登入案例实现 一  介绍: Ssh是strtus2-2.3.1.2+ spring-2.5.6+hibernate-3.6.8整合的开 ...

  6. SSH整合框架+mysql简单的实现

    SSH整合框架+mysql简单的实现 1. 框架整合原理: struts2整合Spring 两种: 一种struts2自己创建Action,自动装配Service : 一种 将Action交给Spri ...

  7. 三大框架SSH整合

    三大框架SSH整合 -------------------------------Spring整合Hibernate------------------------------- 一.为什么要整合Hi ...

  8. 【Java EE 学习 67 下】【OA项目练习】【SSH整合JBPM工作流】【JBPM项目实战】

    一.SSH整合JBPM JBPM基础见http://www.cnblogs.com/kuangdaoyizhimei/p/4981551.html 现在将要实现SSH和JBPM的整合. 1.添加jar ...

  9. CANoe 入门 Step by step系列(三)简单例子的剖析【转】

    最好的学习方式是什么?模仿.有人会问,那不是山寨么?但是我认为,那是模仿的初级阶段,当把别人最好的设计已经融化到自己的血液里,变成自己的东西,而灵活运用的时候,才是真正高级阶段.正所谓画虎画皮难画骨. ...

随机推荐

  1. [转]jquery后代和子元素的区别

    这是<锋利的jquery>书里的内容 <div>     <p>         <span></span>         <a&g ...

  2. 多线程--Task,等待用户输入AutoResetEvent

    上一篇文章:.NET:如何让线程支持超时?已经说明目前微软主推的多线程方案是task: 注意:Task最好引用.NET4.5. 4.0也行,但不成熟.Thread引用2.0就够了. 1.通过构造函数创 ...

  3. TQuery

    TQuery uses syndb 查询 function Tfmain.query(const sql: string): RawUTF8;var q: TQuery;begin q := TQue ...

  4. 【mysql】mysql中varcher属性最大值能存多长

    1.首先理解varchar(n),n表示什么 MySQL5.0.3之前varchar(n)这里的n表示字节数 MySQL5.0.3之后varchar(n)这里的n表示字符数,比如varchar(200 ...

  5. [转载]《Delphi 版 everything、光速搜索代码》 关于获取文件全路径 GetFullFileName 函数的优化

    Delphi 版 everything.光速搜索代码>,文章中关于获取文件全路径的函数:GetFullFileName,有一个地方值得优化. 就是有多个文件,它们可能属于同一个目录. 譬如 Sy ...

  6. [python爬虫] Selenium常见元素定位方法和操作的学习介绍(转载)

    转载地址:[python爬虫] Selenium常见元素定位方法和操作的学习介绍 一. 定位元素方法 官网地址:http://selenium-python.readthedocs.org/locat ...

  7. 转:android studio 改编译区背景色

    http://blog.csdn.net/zhuhai__yizhi/article/details/44017609 最近开始学习使用android studio想设置背景颜色,不过上网找的全都是复 ...

  8. [Angular] Angular i18n Alternative Expressions Support (select)

    For example we have those code: <div class="course-category" [ngSwitch]="course.ca ...

  9. javascript设置首页,加入收藏

    <a href="javascript:;" id="setHomePage" class="toolsbar" onclick=&q ...

  10. 求x>0时,y=x^3-6x^2+15的极值

    解: 当x→∞时,y也→∞,所以y没有最大值. y=x3-6x2+15=-4*(x/2)*(x/2)*(6-x)+15 而根据几何平均数小于等于算术平均数的定理,(x/2)*(x/2)*(6-x)在x ...