Maven基本配置+Struts2基本配置+Hibernate基本配置+Spring基本配置

it2025-04-03  1

Maven环境配置+Struts2环境配置+Hibernate环境配置+Spring环境配置

现在Struts2与Hibernate已逐渐没落; 此文只是是为了方便博主和博主的朋友所写的简单配置,其中的具体原理与代码使用,在此不做详解

目录

Maven环境配置+Struts2环境配置+Hibernate环境配置+Spring环境配置一、Maven的环境配置1. Maven下载2. Maven配置环境变量3. Maven工程创建所需要的配置信息 二、Struts2环境配置1. 引入struts2支持2. Struts2多模块配置 三、Hibernate环境配置1. 集成hibernate2.加入Ehcache以及log4j3.装配日志系统 四.Spring环境配置1.pom文件配置2.spring的核心配置文件3.spring在web中的配置 五.SSH基本项目工程配置集成1.pom.xml文件2.web.xml基本配置3.struts2基本核心4.spring集成文件5.db.properties文件配置6.log4j2的配置


一、Maven的环境配置

1. Maven下载

下载maven安装包,解压即可使用,下载地址:http://maven.apache.org/download.cgi

2. Maven配置环境变量

添加Mavne系统变量

修改path添加maven相关路径

Maven验证安装

Maven仓库配置 在搭建好Maven环境之后,创建Mavne工程会在默认地址生成一个本地仓库 复制settings.xml文件到**.m2**文件下

将.m2文件中settings.xml的远程仓库换成国内阿里云仓库

3. Maven工程创建所需要的配置信息

修改pom文件 <build> <finalName>Maven</finalName> <plugins> <!--第一步就是配置maven-compiler-plugin插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> 修改web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>Archetype Created Web Application</display-name> </web-app> 修改eclipse 的 .settings 配置文件 (org.eclipse.wst.common.project.facet.core.xml) web修改成3.1 java修改成1.8,与之项目所用jdk版本对应 <?xml version="1.0" encoding="UTF-8"?> <faceted-project> <fixed facet="wst.jsdt.web"/> <installed facet="jst.web" version="3.1"/> <installed facet="wst.jsdt.web" version="1.0"/> <installed facet="java" version="1.8"/> </faceted-project>

二、Struts2环境配置

1. 引入struts2支持

修改pom.xml文件,引入struts依赖,struts的依赖配置可以在https://mvnrepository.com/网站上查找。 <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.13</version> </dependency> 加入中央控制器 在web.xml中加入中央控制器 <!-- 中央控制器 --> <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>

2. Struts2多模块配置

在src/main/resources目录下,编写一个struts-base.xml,作用是用于存放项目中的公共配置。 <?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> <!-- 全局属性 --> <constant name="struts.i18n.encoding" value="UTF-8" /><!-- 字符编码 --> <constant name="struts.devMode" value="true" /><!-- 开发模式:打印出更多的调试信息 --> <constant name="struts.configuration.xml.reload" value="true" /><!-- xml文件发生修改自动刷新 --> <constant name="struts.i18n.encoding" value="UTF-8" /><!-- 字符编码 --> <constant name="struts.i18n.reload" value="true" /><!-- 国际化配置文件 --> <!-- struts必须的默认配置 --> <include file="struts-default.xml" /> <package name="base" extends="struts-default" abstract="true"> <global-allowed-methods>regex:.*</global-allowed-methods><!-- 开启动态方法调用 --> </package> </struts>

注意: base包为抽象类型,abstract=“true”,主要用于被继承 2) 编写struts.xml,该配置文件的作用是将其他配置文件导入进来,struts通过该配置文件找到其他的各个配置文件。

