SpringMVC学习笔记

三层架构和MVC

三层架构

表现层:也就是我们常说的web层,它负责接收客户端请求,向客户端相应结果,,通常客户端使用http请求web层。

业务层:也就是我们说的service层,负责逻辑业务处理,和我们开发项目的需求息息相关,web层依赖于业务层,但业务层不依赖于web层。

持久层:也就是我们常说的dao层,负责数据持久化。通俗的讲,持久层就是和数据库交互,对数据库表进行增删改查。

MVC模型

  • 全名Model View Controller,是模型,视图,和控制器的缩写,是一种用于设计创建web应用程序表现层的模式。是一种软件设计规范。
  • 是将业务逻辑,数据,显示分离的方式来阻止代码。
  • MVC的主要作用是降低视图和业务逻辑之间的双向耦合
  • MVC不是一种设计模式,是一种架构模式

Model(模型):通常指我们的数据模型,作用一般情况下用于封装数据。

View(视图):负责进行模型的展示,通常指我们的jsp或者html。

Controller(控制器):接收请求,委托给模型处理,,处理完毕后把返回的模型数据返回给视图,由视图负责展示。

SpringMVC

Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。

SpringMVC的特点:

  1. 轻量级,简单易学
  2. 高效,基于请求的相应的MVC框架
  3. 与Spring兼容性好,无缝结合
  4. 约定大于配置
  5. 功能强大:restful、数据验证、格式化、本地化、主题等
  6. 简单灵活

SpringMVC和Structs2的优略分析

共同点:

​ 他们都是表现层框架,都是基于MVC模型编写的。

​ 他们的底层都离不开原始的ServletAPI

​ 它们处理请求的机制都是一个核心控制器

区别:

​ SpringMVC的入口是Servlet和Structs2是Filter

​ SpringMVC基于方法设计的,而Structs是基于类,Structs2每次执行都会创建一个动作类,所有SpringMVC会稍比Structs2快些。

​ SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

​ SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。

​ pring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高

入门程序

修改web.xml,配置DispatherServlet

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
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">

<!--配置SpringMVC前端控制器-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<!--加载springmvc配置文件(XML配置文件)-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc.xml</param-value>
</init-param>
<!--容器启动时就创建前端控制器对象-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>


<!--配置全局过滤器-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

注意://* 的区别

