SSM(Spring5.x+Mybatis3)框架搭建【解决日志问题】(Github源码)

闲来无事,用SSM写个小东西,发现spring已经迭代到5.x了,遂出此文,希望对各位同学有些许帮助。

IDE:idea

OS:windows

源代码:https://github.com/JHeaven/ssm-easy-demo

直接用模板新建MAVEN项目,看清楚是哪个webapp,别选错了

相关信息,略

加上这个参数,不然创建项目的时候巨慢

稍等,至如下画面,即完成maven 基本web项目创建

现在的项目结构是这样的

添加基础的包结构,先这样,需要什么之后再加

下面我们导包,即配置pom文件

注意oracle 的包需要自己打进本地仓库

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 
  3 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5   <modelVersion>4.0.0</modelVersion>
  6 
  7   <groupId>com.jiangyuqin.ssm-sc</groupId>
  8   <artifactId>ssm-sc</artifactId>
  9   <version>1.0-SNAPSHOT</version>
 10   <packaging>war</packaging>
 11 
 12   <name>ssm-sc Maven Webapp</name>
 13   <url>http://www.jiangyuqin.com</url>
 14 
 15 
 16 
 17   <properties>
 18     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 19     <maven.compiler.source>1.7</maven.compiler.source>
 20     <maven.compiler.target>1.7</maven.compiler.target>
 21     <oracle.version>11.2.0.1.0</oracle.version>
 22 
 23     <!-- 截至2018年10月25日 均为最新版 -->
 24     <spring.version>5.1.1.RELEASE</spring.version>
 25     <mybatis.version>3.4.6</mybatis.version>
 26     <slf4j.version>1.7.25</slf4j.version>
 27     <log4j.version>1.2.17</log4j.version>
 28   </properties>
 29 
 30   <dependencies>
 31     <!-- spring 核心包-->
 32     <dependency>
 33       <groupId>org.springframework</groupId>
 34       <artifactId>spring-core</artifactId>
 35       <version>${spring.version}</version>
 36     </dependency>
 37     <dependency>
 38       <groupId>org.springframework</groupId>
 39       <artifactId>spring-web</artifactId>
 40       <version>${spring.version}</version>
 41     </dependency>
 42     <dependency>
 43       <groupId>org.springframework</groupId>
 44       <artifactId>spring-oxm</artifactId>
 45       <version>${spring.version}</version>
 46     </dependency>
 47     <dependency>
 48       <groupId>org.springframework</groupId>
 49       <artifactId>spring-tx</artifactId>
 50       <version>${spring.version}</version>
 51     </dependency>
 52     <dependency>
 53       <groupId>org.springframework</groupId>
 54       <artifactId>spring-jdbc</artifactId>
 55       <version>${spring.version}</version>
 56     </dependency>
 57     <dependency>
 58       <groupId>org.springframework</groupId>
 59       <artifactId>spring-webmvc</artifactId>
 60       <version>${spring.version}</version>
 61     </dependency>
 62     <dependency>
 63       <groupId>org.springframework</groupId>
 64       <artifactId>spring-aop</artifactId>
 65       <version>${spring.version}</version>
 66     </dependency>
 67     <dependency>
 68       <groupId>org.springframework</groupId>
 69       <artifactId>spring-context-support</artifactId>
 70       <version>${spring.version}</version>
 71     </dependency>
 72 
 73     <!-- oracle 驱动包 -->
 74     <dependency>
 75       <groupId>com.oracle</groupId>
 76       <artifactId>ojdbc6</artifactId>
 77       <version>${oracle.version}</version>
 78     </dependency>
 79 
 80     <!--MyBatis核心包-->
 81     <dependency>
 82       <groupId>org.mybatis</groupId>
 83       <artifactId>mybatis</artifactId>
 84       <version>${mybatis.version}</version>
 85     </dependency>
 86 
 87     <!--mybatis-spring包-->
 88     <dependency>
 89       <groupId>org.mybatis</groupId>
 90       <artifactId>mybatis-spring</artifactId>
 91       <version>1.3.2</version>
 92     </dependency>
 93 
 94     <!-- C3P0核心包 -->
 95     <dependency>
 96       <groupId>com.mchange</groupId>
 97       <artifactId>c3p0</artifactId>
 98       <version>0.9.5.2</version>
 99     </dependency>