<?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> <--引入struts-base.xml文件--> <include file="struts-base.xml" /> </struts> 编写一个struts-test.xml,该配置文件主要用于演示具体模块的配置,在项目按统一的模块名命名规范命名即可 <?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> <!--action配置示例: 包名 命名空间 继承基本配置 是否为抽象 --> <package name="test" namespace="/test" extends="base" abstract="false"> <action name="testAction!*" class="org.luobai.strutsdemo.action.TestAction" method="{1}"> <result name="testPage" type="redirect"> /test.jsp </result> </action> </package> </struts>

注: 1) type=“redirect” 表示重定向, “dispatcher”表示转发 2)在发送请求是需要加上命名空间部分(namespace指定),一般的在struts中一个模块指定一个命名空间。 多模块配置文件完成。

三、Hibernate环境配置

1. 集成hibernate

创建一个web工程,在pom文件中加入hibbernate的依赖。及mysql的依赖。 <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.4.10.Final</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> hibernate核心配置文件 创建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> <property name="connection.username">root</property> <property name="connection.password">123456</property> <property name="connection.url">jdbc:mysql://localhost:3306/databaseName?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 方言 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <property name="format_sql">true</property> </session-factory> </hibernate-configuration>

该配置文件是hibernate的核心配置文件, *.hbm.xml 是orm映射文件。 3) 映射文件

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <-- name="类全限定名" table="数据库表名"--> <class name="org.jiangnaio.hibernate.entity.User" table="t_user"> <id name="id" type="java.lang.Integer"><-- name:对象属性名 type:属性类型 --> <column name="id"/><--name:数据库字段名--> <generator class="increment"/><--主键 自增长--> </id> <-- property name:对象属性名 type:属性类型 column:数据库字段名--> <property name="userName" type="java.lang.String" column="user_name"/> <property name="userPwd" type="java.lang.String" column="user_pwd"/> <property name="realName" type="java.lang.String" column="real_name"/> <property name="sex" type="java.lang.String" column="sex"/> <property name="birthday" type="java.util.Date" column="birthday"/> <property name="createDatetime" type="java.util.Date" column="create_datetime"/> <property name="remark" type="java.lang.String" column="remark"/> </class> </hibernate-mapping>

4)在映射文件编写完后,需要加入核心配置文件中

<session-factory> <property name="connection.username">root</property> <property name="connection.password">123456</property> <property name="connection.url">jdbc:mysql://localhost:3306/bookshop?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 方言 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <!-- 映射文件 resource="文件路径" --> <mapping resource="mapping/User.hbm.xml"/> </session-factory>

5) 有些字段是又数据库自动生成,并不需要更新。例如:记录的生成时间。在hibernate中配置如下:

<property name="createDatetime" type="java.util.Date" column="create_datetime" insert="false" update="false"/>

2.加入Ehcache以及log4j

使用ORM映射框架还得了解缓存。这里使用的是Ehcache缓存 pom.xml文件中加入Ehcache依赖:

<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.0</version> </dependency>

Ehcache核心配置ehcache.xml如下:

<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false"> <!--磁盘存储:将缓存中暂时不使用的对象,转移到硬盘,类似于Windows系统的虚拟内存--> <!--path:指定在硬盘上存储对象的路径--> <!--java.io.tmpdir 是默认的临时文件路径。 可以通过如下方式打印出具体的文件路径 System.out.println(System.getProperty("java.io.tmpdir"));--> <diskStore path="java.io.tmpdir"/> <!--defaultCache:默认的管理策略--> <!--eternal:设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断--> <!--maxElementsInMemory:在内存中缓存的element的最大数目--> <!--overflowToDisk:如果内存中数据超过内存限制,是否要缓存到磁盘上--> <!--diskPersistent:是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false--> <!--timeToIdleSeconds:对象空闲时间(单位:秒),指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问--> <!--timeToLiveSeconds:对象存活时间(单位:秒),指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问--> <!--memoryStoreEvictionPolicy:缓存的3 种清空策略--> <!--FIFO:first in first out (先进先出)--> <!--LFU:Less Frequently Used (最少使用).意思是一直以来最少被使用的。缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存--> <!--LRU:Least Recently Used(最近最少使用). (ehcache 默认值).缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存--> <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/> <!--name: Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)--> <cache name="stuCache" eternal="false" maxElementsInMemory="100" overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0" timeToLiveSeconds="300" memoryStoreEvictionPolicy="LRU"/> </ehcache>

