struts和hibernate整合
程序示例:
1、引入jar包
2、实体对象
Dept.java
package com.gqx.entity;
import java.util.HashSet;
import java.util.Set;
/* 异常 org.hibernate.InstantiationException: No default constructor for entity
当查询的时候返回的实体类是一个对象实例,是hibernate动态通过反射生成的
反射的Class.forName("className").newInstance();需要对应的类提供一个无参构造函数,
出现这种问题是一般都是实体类有一个有参的构造 ,没有无参构造
下面说一下有参构造 和无参构造
1,每一个类在默认情况下,都会有一个无参数构造器!
2,当声明了带参构造器,那么无参构造器就不存在了,需要无参构造器,就必须重新声明!
3,构造器是不能够继承的
4,在类构造器中,无论是有参数还是无参数构造器,默认情况下,首先会调用父类的无参构造器(一直到最上层的父类),
这是因为要调用父类继承下来的方法必须要先初始化父类.
5,需要在子类构造器中调用父类其它的构造器,可以显示声明*/
public class Dept {
private int deptId;
private String deptName;
//一对多配置的集合,即一个部门对应多个员工
private Set<Employee> emps=new HashSet<Employee>();
public int getDeptId() {
return deptId;
}
public void setDeptId(int deptId) {
this.deptId = deptId;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public Set<Employee> getEmps() {
return emps;
}
public void setEmps(Set<Employee> emps) {
this.emps = emps;
}
}
Employee.java
package com.gqx.entity;
public class Employee {
private int empId;
private String empName;
private double salary;
//是多对一的一端 一个员工属于一个部门
private Dept dept;
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
}
2、映射文件
<?xml version="1.0"?> <!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.gqx.entity"> <class name="Dept" table="t_dept2"> <id name="deptId" > <generator class="native"></generator> </id> <property name="deptName" length="20"></property> <set name="emps"> <key column="dept_id"></key> <one-to-many class="Employee"/> </set> </class> </hibernate-mapping>
<?xml version="1.0"?> <!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.gqx.entity"> <class name="Employee" table="t_employee2"> <id name="empId" > <generator class="native"></generator> </id> <property name="empName" length="20"></property> <property name="salary" type="double"></property> <many-to-one name="dept" column="dept_id" class="Dept"></many-to-one> </class> </hibernate-mapping>
3、主配置文件
<!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> <!-- 数据库连接配置 --> <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> <property name="hibernate.connection.url">jdbc:sqlserver://localhost:1433;DataBaseName=Test</property> <property name="hibernate.connection.username">sa</property> <property name="hibernate.connection.password">123456</property> <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property> <property name="hibernate.show_sql">true</property> <!-- 格式化sql语句 <property name="hibernate.format_sql">true</property>--> <property name="hibernate.hbm2ddl.auto">update</property> <!-- session创建方式 --> <property name="hibernate.current_session_context_class">thread</property> <!-- 加载映射文件 --> <mapping resource="com/gqx/entity/Dept.hbm.xml"/> <mapping resource="com/gqx/entity/Employee.hbm.xml"/> </session-factory> </hibernate-configuration>
4、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"> <!-- START SNIPPET: xworkSample --> <struts> <package name="dept" extends="struts-default"> <!-- 拦截器配置 --> <interceptors> <interceptor name="sessionInterceptor" class="com.gqx.interceptor.SessionInterceptor"></interceptor> <interceptor-stack name="myStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="sessionInterceptor"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="myStack"></default-interceptor-ref> <!-- action配置 --> <action name="show" class="com.gqx.action.DeptAction"> <result name="success">/index.jsp</result> </action> </package> </struts> <!-- END SNIPPET: xworkSample -->
5、工具包
package com.gqx.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
//初始化sessionFactory
private static SessionFactory sf;
static{
sf=new Configuration().configure().buildSessionFactory();
}
//创建session
public static Session getSession(){
return sf.getCurrentSession();
}
}
/**
* (1)、openSession 从字面上可以看得出来,是打开一个新的session对象,而且每次使用都是打开一个新的session,
* 假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session。
*
* (2)、getCurrentSession 获取当前上下文一个session对象,当第一次使用此方法时,会自动产生一个session对象,
* 并且连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一,
* 简单而言,getCurrentSession 就是:如果有已经使用的,用旧的,如果没有,建新的。
*
* (3)、对于getCurrentSession 来说,有以下一些特点:
* 1、事务提交会自动close,不需要像openSession一样自己调用close方法关闭session
* 2、上下文配置(即在hibernate.cfg.xml)中,需要配置:
* <property name="current_session_context_class">thread</property>
* 需要注意,这里的current_session_context_class属性有几个属性值:jta 、 thread 常用 , custom、managed 少用
* a).thread使用connection 单数据库连接管理事务
* b).jta (Java transaction api) Java 分布式事务管理 (多数据库访问),
* c).jta 由中间件提供(JBoss WebLogic 等, 但是tomcat 不支持)
*/
6、 Session管理拦截器
package com.gqx.interceptor;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import com.gqx.util.HibernateUtils;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
* Session管理拦截器
* 当访问action时,创建session
* action --> service --> dao 获取的是这里创建的session
* @author 郭庆兴
*
*/
public class SessionInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
try {
//1、先创建Session
Session session=HibernateUtils.getSession();
session.beginTransaction();
//2、执行action
String result=invocation.invoke(); //一旦执行到这一句就会打印出sql语句
//4、提交事物
session.getTransaction().commit(); //不需要关闭session
return result;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "error";
}
}
}
7、Dao包
package com.gqx.dao.deptDao;
import com.gqx.entity.Dept;
import com.gqx.util.HibernateUtils;
public class DeptDao {
//主键查询
public Dept findById(int id){
return (Dept)HibernateUtils.getSession().get(Dept.class, id);
}
}
8、Action类
package com.gqx.action;
import com.gqx.entity.Dept;
import com.gqx.service.DeptService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DeptAction extends ActionSupport{
//逻辑业务类
DeptService deptService=new DeptService();
public String execute() throws Exception {
Dept dept =deptService.findById(2);
//保存
ActionContext.getContext().put("dept", dept);
return SUCCESS;
}
}
9、页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<center><h2>部门:<s:property value="#request.dept.deptName"/></h2></center>
<!-- 部门员工 懒加载数据-->
<table border="1" align="center">
<tr>
<td>员工编号</td>
<td>员工姓名</td>
<td>员工薪水</td>
</tr>
<s:if test="#request.dept.emps != null">
<s:iterator var="emp" value="#request.dept.emps">
<tr>
<td><s:property value="#emp.empId"/></td>
<td><s:property value="#emp.empName"/></td>
<td><s:property value="#emp.salary"/></td>
</tr>
</s:iterator>
</s:if>
<s:else>
<tr><td>没有员工信息!</td></tr>
</s:else>
</table>
</body>
</html>
10、开启服务器,发布项目,访问http://localhost:8080/struts-hibernate/show,结果如图

