SSM框架整合笔记(一)——详细注释

前言

  接触SSM框架到现在也有很长时间了,之前也搭建过几个简单的项目,但是没有进行过记录学习和搭建的过程。网上关于ssm框架整合的资料也不少,不过说句实话,单看某一篇文章能够不踩坑的配置并跑起来的也不太多,在学习过程中筛选甄别这些就浪费了相当一部分时间。

相关文章

本文内容

  本文理论+实践的方式,分享ssm的相关概念以及采用实践操作的方式搭建整套系统。把搭建过程中踩过的坑、笔记记录整理一下,用以和感兴趣的朋友分享下。

demo下载地址

该项目持续更新中,会在代码以及该文档里面详细注释和介绍。
项目托管在码云开源平台上,链接:

https://gitee.com/nelucifer/ssm-note,点击克隆/下载获取该项目。

前置技能

  • Maven
  • IDEA
  • Tomcat

环境

  • Spring:4.2.5.RELEASE
  • Spring MVC
  • Mybatis:3.3.1
  • MySQL:5.6
  • IntelliJ IDEA: 2018.2.3
  • cxf webservice: webservice接口
  • pagehelper: 分页
  • Interceptor:拦截器配置
  • 数据结构:powerdesigner16.5

实践步骤

一、创建项目

  1. 打开IDEA,选择New->Projects,按照下面的步骤选择:
    选择Maven,然后勾选Create from archetype,选择webapp这一个
    idea创建项目-2019220215556

  2. 完成之后填入相应的maven项目组信息,GroupId是项目组织的标识符,对应java的包结构;ArtifactId是项目的标识符,对应项目的名称,即项目根目录的名称。groupId和artifactId统称为“坐标”。
    idea创建项目1-201922022652

  3. 填写完成之后点击Next,选择setting.xml和repository路径,如下图:
    idea创建项目2-201922022821

  4. 点击Finish后,maven会根据原型自动创建需要的一些配置信息以及目录结构,等待配置完成,初始项目结构如下:
    idea创建项目3-2019220221329

  5. 在main文件夹下创建文件夹java、resources,src文件夹下创建test,test文件夹下创建java文件夹;
    在java文件夹上右键 -> Mark Directory as,java文件夹选择Sources Root,resources文件夹上选择Resources Root,test文件夹下的java文件夹上选择Test Resources Root
    操作如下:
    idea创建项目4-201922104817
    完成后的项目结构如下:
    idea创建完成后的项目结构-201922105549

二、配置pom.xml和spring

详细的解释直接在代码里面注释了。开始贴代码:

1. pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--maven模块版本:声明项目描述符遵循哪一个POM模型版本,默认是4.0.0-->
<modelVersion>4.0.0</modelVersion>
<!--项目组织的唯一标识符-->
<groupId>com.weyoung</groupId>
<!--项目的唯一标识符,和groupId共同唯一标识该项目或组件-->
<artifactId>ssm-note</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包方式,可以选择war和jar-->
<packaging>war</packaging>
<!--项目的名称,Maven产生的文档用-->
<name>ssm-note Maven Webapp</name>
<!--项目主页的URL,Maven产生的文档用-->
<url>http://www.example.com</url>
<!--项目的详细描述,Maven产生的文档用-->
<description>maven+ssm项目整合笔记</description>

<!--项目的问题管理系统-->
<issueManagement>
<system>jira</system>
<!--该项目使用的问题管理系统的URL-->
<url></url>
</issueManagement>

<!--项目开发者列表-->
<developers>
<!--某个项目开发者的信息-->
<developer>
<!--项目开发者id-->
<id>coder_lixia</id>
<!--项目开发者的全名-->
<name>lixia</name>
<email>ne_lucifer@163.com</email>
<!--项目开发者主页URL-->
<url>http://www.wanglixia.top/</url>
<!--项目开发者项目中的角色-->
<roles>
<role>Project Manager</role>
</roles>
<!--项目开发者所属组织-->
<organization></organization>
<!--项目开发者所属组织的URL-->
<organizationUrl></organizationUrl>
</developer>
</developers>