100 
101     <!--日志管理核心包-->
102     <dependency>
103       <groupId>log4j</groupId>
104       <artifactId>log4j</artifactId>
105       <version>${log4j.version}</version>
106     </dependency>
107     <dependency>
108       <groupId>org.slf4j</groupId>
109       <artifactId>slf4j-log4j12</artifactId>
110       <version>${slf4j.version}</version>
111       <!--<scope>test</scope>-->
112     </dependency>
113     <dependency>
114       <groupId>org.slf4j</groupId>
115       <artifactId>slf4j-api</artifactId>
116       <version>${slf4j.version}</version>
117     </dependency>
118 
119     <!--格式化对象核心包-->
120     <dependency>
121       <groupId>com.alibaba</groupId>
122       <artifactId>fastjson</artifactId>
123       <version>1.2.51</version>
124     </dependency>
125 
126     <!-- 单元测试 -->
127     <dependency>
128       <groupId>junit</groupId>
129       <artifactId>junit</artifactId>
130       <version>4.11</version>
131       <scope>test</scope>
132     </dependency>
133   </dependencies>
134 
135   <build>
136     <finalName>ssm-sc</finalName>
137     <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
138       <plugins>
139         <plugin>
140           <artifactId>maven-clean-plugin</artifactId>
141           <version>3.0.0</version>
142         </plugin>
143         <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
144         <plugin>
145           <artifactId>maven-resources-plugin</artifactId>
146           <version>3.0.2</version>
147         </plugin>
148         <plugin>
149           <artifactId>maven-compiler-plugin</artifactId>
150           <version>3.7.0</version>
151         </plugin>
152         <plugin>
153           <artifactId>maven-surefire-plugin</artifactId>
154           <version>2.20.1</version>
155         </plugin>
156         <plugin>
157           <artifactId>maven-war-plugin</artifactId>
158           <version>3.2.0</version>
159         </plugin>
160         <plugin>
161           <artifactId>maven-install-plugin</artifactId>
162           <version>2.5.2</version>
163         </plugin>
164         <plugin>
165           <artifactId>maven-deploy-plugin</artifactId>
166           <version>2.8.2</version>
167         </plugin>
168       </plugins>
169     </pluginManagement>
170   </build>
171 </project>

db.properties参数文件

1 db.driver=oracle.jdbc.OracleDriver
2 db.url=jdbc:oracle:thin:@10.1.218.130:1521:orcl
3 db.user=demo
4 db.password=oracle

spring-mvc.xml spring主配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xmlns:mvc="http://www.springframework.org/schema/mvc"
 6        xsi:schemaLocation="http://www.springframework.org/schema/beans
 7     http://www.springframework.org/schema/beans/spring-beans.xsd
 8     http://www.springframework.org/schema/context
 9     http://www.springframework.org/schema/context/spring-context.xsd
10     http://www.springframework.org/schema/mvc
11     http://www.springframework.org/schema/mvc/spring-mvc.xsd">
12 
13     <!--启用spring annotation , 如果启用了component-scan 就不需要此配置了
14     <context:annotation-config/>
15     -->
16 
17     <!--注册驱动-->
18     <mvc:annotation-driven>
19 
20         <!-- 以下是spring4.2+ 用fastjson替换spring自带的json框架的配置 -->
21         <mvc:message-converters register-defaults="true">
22             <ref bean="stringHttpMessageConverter"/>
23             <ref bean="fastJsonHttpMessageConverter"/>
24         </mvc:message-converters>
25 
26     </mvc:annotation-driven>
27 
28     <bean id="stringHttpMessageConverter"
29           class="org.springframework.http.converter.StringHttpMessageConverter">
30         <constructor-arg value="UTF-8" index="0"></constructor-arg>
31         <property name="supportedMediaTypes">
32             <list>
33                 <value>text/plain;charset=UTF-8</value>
34             </list>
35         </property>
36     </bean>
37 
38     <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
39         <property name="supportedMediaTypes">
40             <list>
41                 <value>text/html;charset=UTF-8</value>
42                 <value>application/json;charset=UTF-8</value>
43             </list>
44         </property>
45         <property name="fastJsonConfig">
46             <bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
47                 <property name="features">
48                     <list>
49                         <value>AllowArbitraryCommas</value>
50                         <value>AllowUnQuotedFieldNames</value>
51                         <value>DisableCircularReferenceDetect</value>
52                     </list>
53                 </property>
54                 <property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"></property>
55             </bean>
56         </property>
57     </bean>
58 
59 
60     <!--<mvc:default-servlet-handler/>-->
61     <!--  自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器  -->
62     <context:component-scan base-package="com.jiangyuqin.controller">
63         <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
64     </context:component-scan>
65 
66     <!--配置视图解析器-->
67     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
68         <property name="prefix" value="/WEB-INF/view/"/>
69         <property name="suffix" value=".jsp"/>
70     </bean>
71 
72     <mvc:resources mapping="/lib/**" location="/static"/>
73 
74 </beans>

