SSH整合做CRUD(大神老师整理)
-
使用hibernate
-
可以不需要创建hibernate.cfg.xml文件,因为applicationContext文件已经配置好了
-
创建映射文件,并配置在applicationContext文件中
-
-
使用spring
-
创建applicationContext.xml文件
-
配置datasource,以便让项目使用数据库连接池功能
-
配置LocalSessionFactoryBean,以便创建SessionFactory对象
-
配置事务管理器,HibernateTransactionManager
-
配置事务环绕通知,以便给服务层的方法增加事务环绕功能
-
配置切面,以便真正创建代理,完成事务通知的织入
-
-
使用struts
-
创建struts.xml文件放置在类路径下
-
在里面正常的配置action,除了class属性的值设为bean的名字以外。
-
-
整合hibernate:
-
总目标是把SessionFactory,注入到dao类中。
-
并且开启事务支持(针对服务层)后,dao类的代码编写就可以省略掉事务方面的代码,以简化dao的编写。
-
在dao中利用的是Hibernate原生的接口类型(SessionFactory,Session这也是官方推荐的用法)
-
利用session.getCurrentSession,以便服务类调用多个dao时,每一个dao得到的是同一个session对象,也就是同一个Connection对象,这样才能保证事务。并且不需要手动的调用session.close方法来关闭。事务提交时会自动关闭连接
-
-
整合struts2
-
添加ContextLoaderListener以便创建一个Spring容器对象(ApplicationContex实例)
-
在struts.xml文件中配置action的class属性时,其值是spring配置文件中的bean的名字
-
利用struts-spring插件,改变默认struts框架实例化Action(也就是控制器类型)的默认规则,改由先从spring容器中取(容器对象已经由监听器创建出来了),取不到就按照原本的规则实例化Action类型
-
-
做CRUD
-
编写dao
-
编写service
-
编写控制器
-
配置struts.xml文件
-
配置applicationContext文件
-
创建Maven项目
正常的maven项目创建,创建好了之后,在pom文件中对插件进行设置
<build> <plugins> <!--用于设定源代码文件的编码,以及项目代码运行的目标jdk版本为1.8 --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- 指定项目中web资源的根目录,用于maven打包时把此目录的所有内容拷贝到war中--> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.2</version> <configuration> <warSourceDirectory>web</warSourceDirectory> </configuration> </plugin> </plugins> </build>
-
spring
-
hibernate
-
web
-
struts
使用Spring
-
添加基本的maven依赖
-
添加applicationContext.xml文件
-
把applicationContext.xml文件交给idea管理
添加spring的基本依赖
基本功能指的是Spring的容器管理,依赖注入,AOP功能
<!-- 这个依赖可以让spring容器有bean管理,依赖注入,基本的切面配置功能,但不支持切点表达式以及其解析--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <!-- 让spring支持切点表达式功能--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.13</version> </dependency>
此时此刻,spring文件暂不配置任何内容。
-
添加hibernate的相关依赖
-
创建hibernate.cfg.xml文件
-
创建实体类
-
创建实体类的映射文件
Hibernate的依赖
不与spring整合,也不使用连接池的话,使用hibernate只需要下面的依赖即可
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.10.Final</version> </dependency
-
设定连接到的数据库
-
驱动类名
-
url
-
username
-
password
-
-
设定hibernate特定的设置,比如开发时可能设置下面几项,生成环境就配置方言即可
-
方言(dialect)
-
显示sql
-
格式化显示的sql语句
-
-
设置实体的映射文件,以便让Hibernate知道,要处理那些实体
上面的3个方面的配置,可以用一句话表示(或者记忆):让此实体用数据库特定的sql语句保存到数据库或从数据库中读取数据到实体中
这句话也说明了Hibernate的本质:一个持久层的框架。
创建实体类
正常的POJO bean规范的要求编写,推荐用包装类型,比如下面
public class CategoryEntity { private int id; private String cname; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } }
<class name="com.entity.CategoryEntity" table="category" schema="dbo" catalog="demo"> <id name="id" column="id"> <generator class="native"/> </id> <property name="cname" column="cname"/> </class>
-
把项目转换为web项目
-
设置项目的包为war
-
添加相关依赖
-
创建struts.xml文件
-
在web.xml中配置struts2 的过滤器
struts web 项目设定
给项目添加web构面支持,并在pom文件中设定包为war包
<packaging>war</packaging>
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.12</version> </dependency>
<filter> <filter-name>struts2</filter-name> <filter-lass>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
添加依赖
-
配置SessionFactory对象创建的工厂bean
-
配置事务
添加依赖
<!-- 这是一个数据库驱动的依赖 --> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>6.2.1.jre8</version> </dependency> <!-- 这个依赖是spring专门用来与其他持久层框架进行整合用的一个依赖 里面有LocalSessionFactoryBean类型 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.0.2.RELEASE</version> </dependency> <!-- 此依赖有事务方面的通知,事务管理器等 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.0.2.RELEASE</version> </dependency> <!-- 这是dbcp连接池依赖,完全可以换别的连接池组件--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.2.0</version> </dependency>
设定数据库配置的properties文件
url=jdbc:sqlserver://localhost\.:1433;database=demo
driverclass=com.microsoft.sqlserver.jdbc.SQLServerDriver
username=sa
password
在applicationContext使用properties文件,local-override表示本地的设定优先,而不是让整个程序运行过程中的一些环境变量优先。
<context:property-placeholder location="classpath:db.properties" local-override="true"/>
配置连接池
<context:property-placeholder location="classpath:db.properties" local-override="true"/> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <!-- 配置驱动类,值来自于properties文件 --> <property name="driverClassName" value="${driverclass}"></property> <!-- 配置数据库的连接字符串,值来自于properties文件 --> <property name="url" value="${url}"></property> <!-- 配置连接到数据库的用户名,值来自于properties文件 --> <property name="username" value="${username}"></property> <!-- 配置连接到数据库的密码,值来自于properties文件 --> <property name="password" value="${password}"></property> <!-- 配置连接池中初始的连接数量 --> <property name="initialSize" value="5"></property> <!-- 配置连接池中最大空闲的连接数量 --> <property name="maxIdle" value="10"/> <!-- 配置连接池中最大的连接数量 --> <property name="maxTotal" value="10"/> </bean>
配置工厂bean
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" destroy-method="destroy"> <!-- 关联的datasource --> <property name="dataSource" ref="dataSource"/> <!-- 设置被管理的实体映射文件,多个的话,可以继续加value子元素, 或者利用通配符比如*.hbm.xml --> <property name="mappingLocations"> <list> <value>classpath:mappers/CategoryEntity.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <!-- 设置显示hibernate运行的sql语句,开发时用 --> <prop key="hibernate.show_sql">true</prop> <!-- 设置格式化显示hibernate运行的sql语句,开发时用 --> <prop key="hibernate.format_sql">true</prop> <!-- 针对特定的数据库设置方言,便于hibernate对生成的sql进行优化 --> <prop key="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</prop> </props> </property> </bean>
至此,SessionFactory对象就已经创建出来了,就可以注入到dao中了。
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager" > <property name="sessionFactory" ref="sessionFactory"/> </bean>
下面的配置默认事务传播级别为Required,而且是碰到RuntimeException异常时,事务才会回滚。在spring与hibernate整合使用时,spring会对dao类的代码中抛出的异常有个转换功能,会转换为DataAccessException。此DataAccessException就是RuntimeException异常的子类型。不过hibernate 5这个版本已经把数据库的异常转换为运行时异常了,所以Spring没有这个异常转换功能也可以,但有些持久层框架或老版本的Hibernate抛出的异常不是运行时异常,那么Spring的这个异常转换功能就显得很重要了。
<tx:advice id="transactionInterceptor" transaction-manager="transactionManager"> <tx:attributes> <!-- 配置所有的get开头的方法 采用只读事务,只读事务不能做增删改操作(需要持久层框架以及jdbc驱动的支持才真正有效) 设置之后会起到一定的优化作用--> <tx:method name="get*" read-only="true"/> <tx:method name="delete*"/> <tx:method name="update*"/> <tx:method name="insert*"/> </tx:attributes> </tx:advice>
配置事务切面
<aop:config> <!--针对所有服务层代码来配置切面,不是针对dao层,因为可能一个服务类的方法调用多个dao类的方法,配置在服务层,可以让多个dao的方法运行在一个事务下 --> <aop:pointcut id="allServices" expression="execution(public * com.service.*.*(..))"/> <!-- 引用事务环绕通知,以及服务目标类的切点表达式--> <aop:advisor advice-ref="transactionInterceptor" pointcut-ref="allServices"/> </aop:config>
-
配置监听器
-
action的class设置为bean
-
整合的插件配置
配置监听器
配置监听器,是为了创建ApplicationContext对象
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
可选的配置上下文参数,用来指定spring配置文件的位置
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
这个监听器类来自于spring-web里面,所以需要添加下面的依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.2.RELEASE</version> </dependency>
<package name="demo" extends="struts-default"> <!-- 设置控制器类中,可以访问的方法名--> <global-allowed-methods>list,delete,create,save,edit,update</global-allowed-methods> <action name="category*" class="categoryController" method="{1}"> <result name="list">/category/list.jsp</result> <result name="create">/category/create.jsp</result> <result name="modify" type="redirectAction">categorylist</result> <result name="edit">/category/edit.jsp</result> </action> </package>
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.5.12</version> </dependency>
sql语句
create table category ( id int identity(1,1) primary key, cname nvarchar(10) )
public class BaseDao { private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } }
public class CategoryDao extends BaseDao { public List<CategoryEntity> getAll(){ Session session = getSessionFactory().getCurrentSession(); return session.createQuery("from CategoryEntity ").list(); } }
applicationContext中的配置
<!-- 这里配置父dao,并设置为抽象,主要的目的是为了不能直接getBean的方式使用这个bean设置,与实际的BaseDao类型是不是抽象的无关--> <bean id="baseDao" abstract="true" class="com.dao.BaseDao"> <!--注入sessionFactory,这样所有的子bean就都有sessionFactory可以用了 --> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!--parent设置的是父bean的名字,父bean的配置,此子bean就都可以使用了。 --> <bean id="categoryDao" class="com.dao.CategoryDao" parent="baseDao"> </bean>
public class CategoryService { //这样用来注入dao的,最好是用接口隔离一下 private CategoryDao categoryDao; public CategoryDao getCategoryDao() { return categoryDao; } public void setCategoryDao(CategoryDao categoryDao) { this.categoryDao = categoryDao; } public List<CategoryEntity> getAll(){ return categoryDao.getAll(); } }
spring中的配置
<bean id="categoryService" class="com.service.CategoryService"> <property name="categoryDao" ref="categoryDao"/> </bean>
public class BaseController extends ActionSupport { }
public class CategoryController extends BaseController implements ModelDriven<CategoryEntity>{ //spring会注入service类型进来 private CategoryService categoryService; public CategoryService getCategoryService() { return categoryService; } public void setCategoryService(CategoryService categoryService) { this.categoryService = categoryService; } public String list(){ List<CategoryEntity> categoryEntityList = categoryService.getAll(); ActionContext.getContext().put("categoryList",categoryEntityList); return "list"; } }
spring中的配置
<bean id="categoryController" class="com.controller.CategoryController"> <property name="categoryService" ref="categoryService"/> </bean>
<?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.edu</groupId> <artifactId>ssh</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.13</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.10.Final</version> </dependency> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>6.2.1.jre8</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.12</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.5.12</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.2</version> <configuration> <warSourceDirectory>web</warSourceDirectory> </configuration> </plugin> </plugins> </build> </project>
<?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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.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"> <context:property-placeholder location="classpath:db.properties" local-override="true"/> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${driverclass}"></property> <property name="url" value="${url}"></property> <property name="username" value="${username}"></property> <property name="password" value="${password}"></property> <property name="initialSize" value="5"></property> <property name="maxIdle" value="10"/> <property name="maxTotal" value="10"/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" destroy-method="destroy"> <property name="dataSource" ref="dataSource"/> <property name="mappingLocations"> <list> <value>classpath:mappers/CategoryEntity.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</prop> </props> </property> </bean> <bean id="baseDao" abstract="true" class="com.dao.BaseDao"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <bean id="categoryDao" class="com.dao.CategoryDao" parent="baseDao"> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager" > <property name="sessionFactory" ref="sessionFactory"/> </bean> <tx:advice id="transactionInterceptor" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" read-only="true"/> <tx:method name="delete*"/> <tx:method name="update*"/> <tx:method name="insert*"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="allServices" expression="execution(public * com.service.*.*(..))"/> <aop:advisor advice-ref="transactionInterceptor" pointcut-ref="allServices"/> </aop:config> <bean id="categoryService" class="com.service.CategoryService"> <property name="categoryDao" ref="categoryDao"/> </bean> <bean id="categoryController" class="com.controller.CategoryController"> <property name="categoryService" ref="categoryService"/> </bean> </beans>
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <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>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <package name="demo" extends="struts-default"> <global-allowed-methods>list,delete,create,save,edit,update</global-allowed-methods> <action name="category*" class="categoryController" method="{1}"> <result name="list">/category/list.jsp</result> <result name="create">/category/create.jsp</result> <result name="modify" type="redirectAction">categorylist</result> <result name="edit">/category/edit.jsp</result> </action> </package> </struts>
url=jdbc:sqlserver://localhost\.:1433;database=demo
driverclass=com.microsoft.sqlserver.jdbc.SQLServerDriver
username=sa
password