上面是针对Ehcache的缓存配置,但是Hibernate需要的是二级缓存,配置如下: pom.xml引入依赖

<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>5.4.10.Final</version> </dependency>

在Hibernate的核心配置中需要加入二级缓存的相关配置

<!-- 开启二级缓存 --> <property name="hibernate.cache.use_second_level_cache">true</property> <!-- 开启查询缓存 --> <property name="hibernate.cache.use_query_cache">true</property> <!-- EhCache驱动 --> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

同时还需要在需要开启二级缓存的Hibernate实体配置中开启二级缓存

<cache usage="read-only" region="org.luobai.test.entity.User"/>

region为需要缓存的类的全限定名

需要注意的是使用Query查询需要编写代码来开启二级缓存

public List<User> getAllUser() { Session session = SessionFactoryUtil.OpenSession();//这是自己定义的方法 //可以简写为:"from User u" String hql = "select u from User u"; Query<User> query = session.createQuery(hql);//hql查询 //使用Query查询需要编写代码来开启二级缓存 query.setCacheRegion("com.zking.hbdemo.entity.User");//手动开启二级缓存 query.setCacheable(true); List<User> us = query.list(); return us; }

3.装配日志系统

集成slf4j+log4j2 1)pom.xml引入依赖

<!-- log配置:Log4j2 + Slf4j --> <!-- slf4j核心包 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.7</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.7</version> <scope>runtime</scope> </dependency> <!--用于与slf4j保持桥接 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.9.1</version> </dependency> <!--核心log4j2jar包 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.9.1</version> </dependency> <!--web工程需要包含log4j-web,非web工程不需要 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.9.1</version> <scope>runtime</scope> </dependency> <!--需要使用log4j2的AsyncLogger需要包含disruptor --> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.2.0</version> </dependency>

2)配置文件(log4j2.xml),放入resources目录