<!-- 以值替代名称,Properties可以在整个POM中使用,也可以作为触发条件(见settings.xml配置文件里
activation元素的说明)。格式是<name>value</name>。 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>

<plugin.maven-compiler>3.1</plugin.maven-compiler>
<javac.target.version>1.8</javac.target.version>
<!-- 此处spring.version即为下面${spring.version的值} -->
<spring.version>4.2.5.RELEASE</spring.version>
<jstl.version>1.2</jstl.version>
<commons-logging.version>1.1.1</commons-logging.version>
<mybatis.version>3.3.1</mybatis.version>
<mybatis-spring.version>1.2.4</mybatis-spring.version>
<mysql-connector-java.version>5.1.26</mysql-connector-java.version>
<log4j.version>1.2.14</log4j.version>
<slf4j.log4j12.version>1.7.12</slf4j.log4j12.version>
<servlet-api.version>2.5</servlet-api.version>
<commons-io.version>2.4</commons-io.version>
<commons-fileupload.version>1.3</commons-fileupload.version>
<gson.version>2.2.2</gson.version>
<druid.version>1.0.25</druid.version>
<cxf.version>3.1.6</cxf.version>
<fastjson.version>1.2.32</fastjson.version>
<pagehelper.version>5.1.2</pagehelper.version>
<jackson.version>2.7.4</jackson.version>
</properties>


<!-- 发现依赖和扩展的远程仓库列表 -->
<repositories>
<!-- 包含需要连接到远程仓库的信息 -->
<repository>
<!-- 远程仓库id,可以用来匹配在settings.xml文件里配置的远程仓库 -->
<id>public</id>
<!-- 远程仓库名称 -->
<name>aliyun nexus</name>
<!-- 远程仓库URL -->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<!-- 处理远程仓库里发布版本的下载 -->
<releases>
<!-- true或false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 -->
<enabled>true</enabled>
<!-- 更新构件的频率。Maven会比较本地POM和远程POM的时间戳。选项:always(一直),daily(默认每日),inteval:X(X是以分钟为单位),never(从不)-->
<updatePolicy>never</updatePolicy>
<!-- 当Maven验证构件校验文件失败时怎么做:ignore(忽略),fail(失败),warn(警告) -->
<checksumPolicy>ignore</checksumPolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</snapshots>
<!-- 用于定位和排序构件的仓库布局类型-可以使default(默认)或者legacy(遗留) -->
<layout>default</layout>
</repository>
</repositories>

<!-- 发现插件的远程仓库列表,这些插件用于构建和报表 -->
<pluginRepositories>
<!-- 包含需要连接到远程插件仓库的信息.参见repositories/repository元素 -->
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>

<!--项目相关的所有依赖-->
<dependencies>
<dependency>
<!-- 依赖的groupID -->
<groupId>junit</groupId>
<!-- 依赖的artifactID-->
<artifactId>junit</artifactId>
<!-- 依赖的版本号 -->
<version>4.12</version>
<!-- 依赖类型,默认类型是jar,类型一般和使用的打包方式对应,如jar,war等,也有例外,如test-jar等 -->
<type>jar</type>
<!-- 依赖范围。
- compile:默认范围,用于编译
- provided:类似于编译
- runtime:在运行时使用
- test:用于test时使用
- system: 需要外在提供相应的元素。通过systemPath来取得 -->
<scope>test</scope>
<!-- systemPath:仅用于范围为system。提供相应的路径,不鼓励使用该元素 -->
<!--<systemPath></systemPath>-->
<!-- 可选依赖,当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用 -->
<optional>true</optional>