spring-mybatis.xml 整合文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xmlns:tx="http://www.springframework.org/schema/tx"
 6        xsi:schemaLocation="http://www.springframework.org/schema/beans
 7                            http://www.springframework.org/schema/beans/spring-beans.xsd
 8                            http://www.springframework.org/schema/context
 9                            http://www.springframework.org/schema/context/spring-context.xsd
10                            http://www.springframework.org/schema/tx
11                            http://www.springframework.org/schema/tx/spring-tx.xsd">
12 
13     <!--加载配置文件-->
14     <context:property-placeholder location="classpath:config/db.properties"/>
15 
16     <!--配置数据源-->
17     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
18         <property name="driverClass" value="${db.driver}"/>
19         <property name="jdbcUrl" value="${db.url}"/>
20         <property name="user" value="${db.user}"/>
21         <property name="password" value="${db.password}"/>
22     </bean>
23 
24     <!--spring和mybatis整合-->
25     <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
26         <property name="dataSource" ref="dataSource"/>
27         <property name="typeAliasesPackage" value="com.**.model"/>
28         <property name="mapperLocations" value="classpath*:mapper/*.xml"/>
29     </bean>
30 
31     <!--扫描mapper接口包-->
32     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
33         <property name="basePackage" value="com.**.mapper"/>
34         <property name="sqlSessionFactoryBeanName" >
35             <idref bean="SqlSessionFactory"/>
36         </property>
37     </bean>
38 
39     <!--service实现类扫描-->
40     <context:component-scan base-package="com.**.service"/>
41 
42     <!--事务管理-->
43     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
44         <property name="dataSource" ref="dataSource"/>
45     </bean>
46 
47     <tx:annotation-driven transaction-manager="transactionManager"/>
48 
49 
50 </beans>

还有web.xml

 1 <!DOCTYPE web-app PUBLIC
 2         "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 3         "http://java.sun.com/dtd/web-app_2_3.dtd" >
 4 
 5 <web-app>
 6 
 7     <display-name>Archetype Created Web Application</display-name>
 8 
 9 
