Struts与Hibernate整合完成一个小案例
一,概述
1)终于将Struts与Hibernate学习完了,现在就同时在一个web项目中完成一个简单小案例的开发!
2)在前面博客中已经介绍了怎样导入项目必须的jar包及环境的配置,就不再赘述,直接进入主题吧!
二,开发
1)实体及映射文件准备
a)Dept.java(限制篇幅,setter和getter方法省略,下面也是一样)
package com.bighuan.entity;import java.util.HashSet;
import java.util.Set;
/*** 部门表对应的实体类* @author bighuan**/
public class Dept {private int deptId;private String deptName;// 【一对多】 部门对应的多个员工private Set<Employee> emps = new HashSet<Employee>();public Dept() {}public Dept(int deptId, String deptName) {this.deptId = deptId;this.deptName = deptName;}
}
b)Dept.hbm.xml
<?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.bighuan.entity"auto-import="true"><class name="Dept" table="t_dept"><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>
c)Employee.java
package com.bighuan.entity;
/*** 员工表对应的实体类* @author bighuan**/
public class Employee {private int empId;private String empName;private double salary;// 【多对一】员工与部门private Dept dept;public Employee(){}
}
d)Employee.hbm.xml
<?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.bighuan.entity"><class name="Employee" table="t_employee"><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>
2)dao层开发
package com.bighuan.dao;import com.bighuan.entity.Dept;
import com.bighuan.utils.HibernateUtils;public class DeptDao {/*** 主键查询* @param id* @return*/public Dept findById(int id){//获取sessionreturn (Dept) HibernateUtils.getSession().get(Dept.class, id);}
}
3)service层开发
package com.bighuan.service;import com.bighuan.dao.DeptDao;
import com.bighuan.entity.Dept;
import com.bighuan.utils.HibernateUtils;public class DeptService {//调用daoprivate DeptDao dao=new DeptDao();/*** 主键查询* @param id* @return*/public Dept findById(int id){//获取sessionreturn dao.findById(id);}
}
4)HibernateUtils工具类准备
package com.bighuan.utils;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;public class HibernateUtils {//初始化SessionFactoryprivate static SessionFactory sf;static{sf=new Configuration().configure().buildSessionFactory();}/*** 创建(获取)session* @return*/public static Session getSession(){//1,线程的方式创建session,必须要进行配置;//2,不用关闭,会自动关闭return sf.getCurrentSession();}
}
注意:通过线程方式获取session必须要在hibernate.cfg.xml中配置
5)Action开发
Action中主要就是通过主键查询一条数据,保存到request域中
package com.bighuan.action;import com.bighuan.entity.Dept;
import com.bighuan.service.DeptService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;public class DeptAction extends ActionSupport{private DeptService service=new DeptService();@Overridepublic String execute() throws Exception {//主键查询,模拟数据Dept dept = service.findById(11);//保存到request域中ActionContext.getContext().getContextMap().put("dept", dept);return SUCCESS;}
}
6)session拦截器
package com.bighuan.interceptor;import org.hibernate.Session;import com.bighuan.utils.HibernateUtils;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/*** Session管理拦截器* 当访问Action的时候,创建session* action->service->dao,获取的是这里创建的session* @author bighuan**/
public class SessionInterceptor extends AbstractInterceptor{@Overridepublic String intercept(ActionInvocation invocation) throws Exception {try {//1,先创建sessionSession session=HibernateUtils.getSession();//2,开启事务session.beginTransaction();//3,执行actionString result = invocation.invoke();//4,提交事务session.getTransaction().commit();//不需要关闭session//5,返回结果视图return result;} catch (Exception e) {e.printStackTrace();return "error";}}
}
7)hibernate.cfg.xml
<!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节点代表一个数据库 --><session-factory><!-- 1. 数据库连接配置 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">abc</property><!-- 数据库方法配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql--><property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property><!-- 2. 其他相关配置 --><!-- 2.1 显示hibernate在运行时候执行的sql语句 --><property name="hibernate.show_sql">true</property><!-- 2.2 格式化sql<property name="hibernate.format_sql">true</property> --><!-- 2.3 自动建表 --><property name="hibernate.hbm2ddl.auto">update</property><!-- session的创建方式 --><property name="hibernate.current_session_context_class">thread</property><!-- *********连接池配置*********** --><!-- 配置连接池驱动管理类 --><property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property><!-- 配置连接池参数信息 --><property name="hibernate.c3p0.max_size">5</property> <!-- 最大连接数 --><property name="hibernate.c3p0.min_size">2</property> <!-- 最小连接数 --><property name="hibernate.c3p0.timeout">5000</property> <!-- 超时时间 --><property name="hibernate.c3p0.max_statements">100</property> <!-- 最大执行的命令格个数 --><property name="hibernate.c3p0.idle_test_period">30000</property> <!-- 空闲测试时间 --><property name="hibernate.c3p0.acquire_increment">2</property> <!-- 连接不够用时,每次增加的个数 --><!-- 3. 加载所有映射 --><mapping resource="com/bighuan/entity/Dept.hbm.xml"/><mapping resource="com/bighuan/entity/Employee.hbm.xml"/></session-factory>
</hibernate-configuration>
8)struts.xml
a)配置拦截器,action返回"success"就跳转到index.jsp,并显示数据!
b)代码
<?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"><struts><constant name="struts.enable.DynamicMethodInvocation" value="false" /><constant name="struts.devMode" value="false" /><package name="dept" extends="struts-default"><!-- 拦截器配置 --><interceptors><interceptor name="sessionInterceptor" class="com.bighuan.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.bighuan.action.DeptAction"method="execute"><!-- type默认就是dispatcher --><result name="success" type="dispatcher">/index.jsp</result></action></package><!-- Add packages here --></struts>
c)为了使用struts的核心功能,在web.xml中记得配置strtus的核心过滤器.
<!-- 引入struts2核心过滤器 --><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>
9)显示数据
a)引入struts标签:<%@ taglib uri="/struts-tags" prefix="s" %>
b)显示数据:
<body><h3>部门:<s:property value="#request.dept.deptName"></s:property></h3><!-- 部门下的员工:(懒加载数据) --><table border="1" align="center" cellpadding="5" cellspacing="0" width="55%"><tr><th>员工编号</th><th>员工姓名</th><th>薪水</th></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 colspan="3">没有员工信息!</td></tr></s:else></table></body>
c)访问action,效果图:
Struts与Hibernate整合完成一个小案例相关推荐
- springboot mybatis easyui 整合的一个小demo
springboot mybatis easyui 整合的一个小demo 这是最终完成界面 话不多说 开整! 这是项目结构 数据库 表结构和数据库 (有点乱 之前本来是个正经图书表的 = =.) /* ...
- Python:通过一个小案例深入理解IO多路复用
通过一个小案例深入理解IO多路复用 假如我们现在有这样一个普通的需求,写一个简单的爬虫来爬取校花网的主页 import requests import timestart = time.time()u ...
- 一个小案例理解case穿透、switch语句
一.用case穿透简化代码以一个小案例为例:键盘录入星期数,输出工作日.休息日(1-5)工作日,(6-7)休息日 package test;import java.util.Scanner;publi ...
- 用一个小案例来解释linux中文件或目录的权限
Linux中文档和目录的权限 众所周知 , Linux中文档的权限包括所有者权限(User).同组权限(Group)和其他权限(Other).使用rwx来作为表示,分别为read.write和exec ...
- 爬虫的一个小案例:python实现英汉互译
什么是网络爬虫? 网络爬虫又称网络蜘蛛,是指按照某种规则在网络上爬取所需内容的脚本程序.众所周知,每个网页通常包含其他网页的入口,网络爬虫则通过一个网址依次进入其他网址获取所需内容. 一个小案例:py ...
- Struts+Spring+Hibernate整合入门详解
标签: strutshibernatespringbeanactionimport 2007-08-12 16:05 36280人阅读 评论(13) 收藏 举报 分类: STRUTS&SPRI ...
- struts+spring+hibernate整合小例子
项目结构图 地址:http://www.blogjava.net/xiaoyi/articles/xiaoyi_ssh.html 包 com.yz.dao.impl package com.yz.da ...
- Mybatis+Servlet+Mysql 整合的一个小项目:对初学者非常友好,有助于初学者很快的上手Java Web
文章目录 为何要写? 首先声明这是一个非常简单的项目,只包含注册和登录. 有人说了,这么简单的项目,我瞧不上.确实!对于一些高手来说,这点东西不过是毛毛雨. 但是对于一个初学者来说,有一个简单易上手的 ...
- 一个小案例精通lamda表达式与函数式接口
前言:只有基础(多态.匿名接口实现类)足够扎实才能更好的学习花拳绣腿(lamda表达式),Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性.Lambda 允许把函数作为一 ...
- 分享一个小案例,用HMS Scankit做一个安卓扫码购小应用
前言 随着消费升级,零售业逐渐迈入新的发展阶段,"新零售"现象:消费者在货架前扫描小程序二维码,一边逛一边扫描条形码下单,等选好要买的东西,直接拿出手机,通过"扫码购&q ...
最新文章
- r 字符串转化为数值_Lua 字符串处理
- oracle数据库表的导入导出cmd命令大全
- 小白都能玩的算法day2-数量级、输入和输出
- 九九乘法表下半三角(C语言)
- git tag的使用
- Objective-C代码学习大纲
- 从鸽笼原理到拉姆塞数
- Android解决异常apk on device '0292bea1': Unable to open sync connection!
- 机器人操作臂运动学入门一--D-H参数标定
- 数字转换成英语的程序(c++实现)
- CA认证过程及https实现方法
- 浅谈数据治理与成本管理
- 工作记录(JS向textarea添加固定内容、通过固定字符将字符串分割为数组)
- c语言莫莫加等于莫莫什么意思,莫莫Momo
- 铁矿石加速下跌,沪铜认购大涨,甲醇09-01季节性反套2022.4.22
- DAY41:Cobalt Strike 工具使用
- java 四边形_Java 实例 – 打印平行四边形
- FairyGUI按钮动效的混用
- 华为平板可以安装python_Python镜像怎么配置_Python镜像下载-华为云
- Linux命令行下载OneDrive分享链接中的文件
热门文章
- NPM酷库:minimatch,模式匹配字符串
- 在Seismic.NET下用最少的语句写出一个剖面显示程序
- 黑马程序员-JavaSE核心知识-01Java介绍
- 12.TCP/IP 详解卷1 --- 广播和多播
- 25.MySQL sql_mode
- 23. 实例 --- 变量
- 1. crontab 简介
- mc服务器天赋系统,[娱乐|经济]GokiStats——全新的天赋系统插件MySQL可用[全版本]...
- ubuntu 压缩率最高的软件_国外这款不知名的视频压缩软件,100M视频秒变2M,网友:太好用了...
- 问题:jquery中的change()事件,以及jquery中的prop()事件与attr()事件的区别