本文记录下在IDEA下使用MAVEN控制的java经典开发框架SSH的过程
本文源码的地址在此:https://download.csdn.net/download/weixin_44218035/87486328
各个部件版本
使用IDE:
intelliJ IDEA: 2020.1
项目管理工具软件:
MAVEN: 3.6.3
Java版本:
JDK: 11.0.6
web应用服务器:
tomcat: 9.0.71
项目框架:
Struts: 2.5.22
Spring: 5.3.10
Hiberbate: 5.6.15
数据库:
Mariadb: 10.9.1
MAVEN依赖
....
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- spring下载-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.10</version>
</dependency>
<!-- aspectj下载,切面使用-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.6</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.9.6</version>
</dependency>
<!--struts2下载-->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.22</version>
</dependency>
<!--整合struts与spring-->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.5.22</version>
</dependency>
<!-- hibernate下载-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.15.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.6.15.Final</version>
</dependency>
<!-- 底层jdbc下载-->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.7.8</version>
</dependency>
<!-- log4日志文件-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.10.0</version>
</dependency>
</dependencies>
....
项目创建
1.idea创建新项目
选这个,之后就取好名字放好位置就可以了
2.创建java与resources
3.idea配置tomcat
具体tomcat安装见网上文章,本文只展示IDEA中tomcat的配置过程
4.pom.xml中设置好上面的依赖并下载
代码见上或源码
struts2 配置
1.resource中创建struts.xml
其余配置见源码,主要是下面这个
<package name="lee" extends="struts-default">
<!-- struts2登录测试action-->
<action name="logintest" class="loginAction" >
<result name="error">/content/error.jsp</result>
<result >/content/welcome.jsp</result>
</action>
<!-- 罗列图书action-->
<action name="listBooks" class="org.crazyit.booksys.action.BookAction"
method="list">
<result>/content/listBooks.jsp</result>
</action>
<!-- 删除图书action-->
<action name="deleteBook" class="org.crazyit.booksys.action.BookAction"
method="delete">
<result type="chain">listBooks</result>
</action>
<!-- 添加图书action-->
<action name="addBook" class="org.crazyit.booksys.action.BookAction"
method="add">
<!-- 添加图书成功,列出所有图书 -->
<result type="chain">listBooks</result>
<!-- 添加图书失败,跳转到添加图书的表单页 -->
<result name="error">/content/bookForm.jsp</result>
</action>
<!-- 设置所有的页面不需要加content和.jsp-->
<action name="*">
<result>/content/{1}.jsp</result>
</action>
</package>
注:图书部分可以在struts验证阶段不配置
Spring配置
创建applicationContext配置Spring
...
<!--struts2登录测试-->
<bean id="myService" class="org.crazyit.app.service.impl.MyServceImpl"/>
<!-- spring接管struts的action创建 scope="prototype"属性代表其为多例模式-->
<bean id="loginAction" class="org.crazyit.app.action.LoginAction"
scope="prototype" p:ms-ref="myService"/>
<!-- Spring搭建与Hibernate的模型-->
<!--#当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3
c3p0.acquireIncrement=20
#初始化时获取连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3
c3p0.initialPoolSize=20
#连接池中保留的最小连接数,默认为:3
c3p0.minPoolSize=20
#连接池中保留的最大连接数。默认值: 15
c3p0.maxPoolSize=100
#最大空闲时间,多少秒内未使用则连接被丢弃。若为0则永不丢弃。默认值: 0
c3p0.maxIdleTime=60
#c3p0全局的PreparedStatements缓存的大小。如果maxStatements与maxStatementsPerConnection均为0,则缓存不生效,只要有一个不为0,则语句的缓存就能生效。如果默认值: 0
c3p0.maxStatements=0
#c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能通过多线程实现多个操作同时被执行。Default: 3
c3p0.numHelperThreads=10
#定义在从数据库获取新连接失败后重复尝试的次数。默认值: 30 ;小于等于0表示无限次
c3p0.acquireRetryAttempts=5
#重新尝试的时间间隔,默认为:1000毫秒
c3p0.acquireRetryDelay=300
#获取一个connection需要的时间,单位毫秒
c3p0.checkoutTimeout=3000
#每隔多少秒检查所有连接池中的空闲连接。Default: 0
c3p0. idleConnectionTestPeriod=60
#c3p0将建一张名为改配置项的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么属性preferredTestQuery将#被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试使用。默认值: null。由于运营平台的数据库用户没有创建表的权限,故需要发sql创建表。
c3p0.automaticTestTable=sys_connectiontest
#如果设为true那么在取得连接的同时将校验连接的有效性。Default: false
c3p0.testConnectionOnCheckin=true
#一个checkout连接的超时设置,一旦一个checkout连接超时,他将物理的关闭,而不是返回池中,主要是防止连接被长期使用不释放,这个设置也是比较危险的
c3p0.unreturnedConnectionTimeout=15
下面分块解释各配置项值的由来。
基础连接池配置:
maxPoolSize最大连接数在满足应用需要的情况下,参考默认值15,越小越好。由于sdkservice多次出现连接数不够的情况,该值也越改越大。现已改为100。
minPoolSize最小连接数需要小于等于最大连接数,参考默认值3,越小越好。同maxPoolSize的原因, 现已改为20。
initialPoolSize初始化连接数需要在最大和最小连接数之间,否则会被最小连接数的值替换,参考默认值3。 同maxPoolSize的原因, 现已改为20。
acquireIncrement连接耗尽时一次获取的连接数,参考默认值3,由于sdkservice用到的mysql proxy在连接不够进行扩容时,会出现获取连接失败的异常,所以将acquireIncrement的值设置较大,以减少mysql proxy的扩容异常。
maxIdleTime最大空闲时间,该时间内未使用,则丢弃。设置为60秒。-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close"
p:driverClass="org.mariadb.jdbc.Driver"
p:jdbcUrl="jdbc:mariadb://192.168.25.3:3306/spring?useUnicode=true"
p:user="root"
p:password="ym470963"
p:maxPoolSize="40"
p:minPoolSize="2"
p:initialPoolSize="2"
p:maxIdleTime="30"/>
<!-- 定义Hibernate的SessionFactory,SessionFactory需要依赖数据源,
注入dataSource -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"
p:dataSource-ref="dataSource">
<!-- annotatedClasses用来列出全部持久化类-->
<property name="annotatedClasses">
<list>
<value>org.crazyit.booksys.domain.Book</value>
</list>
</property>
<!-- 定义Hibernate SessionFactory的属性 -->
<property name="hibernateProperties">
<props>
<!-- 指定Hibernate的连接方言 -->
<prop key="hibernate.dialect">
org.hibernate.dialect.MariaDB106Dialect
</prop>
<!--是否根据Hiberante映射创建数据表 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
<!--打印sql语句-->
<prop key="hibernate.show_sql">true</prop>
<!--格式化sql-->
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>
<!-- 定义DAO组件,并将SessionFactory注入DAO组件 -->
<bean id="bookDao" class="org.crazyit.booksys.dao.impl.BookDaoHibernate5"
p:sessionFactory-ref="sessionFactory"/>
<!-- 定义Service组件,并将DAO组件注入Service组件 -->
<bean id="bookService" class=
"org.crazyit.booksys.service.impl.BookServiceImpl"
p:bookDao-ref="bookDao"/>
<!-- 配置Hibernate的局部事务管理器,使用HibernateTransactionManager类 -->
<!-- 该类是PlatformTransactionManager接口针对采用Hibernate的特定实现类 -->
<!-- 配置HibernateTransactionManager需依赖注入SessionFactory -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory"/>
<!-- 配置事务增强处理Bean,指定事务管理器 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 所有以'get'开头的方法是read-only的 -->
<tx:method name="get*" read-only="true"/>
<!-- 其他方法使用默认的事务设置,指定超时时长为5秒 -->
<tx:method name="*" isolation="DEFAULT"
propagation="REQUIRED" timeout="5"/>
</tx:attributes>
</tx:advice>
<!-- AOP配置的元素 -->
<aop:config>
<!-- 配置一个切入点 -->
<aop:pointcut id="myPointcut" expression="bean(bookService)"/>
<!-- 指定在myPointcut切入点应用txAdvice事务增强处理 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/>
</aop:config>
...
注:Hibernate部分可以在struts验证阶段不配置
servlet的web.xml配置
配置spring的监听和struts的模块
web.xml
<?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_4_0.xsd"
version="4.0"
metadata-complete="true">
<display-name>Archetype Created Web Application</display-name>
<!-- 配置spring.xml配置文件位置,方便监听器读取,默认加载名为contextConfigLocation-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 部署struts2在项目中-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<init-param>
<param-name>struts.custom.i18n.resources</param-name>
<param-value>mess</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Struts的配置验证
配置完成后应该可以打开这个登录页面验证是否配置成功
用户:crazyit.org
密码:leegang
Hibernate5 配置
1.配置log4j2.xml和log4j2.properties
不配置会报错,文件见源码,直接搬过来就好没什么特别的
2.将上面applicationContext.xml和struts.xml剩余没补齐部分补齐
Hibernate的配置文件也可以单独列装出来:
将applicationContext.xml部分修改为:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"
p:dataSource-ref="dataSource"
p:configLocation="classpath:hibernate.cfg.xml"
/>
hibernate.cfg.xml文件的配置大概是下面这样的,由于本次只是一个简易模拟的整合开发就没这么配置了。有兴趣的小伙伴可以自己去实验下。
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库驱动-->
<property name="connection.driver_class">org.mariadb.jdbc.Driver</property>
<!-- 数据库url-->
<property name="connection.url">
jdbc:mariadb://localhost:3306/hibernate?useUnicode=true&characterEncoding=UTF-8</property>
<!-- 数据库用户名/密码-->
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 连接数-->
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">1</property>
<!-- 超时时长-->
<property name="hibernate.c3p0.timeout">5000</property>
<!-- 最大缓存对象-->
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">true</property>
<!--hibernate 方言-->
<!-- <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>-->
<property name="hibernate.dialect">org.hibernate.dialect.MariaDB106Dialect</property>
<!-- 根据需要自动创建数据表-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- <property name="hibernate.hbm2ddl.auto">create</property>-->
<!--打印sql语句-->
<property name="hibernate.show_sql">true</property>
<!--格式化sql-->
<property name="hibernate.format_sql">true</property>
<!-- 加载映射文件 -->
<mapping class="domain.News"/>
<mapping class="domain.Person"/>
<mapping class="domain.Address"/>
<mapping class="domain.Season"/>
<mapping class="domain.User"/>
<mapping class="domain.Product"/>
</session-factory>
</hibernate-configuration>
注:其中的spring数据库请自行在数据库中创建
其余部分的代码请直接下载查看源码
整合结果: