下载maven安装包,解压即可使用,下载地址:http://maven.apache.org/download.cgi
添加Mavne系统变量
修改path添加maven相关路径
Maven验证安装
Maven仓库配置 在搭建好Maven环境之后,创建Mavne工程会在默认地址生成一个本地仓库 复制settings.xml文件到**.m2**文件下
将.m2文件中settings.xml的远程仓库换成国内阿里云仓库
注意: 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的核心配置文件, *.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&characterEncoding=utf-8&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"/>使用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; }集成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>不变的文件: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>在这个文件(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>由于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此文只是是为了方便博主和博主的朋友所写的简单配置,其中的具体原理与代码使用,不做详解