struts和hibernate整合的更多相关文章
- Struts+Spring+Hibernate整合入门详解
Java 5.0 Struts 2.0.9 Spring 2.0.6 Hibernate 3.2.4 作者: Liu Liu 转载请注明出处 基本概念和典型实用例子. 一.基本概念 St ...
- Struts+Spring+Hibernate整合
这段笔记三两年前写的,一直因为一些琐事,或者搞忘记了,没有发.今天偶然翻出了它,就和大家一起分享下吧. 1.导入jar包 Struts的jar包: Spring的jar包: Hibernate的jar ...
- Struts+Spring+Hibernate整合笔记一
OpenSessionInview: 1.如果当前方法没有事物环境,则调用完毕getHibernate以后.session关闭: 说明:1如果测试dao层,没有事物环境 2如果测试service层,但 ...
- Struts+Spring+Hibernate、MVC、HTML、JSP
javaWeb应用 JavaWeb使用的技术,比如SSH(Struts.Spring.Hibernate).MVC.HTML.JSP等等技术,利用这些技术开发的Web应用在政府项目中非常受欢迎. 先说 ...
- 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)
轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...
- Java Web整合开发实战:基于Struts 2+Hibernate+Spring 目录
第1篇 Java Web开发基础第1章 Web的工作机制( 教学视频:31分钟) 1.1 理解Web的概念 1.1.1 Web的定义 1.1.2 Web的三个核心标准 1.2 C/S与B/S两种软件体 ...
- Spring+Hibernate+Struts(SSH)框架整合
SSH框架整合 前言:有人说,现在还是流行主流框架,SSM都出来很久了,更不要说SSH.我不以为然.现在许多公司所用的老项目还是ssh,如果改成流行框架,需要成本.比如金融IT这一块,数据库dao层还 ...
- Spring入门(四)— 整合Struts和Hibernate
一.Spring整合Struts 1. 初步整合 只要在项目里面体现spring和 strut即可,不做任何的优化. struts 环境搭建 创建action public class UserAct ...
- Struts 2 + Hibernate + Spring 整合要点
Struts 2 和 Spring 的功能有重合,因此有必要说明下,整合中分别使用了两种框架的哪些技术. Struts 2 使用功能点: 1.拦截器.一处是对非登录用户购物进行拦截,一处是对文件上传的 ...
随机推荐
- android:padding和android:margin的区别[转]
本文综合了:http://zhujiao.iteye.com/blog/1856980 和 http://blog.csdn.net/maikol/article/details/6048647 两篇 ...
- 事件冒泡的应用——jq on的实现
曾对jQuery中on的实现有所疑问,一直没有找到合适的实现方法,今日看<javascript高级程序设计>中的事件冒泡有了些思路. 针对于新增的DOM元素,JQ中若为其绑定事件就必须使用 ...
- linux 查询搜索文件指令
一.which(寻找[执行档]) 二.whereis(由一些特定的目录中寻找文件文件名) 三.locate/updatedb 四.find 个人记录方便自用
- output.php
<?php /** * */ class Output { function __construct() { $this->_zlib_oc = @ini_get('zlib.output ...
- 如何更好地使用Java 8的Optional
Java 8中的Optional<T> 是一个可以包含或不可以包含非空值的容器对象,在 Stream API中很多地方也都使用到了Optional. java中非常讨厌的一点就是nullp ...
- hive 修复分区、添加二级分区
我们在之前的文章中,介绍了二级分区,混合分区,静态分区,动态分区的区别和建表. 今天我们聊下,当我们建好分区表.并且通过程序在表的分区目录(location)下,写入了文件. 如何在hive中查询到插 ...
- B - Avoiding a disaster
Description Percy likes to be punctual. So much so that he always keeps three watches with him, so t ...
- 【BZOJ2595】 [Wc2008]游览计划
BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j, ...
- 设置 Linux 下打印机的几种方式
设置 Linux 下打印机的几种方式 一.使用 cups 进行设置 如若遇到 cups 也没有驱动的话可以前往 openprinting.org 找寻对应驱动. 二.前往 official 下载驱动 ...
- 微信小程序报Cannot read property 'setData' of undefined的错误
最近在学习微信小程序的开发,让我吐槽的是,都9102年了,怎么还是有有时不能复制,有时不能打中文的bug呢,这个时候,你可以Ctrl+shift+w一下,如果还不行,那就得重启了.. 进入正题吧,刚在 ...