< url-pattern > / </ url-pattern > 不会匹配到.jsp, 只针对我们编写的请求;即:.jsp 不会进入spring的 DispatcherServlet类 。< url-pattern > /* </ url-pattern > 会匹配 *.jsp,会出现返回 jsp视图 时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错

配置mvc配置文件 mvc.xml类似于spring配置文件

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
<?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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

<!--mvc注解驱动-->
<mvc:annotation-driven/>

<!--配置mvc扫描包-->
<context:component-scan base-package="com.gem.controller"/>

<!--配置静态资源处理-->
<!-- <mvc:resources mapping="/asserts/**" location="/asserts/"/>-->
<mvc:default-servlet-handler/>

<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截路径-->
<mvc:mapping path="/test/**"/>
<!--剔除拦截-->
<mvc:exclude-mapping path="/test/test2"/>
<bean class="com.gem.interceptor.MyInterceptor" id="myInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>

<!--配置文件上传解析器-->
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
<property name="maxUploadSize" value="5242880"/>
</bean>


<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--指定视图类型(JSP),可以省略-->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<!--视图前缀-->
<property name="prefix" value="/WEB-INF/pages/"/>
<!--视图后缀-->
<property name="suffix" value=".jsp"/>
</bean>

</beans>

创建Controller,打上@Controller和@RequestMapping注解

测试

@RequestMapping注解

@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

属性

  • value表示映射路径
  • method表示触发该路径的方式,指定哪种方式就只能通过该方式触发,触发方法不对,报405异常。
  • params表示请求中必须含有的参数,如果没有该参数则报400异常。

注意:可以使用XXXMapping来替代RequestMapping(method=XXX)

1
2
3
4
5
6
7
@RequestMapping(value = "/index", method = RequestMethod.GET, params = {"id"})
public String index(Long id) {
System.out.println("请求中的参数为: " + id);
// 视图解析器会作用在这个index前后自动拼接完整跳转路径
// 默认使用转发跳转
return "index";
}

可以接收基本类型,String类型和pojo类型,如果我们传入一个实体类,SpringMVC会自动帮我们封装成一个对象(参数列表必须要和实体类字段对应,不然为null)。

静态资源过滤问题

  • 方式一
1
2
<!--配置静态资源处理-->
<mvc:resources mapping="/asserts/**" location="/asserts/"/>
  • 方式二
1
<mvc:default-servlet-handler/>
  • 方式三(使用tomcat默认servlet来解决)

    web.xml中添加

1
2
3
4
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>

表单提交乱码问题

post方式提交表单会出现中文乱码问题,这时候我们想要配置springMVC自带的过滤器,可以在web.xml中配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!--配置字符集过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--配置过滤器使用UTF-8字符集-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!--强制使用该字符集过滤器设置-->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

处理日期类型参数

在需要处理的实体类字段打上@DateTimeFormat注解,pattern属性传入要格式化的字符串。

1
2
3
//参数绑定字符串和日期转换注解
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate createDate;

常用注解

RequestParam

修饰绑定的参数

value 表示参数名称,用来对应方法的形参,默认和方法的形参同名

required 表示参数是否是必须参数,默认值为true,表示该参数必须要有

defaultValue 表示如果没有传入该参数,则使用默认值。

required=false,defaultValue = “XXX”连用

1
2
3
4
5
6
@GetMapping("/index4")
public String index4(@RequestParam(value = "sname", required = false, defaultValue = "admin") String name, int age) {
System.out.println(name);
System.out.println(age);
return"success";
}

运行结果

RequestBody

修饰属性,用来获取请求体中的数据,即参数键值

required 表示是否是必须的,默认是true

注意:此注解只能通过post请求触发才能获取响应数据,不支持get请求

1
2
3
4
5
@PostMapping("/index5")
public String index5(@RequestBody(required = false) String body) {
System.out.println(body);
return "success";
}

PathVariable

表示在URL中使用占位符来指定方法形参,它是后面我们使用Restful风格URL的基础

1
2
3
4
5
@GetMapping("/index6/{id}")
public String index6(@PathVariable("id") Long id) {
System.out.println(id);
return "success";
}

运行结果

RequestHeader

获取请求头中指定key对应的value值

1
2
3
4
5
@GetMapping("/header")
public String header(@RequestHeader("User-Agent") String header) {
System.out.println(header);
return "success";
}

访问路径

localhost:8888/mvc/hello/header

运行结果

CookieValue

表示获取Cookie中指定名称的值

1
2
3
4
5
@GetMapping("/cookie")
public String cookie(@CookieValue("JSESSIONID") String cookieValue) {
System.out.println(cookieValue);
return "success";
}

ModelAttribute

该注解是SpringMVC4.3版本后新加入的,它可以用于修饰方法和参数。

出现在方法上,表示当前方法会在控制器的方法执行前执行,它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。

出现在参数上,获取指定的数据给参数赋值。当表单提交数据不是完整的实体类数据时,保证没有提交数据字段使用数据库原来对象的数据。

1
2
3
4
5
6
7
8
9
10
11
12
@ModelAttribute
public void showModel(User user) {
System.out.println("HelloMvc.testModelAttribute");
System.out.println(user);
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
}

@GetMapping("/testma")
public String testModelAttribute(@ModelAttribute("user") User user) {
System.out.println(user);
return "success";
}

model对象

多个页面中数据共享使用Model对象。

它相当于request请求作用域,如果想要联动操作session,则可以在类上面使用@SessionAttributes注解,该注解可以把放入到model中的数据,同等的放入到session中

1
2
3
4
5
6
7
8
9
10
11
//Session操作
@SessionAttributes({"message"})
public class HelloMvc {
@RequestMapping("/index10")
public ModelAndView index10(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message","Hello");
modelAndView.setViewName("success");
return modelAndView;
}
}

jsp使用el表达式提取

1
2
${requestScope.message}
${sessionScope.message}

结果

如果要在控制器的方法中获取session,则可以使用model.get(“”)来获取如果要清空session,则可以在控制器方法参数中传入SessionStatus对象,然后调用该对象的setComplete()方法即可

restful风格url

由于浏览器的form表单只支持GET与POST请求,而delete、put等方法不支持,Spring3.0添加了一个过滤器,可以将浏览器请求改为指定的请求方式,使得支持get、post、put、delete请求

使用方法:

1.在web.xml中配置该过滤器

1
2
3
4
5
6
7
8
9
<!--配置Rest请求URL方式转换过滤器-->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

2.请求方式必须使用post请求

3.按照要求提供_method请求参数,该参数的取值就是我们的请求方式

1
2
3
4
5
6
7
8
9
10
<form action="user/1" method="post">
<%--<input type="text" name="username"/>
<input type="password" name="password"/>--%>

<%--设置请求方式--%>
<input type="hidden" name="_method" value="delete">

<input type="text" name="id"/>
<input type="submit" value="提交">
</form>

4.对应Controller

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
package com.gem.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

/**
* 本类用来演示Restful风格URL
*
* 查询 /user/1 GET
* 删除 /user/1 DELETE
* 修改 /user/1 PUT
* 添加 /user POST
*/
@Controller
@RequestMapping("/user")
public class RestController {

//localhost:8888/mvc/user/1
@GetMapping("/{id}")
public String select(@PathVariable("id") Long id) {
System.out.println("执行查询操作的id:" + id);
return "success";
}

//localhost:8888/mvc/user
@PostMapping
public String add() {
System.out.println("执行添加操作");
return "success";
}

//localhost:8888/mvc/user/1
@DeleteMapping("/{id}")
public String delete(@PathVariable("id") Long id) {
System.out.println("执行删除操作的id:" + id);
return "success";
}
}