<?xml version="1.0" encoding="UTF-8"?> <!-- WARN:警告信息 monitorInterval:制定log4j的自动重新配置时间 单位为s 最小为5s --> <Configuration status="WARN" monitorInterval="30"> <!-- 日志文件输出的目录 --> <Properties> <Property name="LOG_HOME">/root/workspace/lucenedemo/logs</Property><!-- 主目录 --> <property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/error</property><!-- 错误信息日志 --> <property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warn</property><!-- 警告信息 --> <!-- %d{yyyy-MM-dd HH:mm:ss.SSS}:输出当前系统时间 精确到毫秒数 --> <!-- %t:输出当前线程的名称 --> <!-- %L:输出行号 --> <!-- %-5level:输出日志的级别,其中-5表示左对齐并且固定为5个字符,如果不足5个字符则用0补足 --> <!-- %logger:输出logger名称 --> <!-- %msg:输出日志文本 --> <!-- %n:换行 --> <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n</property><!-- 日志信息格式 --> </Properties> <Appenders> <!-- 设置控制台打印的日志信息 --> <Console name="Console" target="SYSTEM_OUT"> <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) level目前级别为:trace --> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" /> <!-- 日志的输出格式:直接为最开始定义的属性:PATTERN --> <PatternLayout pattern="${PATTERN}" /> </Console> <!-- 文件会打印出所有信息,log程序每次运行会自动清空,是否清空由append属性决定 --> <!-- append为true则表示信息添加到指定的文件中,false则表示会覆盖制定的文件中的内容,默认值为true:添加操作 --> <File name="log" fileName="logs/test.log" append="false"> <!-- 日志的输出格式:和初始格式相比 不输出行数 --> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> </File> <!-- 打印出所有info以下级别的信息 每次日志信息超过文件大小,则自动按年月日份建立文件夹 并压缩 做存档 --> <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> <Policies> <!-- 基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。 modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am. --> <!-- 关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval, 日期格式精确到哪一位,interval也精确到哪一个单位 --> <!-- log4j2的按天分日志文件 : info-%d{yyyy-MM-dd}-%i.log --> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> </RollingFile> <RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log" filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"> <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" /> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> <Policies> <TimeBasedTriggeringPolicy /> <!-- SizeBasedTriggeringPolicy:Policies子节点, 基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小. --> <!-- <SizeBasedTriggeringPolicy size="2 kB" /> --> <SizeBasedTriggeringPolicy size="2 kB" /> </Policies> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 --> <DefaultRolloverStrategy max="20" /> </RollingFile> <RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log" filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" /> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> </Policies> </RollingFile> </Appenders> <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 --> <Loggers> <!--过滤掉spring和mybatis的一些无用的DEBUG信息 --> <logger name="org.springframework" level="INFO"></logger> <logger name="org.mybatis" level="INFO"></logger> <!-- 第三方日志系统 --> <logger name="org.springframework" level="ERROR" /> <logger name="org.hibernate" level="ERROR" /> <logger name="org.apache.struts2" level="ERROR" /> <logger name="com.opensymphony.xwork2" level="ERROR" /> <logger name="org.jboss" level="ERROR" /> <!-- 配置日志的根节点 --> <root level="all"> <appender-ref ref="Console" /> <appender-ref ref="RollingFileInfo" /> <appender-ref ref="RollingFileWarn" /> <appender-ref ref="RollingFileError" /> </root> </Loggers> </Configuration>

四.Spring环境配置

1.pom文件配置

<-- 定义版本常量 -> <properties> <spring.version>5.2.6.RELEASE</spring.version> </properties> <!-- spring 相关 --> <!-- spring核心工具包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <!-- 提供在基础IOC功能上的扩展服务, 此外还提供许多企业级服务的支持,有邮件服务、任务调度、JNDI定位,EJB集成、远程访问、缓存以及多种视图层 框架的支持。 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- 整合第三方的orm实现,如hibernate,Mbatis,jdo以及spring 的jpa实现 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <!-- 包含Web应用开发时,用到Spring框架时所需的核心类, 包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的 支持类、Filter类和大量工具辅助类。 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <!-- 对JUNIT等测试框架的简单封装 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- Spring的面向切面编程,提供AOP(面向切面编程)的实现 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <!-- Spring提供的对AspectJ框架的整合 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <!-- 所有应用都用到,包含访问配置文件,创建和管理bean等,是Spring IOC的基础实现。 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <!-- 对JDBC 的简单封装 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency>

2.spring的核心配置文件

<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 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/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> </beans>

3.spring在web中的配置

<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-*.xml</param-value><!-- 运用通配符 直接配置所有的有关spring的xml文件 --> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>

五.SSH基本项目工程配置集成

1.pom.xml文件

