SSH框架的搭建及应用
一、创建maven程序,引入依赖
struts-core、apache-commons-fileupload,struts-convention.plugin
poi、poi-ooxml
spring-context、sprng-jdbc、spring-tx、spring-context-suport、aspectjweaver
spring-web、struts2-spring-plugin
hibernate-core、mysql、
spring-orm
druid
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.Hibernate</groupId>
<artifactId>ssh</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>ssh Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- struts -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.22</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.5.22</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!--poid相关的-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
<scope>runtime</scope>
</dependency>
<!--ssh整合-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.5.22</version>
</dependency>
<!--hibernate相关-->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.0.0.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.29</version>
</dependency>
<!--sh整合-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.1</version>
</dependency>
</dependencies>
<build>
<finalName>ssh</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
二、搭建Struts框架
1、引入依赖
2、在web.xml中配置核心入口(filter)
<?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_4_0.xsd"
version="3.0">
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
3、在scr/main/resources下创建struts.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!--配置常量数量,处理action、do和没有后缀结尾的-->
<constant name="struts.action.extension" value="action,do,,"/>
<package name="dmc" extends="struts-default">
</package>
</struts>
三:搭建spring框架
1、引入依赖
2、创建application.xml文件,建议在scr/main/resources下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/beans/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/beans/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/beans/spring-context.xsd">
</beans>
四:SS整合
所谓的ssh整合就是将sturts的action交给spring管理,原来action有sturts自己创建,随着struts2-spring-plugin整合插件包的引入,告诉sturts现在改为向Spring要action
1、引入依赖
2、在web.xml中配置监听器,在服务器启动时,就启动spring框架,确保比struts启动的早
<?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_4_0.xsd"
version="3.0">
<!--配置过滤器-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
再提供一个全局参数,指定spring配置文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application.xml</param-value>
</context-param>
五:搭建hibernate
1、scr/main/resources下创建hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<!-- 第二部分: 配置hibernate信息 可选的-->
<!-- 输出底层sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 输出底层sql语句格式 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate帮创建表,需要配置之后 update: 如果已经有表,更新,如果没有,创建 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置数据库方言在mysql里面实现分页 关键字 limit,只能使用mysql里面在oracle数据库,实现分页rownum 让hibernate框架识别不同数据库的自己特有的语句 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
</session-factory>
</hibernate-configuration>
2、封装hibernateUtil,管理sessionFactory工厂
package com.hibernate.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
/**
* @author PGG
*/
public class HibernateUtil {
private static SessionFactory factory;
static {
//方式一:
/* Configuration cfg=new Configuration();
cfg.configure();
SessionFactory factory=cfg.buildSessionFactory();
*/
//方式二
StandardServiceRegistry r = new StandardServiceRegistryBuilder().configure().build();
Configuration cfg=new Configuration();
factory=cfg.buildSessionFactory(r);
}
/**
* 获取session对象
* @return
*/
public static Session getSession(){
return factory.openSession();
}
}
注意:因为后面要实现sh整合,sh整合后,spring负责管理hibernatede 数据源,工厂,事务,所以配置文件中不需要配置数据源信息和hibernate封装了
六:sh整合
所谓的ss整合,就是由spring负责管理hibernate数据源,工厂,事务
1、引入依赖
2、实现hibernate整合的配置:管理数据源、管理工厂、管理事务
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/beans/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/beans/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/beans/spring-context.xsd">
<!--管理数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/hibernate?useUnicode=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--管理工厂-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!--管理事务-->
<bean id="manager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!--事务策略和管理切入点-->
<tx:annotation-driven transaction-manager="manager"/>
</beans>
事务管理又分为三个点:
事务管理者(谁管理事务)
<bean id="manager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
事务策略(如何管理事务)
事务切入点(什么时候管理事务)
注意:事务策略和事务切入点可以使用注解
<!--事务策略和管理切入点-->
<tx:annotation-driven transaction-manager="manager"/>
注意:sh整合时,对dao的操作也有影响:因为.原来dao与数据库交互时,使用我们自己管理的工厂获得session对象
现在:sh整合后,需要使用spring管理的工厂获得session对象
dao继承父类hibernateDaoSupport,然后为Dao的父类注入SessionFactory工厂,在方法中,通过父类方法获得hibernate操作的模板对象super.getHIbernateTemplate,该模板提供了crud方法
SSH框架的应用
1、创建包结构,功能类,实现orm,实现IOC,DI,excel文件
注意:在application.xml文件中,开启spring,IOC DI的注解编程
<!--开启spring,IOC DI的注解编程-->
<context:component-scan base-package="com.hibernate.action,com.hibernate.service,com.hibernate.dao"/>
注意:sh整合后,dao需要到spring管理的sessionFactory中获得session对象,1:dao继承HIbernateDaoSupport 为dao(父类)注入SessionFactory(曲线救国的方式)
@Repository
public class CarDao extends HibernateDaoSupport {
/**
* 采用曲线救国的方式为为dao(父类)注入SessionFactory
* @param factory
*/
@Autowired
public void setFactory (SessionFactory factory){
super.setSessionFactory(factory);
}
}
2、设计网页,选择文件上传
<html>
<body>
<form action="upload.do" method="get" enctype="multipart/form-data">
<input type="file" name="excel"/><br/>
<button>按钮</button>
</form>
</body>
</html>
3、action处理请求(接收文件,读取excel,实现批量保存)
注意:
action注解实现的请求映射
@Action(value="upload")
public void upload(){
//poi读取excel文件
}
注意:struts文件上传
private File excel;
public void setExcel(File excel){
this.excel=excel;
}
注意:poi读取excel文件
/**
* @Action表示接收的时upload的请求
*/
@Action(value="upload")
public void upload() throws IOException {
List<Car> cars=new ArrayList<>();
//poi读取excel文件
Workbook book= WorkbookFactory.create(excel);
Sheet sheet=book.getSheetAt(0);
for(int i=1;i<=sheet.getLastRowNum();i++){
//获取行
Row r=sheet.getRow(i);
//获取列的单元格
Cell c1 = r.getCell(0);
Cell c2 = r.getCell(1);
Cell c3 = r.getCell(2);
Cell c4 = r.getCell(3);
int cno=(int)c1.getNumericCellValue();
String cname=c2.getStringCellValue();
String color=c3.getStringCellValue();
int price=(int)c4.getNumericCellValue();
Car car=new Car(cno,cname,color,price);
cars.add(car);
}
//批量保存
carService.saves(cars);
//直接响应
ServletActionContext.getResponse().getWriter().write("上传成功");
}
注意:service实现批量保存的方法需要指定事务
/**
* 批量保存
* @param cars
*/
@Transactional(isolation= Isolation.SERIALIZABLE,propagation= Propagation.REQUIRED,rollbackFor=Exception.class)
public void saves(List<Car> cars){
//循环保存
for(Car car:cars){
carDao.save(car);
}
}
完整代码
1、pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.Hibernate</groupId>
<artifactId>ssh</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>ssh Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- struts -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.22</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.5.22</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!--poid相关的-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
<scope>runtime</scope>
</dependency>
<!--ssh整合-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.5.22</version>
</dependency>
<!--hibernate相关-->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.0.0.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.29</version>
</dependency>
<!--sh整合-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.1</version>
</dependency>
</dependencies>
<build>
<finalName>ssh</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
application.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/beans/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/beans/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/beans/spring-context.xsd">
<!--管理数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/hibernate?useUnicode=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--管理工厂-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!--管理事务-->
<bean id="manager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!--管理事务和管理切入点-->
<tx:annotation-driven transaction-manager="manager"/>
<!--开启spring,IOC DI的注解编程-->
<context:component-scan base-package="com.hibernate.action,com.hibernate.service,com.hibernate.dao"/>
</beans>
hibernate.cfg.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<!-- 第二部分: 配置hibernate信息 可选的-->
<!-- 输出底层sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 输出底层sql语句格式 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate帮创建表,需要配置之后 update: 如果已经有表,更新,如果没有,创建 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置数据库方言在mysql里面实现分页 关键字 limit,只能使用mysql里面在oracle数据库,实现分页rownum 让hibernate框架识别不同数据库的自己特有的语句 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping class="com.hibernate.domain.Car"></mapping>
</session-factory>
</hibernate-configuration>
struts.xml文件
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!--配置常量数量,处理action、do和没有后缀结尾的-->
<constant name="struts.action.extension" value="action,do,,"/>
<package name="dmc" extends="struts-default">
</package>
</struts>
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_4_0.xsd"
version="3.0">
<!--配置过滤器-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application.xml</param-value>
</context-param>
</web-app>
CarAction
package com.hibernate.action;
import com.hibernate.domain.Car;
import com.hibernate.service.CarService;
import org.apache.poi.ss.usermodel.*;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Controller
@ParentPackage("struts-default")
public class CarAction {
@Autowired
private CarService carService;
private File excel;
public void setExcel(File excel){
this.excel=excel;
}
/**
* @Action表示接收的时upload的请求
*/
@Action(value="upload")
public void upload() throws IOException {
List<Car> cars=new ArrayList<>();
//poi读取excel文件
Workbook book= WorkbookFactory.create(excel);
Sheet sheet=book.getSheetAt(0);
for(int i=1;i<=sheet.getLastRowNum();i++){
//获取行
Row r=sheet.getRow(i);
//获取列的单元格
Cell c1 = r.getCell(0);
Cell c2 = r.getCell(1);
Cell c3 = r.getCell(2);
Cell c4 = r.getCell(3);
int cno=(int)c1.getNumericCellValue();
String cname=c2.getStringCellValue();
String color=c3.getStringCellValue();
int price=(int)c4.getNumericCellValue();
Car car=new Car(cno,cname,color,price);
cars.add(car);
}
//批量保存
carService.saves(cars);
//直接响应
ServletActionContext.getResponse().getWriter().write("上传成功");
}
}
Dao
package com.hibernate.dao;
import com.hibernate.domain.Car;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
@Repository
public class CarDao extends HibernateDaoSupport {
/**
* 采用曲线救国的方式为为dao(父类)注入SessionFactory
* @param factory
*/
@Autowired
public void setFactory (SessionFactory factory){
super.setSessionFactory(factory);
}
/**
* 保存的方法
* @param car
*/
public void save(Car car){
super.getHibernateTemplate().save(car);
}
}
service
package com.hibernate.service;
import com.hibernate.dao.CarDao;
import com.hibernate.domain.Car;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
public class CarService {
@Autowired
private CarDao carDao;
/**
* 批量保存
* @param cars
*/
@Transactional(isolation= Isolation.SERIALIZABLE,propagation= Propagation.REQUIRED,rollbackFor=Exception.class)
public void saves(List<Car> cars){
//循环保存
for(Car car:cars){
carDao.save(car);
}
}
}
car实体
package com.hibernate.domain;
import jakarta.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "t_Car")
public class Car implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer cno;
private String cname;
private String color;
private Integer price;
public Car() {
}
public Car(Integer cno, String cname, String color, Integer price) {
this.cno = cno;
this.cname = cname;
this.color = color;
this.price = price;
}
@Id
public Integer getCno() {
return cno;
}
public void setCno(Integer cno) {
this.cno = cno;
}
@Column(name = "carname",length = 8)
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
@Transient
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
}