<!-- 当计算传递依赖时,从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖项目的
依赖。此元素主要用于解决版本冲突问题 -->
<!--<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>-->
</dependency>
<!-- spring配置-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- 1)Spring核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- 2)Spring DAO层 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- 3)Spring web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- 4)Spring test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>

<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${commons-logging.version}</version>
</dependency>

<!-- mybatis包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!--mybatis spring插件-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!-- mysql连接驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
</dependency>
<!--druid==>阿里巴巴数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.log4j12.version}</version>
</dependency>
<!-- servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet-api.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<!-- 文件上传 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
<!-- 解析json-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson.version}</version>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>

<!-- 分页助手 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>

<!-- cxf webservice -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
</dependencies>

<!-- 构建项目需要的信息 -->
<build>
<!-- 产生的构件的文件名,默认值是${artifactId}-${version} -->
<finalName>ssm-note</finalName>
<!-- 子项目可以引用的默认插件信息。 -->
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<!-- 插件列表 -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

2. spring-config.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

<!-- base-package属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理
如果某个类的头上带有特定的注解【@Component/@Repository/@Service/@Controller】,
就会将这个对象作为Bean注册进Spring容器 -->
<context:component-scan base-package="com.weyoung.service"/>
<context:component-scan base-package="com.weyoung.dao"/>

<!-- 配置mybatis的sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="MySQLDataSource"/>
<!-- 自动扫描的mybatis mapper.xml文件路径 -->
<property name="mapperLocations" value="classpath:/mappers/*.xml"/>
<!-- Mybatis配置文件 -->
<property name="configLocation" value="classpath:config/mybatis-config.xml"/>
</bean>

<!-- 事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="MySQLDataSource"/>
</bean>

<!-- 自动扫描的dao接口所在的包名 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.weyoung.dao"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>

<!-- 引入数据库配置文件 -->
<bean id="dataSourceConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:config/jdbc.properties"/>
</bean>

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>

<!-- 配置事务通知属性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 定义事务传播属性 -->
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="edit*" propagation="REQUIRED"/>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="new*" propagation="REQUIRED"/>
<tx:method name="set*" propagation="REQUIRED"/>
<tx:method name="remove*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="change*" propagation="REQUIRED"/>
<tx:method name="get*" propagation="REQUIRED" read-only="true"/>
<tx:method name="find*" propagation="REQUIRED" read-only="true"/>
<tx:method name="load*" propagation="REQUIRED" read-only="true"/>
<tx:method name="*" propagation="REQUIRED" read-only="true"/>
</tx:attributes>
</tx:advice>

<!-- 配置事务切面 -->
<aop:config>
<aop:pointcut id="serviceOperation" expression="execution(* com.weyoung.service.*.*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>
</aop:config>

<!-- MySQL数据源配置-->
<bean id="MySQLDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${jdbc.mysql.driver}"/>
<property name="url" value="${jdbc.mysql.url}"/>
<property name="username" value="${jdbc.mysql.username}"/>
<property name="password" value="${jdbc.mysql.password}"/>
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="${jdbc.initialSize}"/>
<property name="minIdle" value="${jdbc.minIdle}"/>
<property name="maxActive" value="${jdbc.maxActive}"/>

<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${jdbc.maxWait}"/>

<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}"/>

<property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>

<!-- 这里建议配置为TRUE,防止取到的连接不可用 -->
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="false" />

<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />

<!-- 配置提交方式,默认就是true,可以不用配置 -->
<property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}"/>

<!-- 验证连接有效与否的SQL,不同的数据配置不同 -->
<!--<property name="validationQuery" value="select 1 " />-->
<property name="filters" value="stat" />
<property name="proxyFilters">
<list>
<ref bean="logFilter" />
</list>
</property>
</bean>

<bean id="logFilter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter">
<property name="statementExecutableSqlLogEnable" value="false" />
</bean>

</beans>

3. spring-mvc.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