10     <!--spring监听器-->
11     <listener>
12         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
13     </listener>
14     <!--防止spring内存溢出监听器-->
15     <listener>
16         <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
17     </listener>
18 
19     <!-- Spring字符集过滤器 -->
20     <filter>
21         <filter-name>SpringEncodingFilter</filter-name>
22         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
23         <init-param>
24             <param-name>encoding</param-name>
25             <param-value>UTF-8</param-value>
26         </init-param>
27         <init-param>
28             <param-name>forceEncoding</param-name>
29             <param-value>true</param-value>
30         </init-param>
31     </filter>
32     <filter-mapping>
33         <filter-name>SpringEncodingFilter</filter-name>
34         <url-pattern>/*</url-pattern>
35     </filter-mapping>
36 
37     <!-- springMVC核心配置 -->
38     <servlet>
39         <servlet-name>spring</servlet-name>
40         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
41         <init-param>
42             <param-name>contextConfigLocation</param-name>
43             <param-value>
44                 classpath:config/spring-mvc.xml
45             </param-value>
46         </init-param>
47         <load-on-startup>1</load-on-startup>
48     </servlet>
49     <servlet-mapping>
50         <servlet-name>spring</servlet-name>
51         <url-pattern>/</url-pattern>
52     </servlet-mapping>
53 
54     <!--spring和mybatis的配置文件-->
55     <context-param>
56         <param-name>contextConfigLocation</param-name>
57         <param-value>classpath:config/spring-mybatis.xml</param-value>
58     </context-param>
59 
60 
61     <!-- 日志记录 -->
62     <context-param>
63         <!-- 日志配置文件路径 -->
64         <param-name>log4jConfigLocation</param-name>
65         <param-value>classpath:config/log4j.properties</param-value>
66     </context-param>
67     <context-param>
68         <param-name>log4jRefreshInterval</param-name>
69         <param-value>60000</param-value>
70     </context-param>
71 
72 
73 </web-app>

基础配置完成,接下来,要添加请求控制和数据库交互,完成之后如下图(具体代码贴到Github了,自取,不再一一贴出):

完成以上,项目已经可以跑了。

BUT!!!!!!!!!!!细心的同学可能已经发现了端倪,日志完全没动静!

控制台输出

log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

需要注意的是spring5中貌似已经移除了 org.springframework.web.util.Log4jConfigListener,如果不配这个,日志没办法输出

 降级到4.3.20的文档

https://docs.spring.io/spring/docs/4.3.20.RELEASE/javadoc-api/

spring4.2.1 声明将弃用这个类,并且更倾向于使用log4j2

那我们接下来完全引入新的log4j2的包和slf4j桥接包

 1 <!--日志管理核心包-->
 2     <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
 3     <dependency>
 4       <groupId>org.apache.logging.log4j</groupId>
 5       <artifactId>log4j-api</artifactId>
 6       <version>${log4j.version}</version>
 7     </dependency>
 8 
 9     <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
10     <dependency>
11       <groupId>org.apache.logging.log4j</groupId>
12       <artifactId>log4j-core</artifactId>
13       <version>${log4j.version}</version>
14     </dependency>
15 
16 
17     <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-web -->
18     <dependency>
19       <groupId>org.apache.logging.log4j</groupId>
20       <artifactId>log4j-web</artifactId>
21       <version>${log4j.version}</version>
22     </dependency>
23 
24 
25     <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->
26     <dependency>
27       <groupId>org.apache.logging.log4j</groupId>
28       <artifactId>log4j-slf4j-impl</artifactId>
29       <version>${log4j.version}</version>
30     </dependency>
31 
32 
33 
34     <dependency>
35       <groupId>org.slf4j</groupId>
36       <artifactId>slf4j-api</artifactId>
37       <version>${slf4j.version}</version>
38     </dependency>

web.xml 中将日志部分的配置替换为

 1 <!-- 日志过滤器 -->
 2     <filter>
 3         <filter-name>log4jServletFilter</filter-name>
 4         <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
 5     </filter>
 6     <filter-mapping>
 7         <filter-name>log4jServletFilter</filter-name>
 8         <url-pattern>/*</url-pattern>
 9     </filter-mapping>
10 
11     <!-- 日志监听 -->
12     <listener>
13         <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
14     </listener>

 添加新的log4j2.xml 配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <Configuration status="OFF" monitorInterval="1800">
 3     <properties>
 4         <property name="LOG_HOME">/WEB-INF/logs</property>
 5         <property name="FILE_NAME">finance-pay</property>
 6     </properties>
 7 
 8 
 9     <Appenders>
10         <Console name="Console" target="SYSTEM_OUT">
11             <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
12         </Console>
13 
14         <RollingFile name="running-log" fileName="${LOG_HOME}/${FILE_NAME}.log"
15                      filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz"
16                      immediateFlush="true">
17             <PatternLayout
18                     pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>
19             <Policies>
20                 <TimeBasedTriggeringPolicy/>
21                 <SizeBasedTriggeringPolicy size="15 MB"/>
22             </Policies>
23             <DefaultRolloverStrategy max="20"/>
24         </RollingFile>
25     </Appenders>
26     <Loggers>
27 
28         <Root level="info">
29             <!-- 输入到文件-->
30             <AppenderRef ref="running-log"/>
31             <!-- 输入到控制台-->
32             <AppenderRef ref="Console"/>
33         </Root>
34     </Loggers>
35 </Configuration>

重启,无效,将log4j2.xml放到resources根目录下

成功

太难受了。。。怎么能允许单个xml在外面孤军奋战呢。。。根据之前的经验,log4j2没法简单的指定配置文件路径,揪一下文档把

翻过来就是说: Log4j将检查名为"log4j.configurationFile"系统属性,如果这个属性有值,将尝试使用与文件扩展名(这里是XML)匹配的ConfigurationFactory方法加载配置。

所谓System.property,其实就是在JVM启动的时候加上参数,这样显然也太麻烦了。。。

另外找路子,打开log4j-core的jar包,检索之后发现有这么个类 Configurator

参数皆为静态变量,尝试直接调用这个方法,先把这个configLocation 设置进去。

成功。

源代码:https://github.com/JHeaven/ssm-easy-demo

原文地址:https://www.cnblogs.com/jiangyuqin/p/9870641.html