<properties> <hibernate.version>5.2.12.Final</hibernate.version> <mysql.driver.version>5.1.44</mysql.driver.version> <spring.version>5.2.6.RELEASE</spring.version> <struts2.version>2.5.13</struts2.version> <slf4j.version>1.7.7</slf4j.version> <log4j.version>2.9.1</log4j.version> <disruptor.version>3.2.0</disruptor.version> <junit.version>4.12</junit.version> <servlet.version>4.0.1</servlet.version> <jstl.version>1.2</jstl.version> <standard.version>1.1.2</standard.version> <tomcat-jsp-api.version>8.5.20</tomcat-jsp-api.version> </properties> <dependencies> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- spring 相关 --> <!-- spring核心工具包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <!-- 提供在基础IOC功能上的扩展服务, 此外还提供许多企业级服务的支持,有邮件服务、任务调度、JNDI定位,EJB集成、远程访问、缓存以及多种视图层 框架的支持。 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- 整合第三方的orm实现,如hibernate,Mbatis,jdo以及spring 的jpa实现 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <!-- 包含Web应用开发时,用到Spring框架时所需的核心类, 包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的 支持类、Filter类和大量工具辅助类。 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <!-- 对JUNIT等测试框架的简单封装 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <!-- Spring的面向切面编程,提供AOP(面向切面编程)的实现 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <!-- Spring提供的对AspectJ框架的整合 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <!-- 所有应用都用到,包含访问配置文件,创建和管理bean等,是Spring IOC的基础实现。 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <!-- 对JDBC 的简单封装 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!-- hibernate相关 --> <!-- hibernate核心 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <!-- hibernate连接池 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>${hibernate.version}</version> </dependency> <!-- hibernate二级缓存 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>${hibernate.version}</version> </dependency> <!-- 数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.driver.version}</version> </dependency> <!--3. struts2相关(2.5.13) --> <!-- struts2核心 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>${struts2.version}</version> <!-- 排除传递依赖 --> <exclusions> <exclusion> <artifactId>commons-io</artifactId> <groupId>commons-io</groupId> </exclusion> <exclusion> <artifactId>log4j-api</artifactId> <groupId>org.apache.logging.log4j</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>${struts2.version}</version> <!-- 排除传递依赖 --> <exclusions> <exclusion> <artifactId>spring-web</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-beans</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-context</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>spring-core</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <!--4. log配置:Log4j2 + Slf4j --> <!-- slf4j核心包 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>${slf4j.version}</version> <scope>runtime</scope> </dependency> <!--用于与slf4j保持桥接 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>${log4j.version}</version> <exclusions> <exclusion> <artifactId>slf4j-api</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> <!--核心log4j2jar包 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j.version}</version> </dependency> <!--web工程需要包含log4j-web,非web工程不需要 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>${log4j.version}</version> <scope>runtime</scope> </dependency> <!--需要使用log4j2的AsyncLogger需要包含disruptor --> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>${disruptor.version}</version> </dependency> <!--5. other --> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- servlet依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency> <!--6. jstl --> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>${standard.version}</version> </dependency> <!-- 7. jsp自定义标签依赖 (必须与tomcat的版本一致) --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jsp-api</artifactId> <version>${tomcat-jsp-api.version}</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>ProjectName</finalName> <plugins> <!--第一步就是配置maven-compiler-plugin插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>

2.web.xml基本配置

<!-- spring监听 初始化信息 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 注意中文编码过滤器要作为配置的第一个过滤器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <!-- 中央控制器 --> <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.util.IntrospectorCleanupListener</listener-class> </listener> <!-- 就是允许在每次的整个request的过程中使用同一个hibernate session,可以在这个request任何时期lazy loading数据 --> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

3.struts2基本核心

不变的文件:struts.xml

<?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> <include file="struts-base.xml"></include> </struts>

不变的文件:struts-base.xml

<?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> <!-- 全局属性 --> <constant name="struts.i18n.encoding" value="UTF-8" /><!-- 字符编码 --> <constant name="struts.devMode" value="true" /><!-- 开发模式:打印出更多的调试信息 --> <constant name="struts.configuration.xml.reload" value="true" /><!-- xml文件发生修改自动刷新 --> <constant name="struts.i18n.encoding" value="UTF-8" /><!-- 字符编码 --> <constant name="struts.i18n.reload" value="true" /><!-- 国际化配置文件 --> <!-- struts必须的默认配置 --> <include file="struts-default.xml" /> <package name="base" extends="struts-default" abstract="true"> <global-allowed-methods>regex:.*</global-allowed-methods><!-- 开启动态方法调用 --> </package> </struts>

4.spring集成文件

在这个文件(spring-base.xml)中配置了次c3p0连接池,hibernate的核心配置和*.hbm.xml配置文件以及通知和切入点的集成