<!-- 自动扫描该包,使SpringMVC认为包下(包括子集)用了@controller注解的类是控制器 -->
<context:component-scan base-package="com.weyoung.controller"/>
<context:annotation-config/>

<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<!-- 默认的注解映射的支持 -->
<mvc:annotation-driven>
<mvc:message-converters>
<ref bean="stringHttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>

<!-- 解决js,main.webapp.layouts.css,images访问不到的问题-->
<mvc:resources mapping="/plugins/**" location="/plugins/"/>
<mvc:resources mapping="/layouts/**" location="/layouts/"/>
<mvc:resources mapping="/statics/**" location="/statics/"/>

<!--拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.weyoung.system.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>

<!-- 文件上传配置注意:这里申明的id必须为multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--文件编码-->
<property name="defaultEncoding" value="UTF-8"/>
<!--文件大小最大值-->
<property name="maxUploadSize" value="10485760000"/>
<!--内存中的最大值-->
<property name="maxInMemorySize" value="40960"/>
</bean>

<!--简单的上传异常处理-->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">/error/upload_error.jsp
</prop>
</props>
</property>
</bean>

<!--根据 controller 返回的字符串 找到viewResolver -->
<bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="1"></property>
</bean>
<!-- HandlerMapping -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

<bean id="contentNegotiationManager"
class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorParameter" value="false"/>
<property name="parameterName" value="format"/>
<property name="ignoreAcceptHeader" value="true"/>
<property name="mediaTypes">
<value>
json=application/json
xml=application/xml
</value>
</property>
<property name="defaultContentType" value="text/html"/>
</bean>

<!-- SpringMVC消息处理——消息转换器 -->
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" index="0"/>
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>

<!--spring-mvc 视图解析器-->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/front-end/"/>
<property name="suffix" value=".jsp"/>
<property name="order" value="1"/>
</bean>

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="contentNegotiationManager" ref="contentNegotiationManager"/>
<property name="defaultViews">
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
</property>
</bean>
</beans>

4. jdbc.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#============================================================================
# MySQL
#============================================================================
jdbc.mysql.driver=com.mysql.jdbc.Driver
jdbc.mysql.url=jdbc:mysql://localhost:3306/SSM_NOTE?useUnicode=true&characterEncoding=utf8
jdbc.mysql.username=root
jdbc.mysql.password=lucifer

#============================================================================
# common settings
#============================================================================
jdbc.initialSize=5
jdbc.minIdle=5
jdbc.maxActive=100
jdbc.maxWait=100000
jdbc.defaultAutoCommit=false
jdbc.removeAbandoned=true
jdbc.removeAbandonedTimeout=600
jdbc.testWhileIdle=true
jdbc.timeBetweenEvictionRunsMillis=60000
jdbc.minEvictableIdleTimeMillis=300000

5. log4j.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# 定义输出风格
ConversionPattern=%d %-5p [%t] %c - %m%n

# 配置根Logger
## 日志输出级别
log4j.rootLogger=debug,Console,D
log4j.logger.com.cnblogs.lzrabbit=DEBUG
log4j.logger.org.springframework=ERROR
log4j.logger.org.mybatis=DEBUG
log4j.logger.org.apache.ibatis=DEBUG
log4j.logger.org.quartz=ERROR
log4j.logger.org.apache.axis2=ERROR
log4j.logger.org.apache.axiom=ERROR
log4j.logger.org.apache=ERROR
log4j.logger.httpclient=ERROR
#log4j.additivity.org.springframework=false

# ==========输出到控制台==========
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
# Layout:日志输出格式
# org.apache.log4j.PatternLayout:可以灵活地指定布局模式
# org.apache.log4j.HTMLLayout:以HTML表格形式布局
# org.apache.log4j.SimpleLayout:包含日志信息的级别和信息字符串
# org.apache.log4j.TTCCLayout:包含日志产生的时间、线程、类别等等信息
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=${ConversionPattern}
#log4j.appender.Console.encoding=UTF-8