SpringMVC方法返回Json数据

1.导入jackson jar包(Spring内置转换就是基于jackson)

1
2
3
4
5
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>

2.在控制器对应方法上添加注解@ResponseBody

​ @ResponseBody放在方法上,表示该方法返回纯数据,即不是视图名称

​ @ResponseBody放在类上,则表示该类中所有的方法返回的都是纯数据

@ResponseBody + @Controller = @RestController

1
2
3
4
5
6
7
8
9
@RestController
public class JsonController {

@GetMapping("/json")
public User getData() {
User user = new User(1L, "admin", "123456");
return user;
}
}

访问http://localhost:8888/mvc/json

运行结果

SpringMVC文件上传

  • 引入maven依赖(commons-fileupload+commons-io)
1
2
3
4
5
6
<!--文件上传组件-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
  • 提供form表单(post,multipart/form-data,file表单控件)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SpringMVC文件上传</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
图片:<input type="file" name="uploadFile"/><br/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
  • Controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Controller
public class UploadController {

@PostMapping("/upload")
public String upload(MultipartFile uploadFile) throws IOException {
//定义文件名
String fileName = "";
//1.获取原始文件名
String uploadFileName = uploadFile.getOriginalFilename();
//2.截取文件扩展名
String extendName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1, uploadFileName.length());
//3.把文件加上随机数,防止文件重复
String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
fileName = uuid + "." + extendName;
//4.判断路径是否存在
File file = new File("D:/a_dmeo/img/" + fileName);
//5.使用MulitpartFile接口中方法,把上传的文件写到指定位置
uploadFile.transferTo(file);
return "success";
}
  • 配置文件上传解析器
1
2
3
4
<!--配置文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5242880"/>
</bean>

全局异常处理

  • 方式一(web.xml配置错误页面)
1
2
3
4
5
<!--web全局异常处理-->
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/pages/error.jsp</location>
</error-page>
  • 方式二
1
2
3
4
5
6
7
8
9
10
11
12
/**全局异常处理增强类*/
@ControllerAdvice
public class ExceptionAdvice {
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // 响应 状态码500
// @ExceptionHandler 参数为 要处理器的 异常类(或子类)
// 注解参数不声明指定异常类,则默认为方法列表中的异常参数类
@ExceptionHandler(ArithmeticException.class)
public String showInfo(Exception e) {
System.out.println(e.getMessage());
return "error";
}
}

拦截器

SpringMVC的拦截器类似于Servlet开发中的过滤器Filter,拦截器只会拦截访问控制器的方法,不会拦截静态资源。

步骤

  • 编写一个普通的实现类实现HandlerInterceptor接口

  • 在mvc.xml中配置拦截器

可以配置要剔除的路径。

多个拦截器的执行顺序

两个拦截器同时拦截一个请求

SSM整合

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
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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">
<modelVersion>4.0.0</modelVersion>

<groupId>com.gem</groupId>
<artifactId>ssmdemo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<name>ssmdemo Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<spring.version>5.2.9.RELEASE</spring.version>
<tomcat.version>7.0.86</tomcat.version>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>

<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>

<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>

<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>

<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>

<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>

<dependency>
<scope>compile</scope>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.7.19</version>
</dependency>
</dependencies>

<build>
<finalName>ssmdemo</finalName>

<!-- 将mapper.xml一起打包 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>


<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>

<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/ssm</path>
<port>8888</port>
<uriEncoding>UTF-8</uriEncoding>
<staticContextPath>/img</staticContextPath>
<staticContextDocbase>D:\a_demo\img</staticContextDocbase>
<contextReloadable>false</contextReloadable>
<useTestClasspath>true</useTestClasspath>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-util</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-coyote</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-dbcp</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jsp-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper-el</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-el-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-tribes</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina-ha</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-annotations-api</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-logging-juli</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-logging-log4j</artifactId>
<version>${tomcat.version}</version>
</dependency>
</dependencies>
</plugin>


<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>

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--添加配置跳过测试-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<!--添加配置跳过测试-->