<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 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/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> <context:property-placeholder location="classpath:db.properties" /> <!-- 配置c3p0连接池,管理数据库连接,提高效率 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${db.driverClass}" /> <property name="jdbcUrl" value="${db.jdbcUrl}" /> <property name="user" value="${db.username}" /> <property name="password" value="${db.password}"/> <!--连接池中保留的最小连接数。 --> <property name="minPoolSize" value="${db.minPoolSize}" /> <!--连接池中保留的最大连接数。Default: 15 --> <property name="maxPoolSize" value="${db.maxPoolSize}" /> <!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> <property name="initialPoolSize" value="${db.initialPoolSize}" /> <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> <property name="maxIdleTime" value="${db.maxIdleTime}" /> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement" value="${db.acquireIncrement}" /> <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 属于单个connection而不是整个连接池。 所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 --> <property name="maxStatements" value="${db.maxStatements}" /> <!--每60秒检查所有连接池中的空闲连接。Default: 0 --> <property name="idleConnectionTestPeriod" value="60" /> <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> <property name="acquireRetryAttempts" value="${db.acquireRetryAttempts}" /> <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。 如果设为true,那么在尝试 获取连接失败后该数据源将申明已断开并永久关闭。Default: false --> <property name="breakAfterAcquireFailure" value="${db.breakAfterAcquireFailure}" /> <!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod 或automaticTestTable 等方法来提升连接测试的性能。Default: false --> <property name="testConnectionOnCheckout" value="${db.testConnectionOnCheckout}" /> <!-- 用来配置测试连接的一种方式。配置一个表名,连接池根据这个表名创建一个空表, 并且用自己的测试sql语句在这个空表上测试数据库连接 这个表只能由c3p0来使用, 用户不能操作,同时用户配置的preferredTestQuery 将会被忽略 --> <property name="automaticTestTable" value="test"/> </bean> <!-- hibernate与spring集成 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!-- 指定数据源 --> <property name="dataSource"> <ref bean="dataSource" /> </property> <!-- 指定hibernate相关属性 --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.use_sql_comments">true</prop> <!--ehcache--> <prop key="hibernate.cache.use_second_level_cache">true</prop> <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory </prop> <prop key="hibernate.cache.use_query_cache">true</prop> </props> </property> <!-- 指定实体映射文件 --> <property name="mappingResources"> <list> <!-- 在此处将*.hbm.xml配置进来, Account.hbm.xml为配置示例 --> <!-- <value>mapping/Account.hbm.xml</value> --> </list> </property> </bean> <!-- hibernateTemplate 集成之后通过模板使用hibernate --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <!--声明式事务配置开始 --> <!--1) 开启自动代理 --> <aop:aspectj-autoproxy /> <!--2) 事务管理器 begin/commit/rollback --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!--3) 定义事务特性 --> <!-- 环绕通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="edit*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="load*" propagation="REQUIRED" read-only="true" /> <tx:method name="list*" propagation="REQUIRED" read-only="true" /> <tx:method name="do*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <!--4) 定义切入点--> <aop:config> <!-- pointcut属性用来定义一个切入点,分成四个部分理解 [* ][*..][*Service][.*(..)] --> <!-- A: 返回类型,*表示返回类型不限 --> <!-- B: 包名,*..表示包名不限 --> <!-- C: 类或接口名,*Service表示类或接口必须以Service结尾 --> <!-- D: 方法名和参数,*(..)表示方法名不限,参数类型和个数不限 --> <aop:advisor advice-ref="txAdvice" pointcut="execution(* *..*Service.*(..))" /> </aop:config> <!-- 声明式事务配置结束 --> </beans>

5.db.properties文件配置

由于hibernate核心配置文件已经配置进入了spring集成文件,spring-base.xml中,所以需要一个文件统一管理hibernate数据库连接的基本信息,于是就通过db.properties文件统一管理。 文件配置信息具体的含义在5.4中都有具体的注释。