# ==========输出到日志文件==========
# Appender为日志输出目的地,Log4j提供的appender有以下几种:
# org.apache.log4j.ConsoleAppender(控制台),
# org.apache.log4j.FileAppender(文件),
# org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
# org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
# org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.D.File=logs/ssm-note.log
log4j.appender.D.Append=true
## 输出日志级别
log4j.appender.D.Threshold=DEBUG
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.encoding=UTF-8

# ==========输出异常信息日志文件==========
log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.E.File=logs/daily.log
log4j.appender.E.Append=true
log4j.appender.E.Threshold=ERROR
log4j.appender.E.layout=org.apache.log4j.PatternLayout
log4j.appender.E.encoding=UTF-8
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r]-[%p] %m%n

# 打印参数
# %c 输出日志信息所属的类的全名
# %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss},
# 输出类似:2019-2-21 01:38:37
# %f 输出日志信息所属的类的类名
# %l 输出日志事件的发生位置,即输出日志信息的的语句处于它所在的类的第几行
# %m 输出代码中指定的信息,如log(message)中的message
# %n 输出一个回车换行符,Windows平台为"rn",Unix平台为"n"
# %p 输出优先级,即DEBUG.INFO,WARN,ERROR,FATAL.如果是调用debug()输出的,则为DEBUG,以此类推
# %r 输出自应用启动到输出该日志信息所耗费的毫秒数
# %t 输出产生该日志的线程名

6. 其他

登录业务实现代码:LoginController.javaLoginDao.javaUser.javaLoginService.javaLoginServiceImpl.javaLoginMapper.xml.xml的具体实现请下载源码。

三、数据结构

1. 登录表结构

ssm数据结构-201922523468

2. 登录表语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
drop database if exists ssm_note;
create database ssm_note;
use ssm_note;

/*==============================================================*/
/* DBMS name: MySQL 5.0 */
/* Created on: 2019/2/22 1:09:58 */
/*==============================================================*/


drop table if exists USER_LOGIN;

/*==============================================================*/
/* Table: USER_LOGIN */
/*==============================================================*/
create table USER_LOGIN
(
id int not null,
USER_NAME varchar(30) not null,
PASSWORD varchar(20) not null,
REG_TIME datetime not null default CURRENT_TIMESTAMP,
primary key (id)
);

项目预览

一、登录页:

ssm-note登录页-201922523532

二、欢迎页:

ssm-note欢迎页-2019225235329

资料推荐

概念整理

1. Spring

  创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB。Spring提供了更加轻量级和简单的编程模型。增强了简单老式Java对象(Plain Old Java Object,POJO)的功能。

为了降低Java开发的复杂性,Spring采取了以下四种关键策略:

  • 基于POJO(Plain Old Java Object)的轻量级和最小侵入性编程;
  • 通过依赖注入和面向接口实现松耦合;
  • 基于切面和管理进行声明式编程;
  • 通过切面和模板减少样板式代码。

2. Spring MVC

  Spring MVC基于模型-视图-控制器(Model-View-Controller,MVC)模式实现,能够构建像Spring框架那样灵活和松耦合的Web应用程序。Spring MVC是一个基于mvcweb框架。Spring MVCSpring框架的一个模块,Spring MVCSpring无需通过中间整合层进行整合。

3. Mybatis

  Mybatis是一款优秀的持久层框架,支持定制化SQL、存储过程以及高级映射。可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的Pojo映射成数据库中的记录。

分享

欢迎扫描下方二维码,关注weyoung公众号,一起交流学习~~

个人微信公众号

更多联系方式

平台 链接
预览项目: https://nelucifer.gitee.io/
个人微信公众号: weyoung
segmentfault: https://segmentfault.com/u/nelucifer
CSDN: https://me.csdn.net/wlx001
简书: https://www.jianshu.com/u/99211cc23788
掘金: https://juejin.im/user/59b08c575188250f4850e80e