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