db.username=root db.password=123456 db.driverClass=com.mysql.jdbc.Driver db.jdbcUrl=jdbc:mysql://localhost:3306/ssh2?useUnicode=true&characterEncoding=UTF-8&useSSL=false db.initialPoolSize=10 db.maxPoolSize=20 db.minPoolSize=5 db.maxIdleTime=60 db.acquireIncrement=5 db.maxStatements=0 db.idleConnectionTestPeriod=60 db.acquireRetryAttempts=30 db.breakAfterAcquireFailure=true db.testConnectionOnCheckout=false

6.log4j2的配置

<?xml version="1.0" encoding="UTF-8"?> <!-- status : 指定log4j本身的打印日志的级别.ALL< Trace < DEBUG < INFO < WARN < ERROR < FATAL < OFF。 monitorInterval : 用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s. --> <Configuration status="WARN" monitorInterval="30"> <Properties> <!-- 配置日志文件输出目录 ${sys:user.home} --> <Property name="LOG_HOME">/root/workspace/lucenedemo/logs</Property> <property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/error</property> <property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warn</property> <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n</property> </Properties> <Appenders> <!--这个输出控制台的配置 --> <Console name="Console" target="SYSTEM_OUT"> <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" /> <!-- 输出日志的格式 --> <!-- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 %p : 日志输出格式 %c : logger的名称 %m : 日志内容,即 logger.info("message") %n : 换行符 %C : Java类名 %L : 日志输出所在行数 %M : 日志输出所在方法名 hostName : 本地机器名 hostAddress : 本地ip地址 --> <PatternLayout pattern="${PATTERN}" /> </Console> <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 --> <!--append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true --> <File name="log" fileName="logs/test.log" append="false"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> </File> <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size, 则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 --> <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log"> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" /> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> <Policies> <!-- 基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。 modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am. --> <!-- 关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval, 日期格式精确到哪一位,interval也精确到哪一个单位 --> <!-- log4j2的按天分日志文件 : info-%d{yyyy-MM-dd}-%i.log --> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> <!-- SizeBasedTriggeringPolicy:Policies子节点, 基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小. --> <!-- <SizeBasedTriggeringPolicy size="2 kB" /> --> </Policies> </RollingFile> <RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log" filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log"> <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" /> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="2 kB" /> </Policies> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 --> <DefaultRolloverStrategy max="20" /> </RollingFile> <RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log" filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log"> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" /> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> <Policies> <!-- log4j2的按分钟 分日志文件 : warn-%d{yyyy-MM-dd-HH-mm}-%i.log --> <TimeBasedTriggeringPolicy interval="1" modulate="true" /> <!-- <SizeBasedTriggeringPolicy size="10 MB" /> --> </Policies> </RollingFile> </Appenders> <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 --> <Loggers> <!--过滤掉spring和mybatis的一些无用的DEBUG信息 --> <logger name="org.springframework" level="INFO"></logger> <logger name="org.mybatis" level="INFO"></logger> <!-- 第三方日志系统 --> <logger name="org.springframework" level="ERROR" /> <logger name="org.hibernate" level="ERROR" /> <logger name="org.apache.struts2" level="ERROR" /> <logger name="com.opensymphony.xwork2" level="ERROR" /> <logger name="org.jboss" level="ERROR" /> <logger name="net.sf.ehcache" level="ERROR" /> <logger name="com.mchange.v2" level="ERROR" /> <!-- 配置日志的根节点 --> <root level="all"> <appender-ref ref="Console" /> <appender-ref ref="RollingFileInfo" /> <appender-ref ref="RollingFileWarn" /> <appender-ref ref="RollingFileError" /> </root> </Loggers> </Configuration>

此文只是是为了方便博主和博主的朋友所写的简单配置,其中的具体原理与代码使用,不做详解

最新回复(0)