閑來無事,用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 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