闲来无事,用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