zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    在HQL里使用set方式设置的变量
    Nuxt.js 使用vue-social-share.js 插件 分享功能实践
    渗透测试被动信息搜集工具v0.1
    burp工具tips集合
    Go语言之数据类型(二)
    Go语言之数据类型(一)
    Go语言之变量
    Go语言快速入门
    Go语言环境搭建
    [SSH]基础知识——SSH、对称加密、非对称加密、公钥、私钥、中间人攻击
  • 原文地址:https://www.cnblogs.com/jiangyuqin/p/9870641.html
Copyright © 2011-2022 走看看