</plugins>
</pluginManagement>
</build>
</project>

spring配置文件 spring.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
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">

<!--导入外部配置文件-->
<context:property-placeholder location="classpath:db.properties"/>

<context:component-scan base-package="com.gem.service"/>

<!--配置AOP注解支持-->
<aop:aspectj-autoproxy/>

<!--开启声明式事务-->
<tx:annotation-driven/>

<!--配置数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${mysql_driver}"/>
<property name="jdbcUrl" value="${mysql_url}"/>
<property name="user" value="${mysql_user}"/>
<property name="password" value="${mysql_password}"/>
</bean>

<!--配置SqlSessionFactoryBean-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--绑定数据源-->
<property name="dataSource" ref="dataSource"/>
<!--配置mybatis-->
<property name="configuration">
<bean class="org.apache.ibatis.session.Configuration">
<property name="lazyLoadingEnabled" value="true"/>
<property name="aggressiveLazyLoading" value="false"/>
<property name="cacheEnabled" value="true"/>
</bean>
</property>
<property name="typeAliasesPackage" value="com.gem.entity"/>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor"/>
</array>
</property>
<property name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
</bean>

<!--配置Mapper扫描器-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.gem.mapper"/>
</bean>

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

mvc配置文件 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
<?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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">

<!--mvc注解驱动-->
<mvc:annotation-driven/>

<!--配置mvc扫描包-->
<context:component-scan base-package="com.gem.controller"/>

<!--配置默认跳转-->
<mvc:view-controller path="/" view-name="user/login"/>

<!--配置静态资源处理-->
<mvc:resources mapping="/asserts/**" location="/asserts/"/>

<!--配置文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5242880"/>
</bean>

<!--配置拦截器-->
<!--<mvc:interceptors>
<mvc:interceptor>
&lt;!&ndash;拦截路径&ndash;&gt;
<mvc:mapping path="/**"/>
&lt;!&ndash;剔除拦截&ndash;&gt;
<mvc:exclude-mapping path=""/>
<bean class="com.gem.interceptor.AdminInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>-->

<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--指定视图类型(JSP),可以省略-->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<!--视图前缀-->
<property name="prefix" value="/WEB-INF/pages/"/>
<!--视图后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>

log4j配置文件log4j.properties

1
2
3
4
5
6
7
8
# \u5168\u5C40\u65E5\u5FD7\u914D\u7F6E
log4j.rootLogger=WARN, stdout
# \u63A7\u5236\u53F0\u8F93\u51FA
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
# MyBatis \u65E5\u5FD7\u914D\u7F6E
log4j.logger.com.gem.mapper=DEBUG

mybatis缓存配置文件ehcache.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<ehcache>
<!--二级缓存存储路径-->
<diskStore path="D:\java\ehcache"/>

<!--
maxElementsInMemory 内存中存储缓存对象的最大值
maxElementsOnDisk 磁盘中存储缓存对象的最大值
eternal 缓存对象是否是永久的
overflowToDisk 缓存对象是否允许被写到磁盘中
timeToIdleSeconds 缓存对象最大空闲时间,超时将被销毁
timeToLiveSeconds 缓存对象最长存活时间,超时将被销毁
-->
<defaultCache
maxElementsInMemory="1000"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="600"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>

数据库配置文件db.properties

1
2
3
4
mysql_driver=com.p6spy.engine.spy.P6SpyDriver
mysql_url=jdbc:p6spy:mysql:///ssm?serverTimezone=GMT%2B8
mysql_user=root
mysql_password=root

p6spy配置文件spy.properties

1
2
3
4
mysql_driver=com.p6spy.engine.spy.P6SpyDriver
mysql_url=jdbc:p6spy:mysql:///ssm?serverTimezone=GMT%2B8
mysql_user=root
mysql_password=root

web.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
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">

<!--web全局异常处理-->
<!--<error-page>
<error-code>404</error-code>
<location>/WEB-INF/pages/error.jsp</location>
</error-page>

<error-page>
<error-code>500</error-code>
<location>/WEB-INF/pages/error.jsp</location>
</error-page>-->

<!--配置session过期时间(分钟)-->
<session-config>
<session-timeout>30</session-timeout>
</session-config>

<!--配置spring容器监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--指定spring配置文件路径-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>

<!--配置SpringMVC前端控制器-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<!--加载springmvc配置文件(XML配置文件)-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc.xml</param-value>
</init-param>
<!--容器启动时就创建前端控制器对象-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<!--配置字符集过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--配置过滤器使用UTF-8字符集-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!--强制使用该字符集过滤器设置-->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!--配置Rest请求URL方式转换过滤器-->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

评论