SpringMVC入门案例

基于java实现MVC模型的轻量web框架,替换servlet技术完成表现层开发。

导入坐标

1
2
3
4
5
6
7
8
9
10
11
12
13
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>
80
</port>
</configuration>
</plugin>
</plugins>
</build>

定义Controller bean

1
2
3
4
5
6
7
8
9
10
11
@Controller
public class UserController {
/*设置请求路径*/
@RequestMapping("/save")
/*定义返回体*/
@ResponseBody
public String save(){
System.out.println("user save...");
return "{'module':'springmvc'}";
}
}

创建SpringMvcConfig类

1
2
3
4
@Configuration
@ComponentScan("cola")
public class SpringMvcConfig {
}

定义Servlet容器启动配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Configuration
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
/*加载SpringMVC容器配置*/
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}

/*设置哪些请求归SpringMVC处理*/
protected String[] getServletMappings() {
return new String[]{"/"};
}

/*加载Spring容器配置*/
protected WebApplicationContext createRootApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return ctx;
}
}

在SpringConfig中排除Controller类

1
2
3
4
@Configuration
@ComponentScan(value = "cola", excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class))
public class SpringConfig {
}

Servlet容器启动配置类简化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Configuration
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}

protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}

protected String[] getServletMappings() {
return new String[]{"/"};
}
}

请求响应

普通参数

get和post不区分,直接添加形参都可以接受。

1
2
3
4
5
6
7
8
9
10
11
@Controller
public class UserController {
/*设置请求路径*/
@RequestMapping("/save")
/*定义返回体*/
@ResponseBody
public String save(String name, int age) {
System.out.println("user save..." + name + age);
return "{'module':'springmvc'}";
}
}

中文乱码

在ServletContainersInitConfig中加入Filter。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Configuration
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}

protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}

protected String[] getServletMappings() {
return new String[]{"/"};
}

/*乱码处理*/
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("utf-8");
return new Filter[]{filter};
}
}

pojo参数

直接接受对象形参,框架会自动将请求中的参数填入对象中。

1
2
3
4
5
6
7
8
9
10
11
@Controller
public class UserController {
/*设置请求路径*/
@RequestMapping("/save")
/*定义返回体*/
@ResponseBody
public String save(User user) {
System.out.println("user save..." + user);
return "{'module':'springmvc'}";
}
}

如果对象里嵌套有对象参数,例如user对象中有address对象参数,address对象中有name参数,在发送请求时,加入address.name参数即可。

数组参数

改变形参,发送请求时使用相同key名。

1
2
3
4
5
6
7
8
9
10
11
@Controller
public class UserController {
/*设置请求路径*/
@RequestMapping("/save")
/*定义返回体*/
@ResponseBody
public String save(String[] likes) {
System.out.println("user save..." + Arrays.toString(likes));
return "{'module':'springmvc'}";
}
}

集合参数

同上,但需要添加注解@RequestParam,因为框架默认认为形参是需要一个pojo对象,而例如List不能创建对象。

1
2
3
4
5
6
7
8
9
10
11
@Controller
public class UserController {
/*设置请求路径*/
@RequestMapping("/save")
/*定义返回体*/
@ResponseBody
public String save(@RequestParam List<String> likes) {
System.out.println("user save..." + likes);
return "{'module':'springmvc'}";
}
}

传递json数据

导包

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

添加配置

在SpringMVC Config中加入注解@EnableWebMvc

1
2
3
4
5
@Configuration
@ComponentScan("cola")
@EnableWebMvc
public class SpringMvcConfig {
}

在形参中加入注解@RequestBody

1
2
3
4
5
6
7
8
9
10
11
@Controller
public class UserController {
/*设置请求路径*/
@RequestMapping("/save")
/*定义返回体*/
@ResponseBody
public String save(@RequestBody List<String> likes) {
System.out.println("user save..." + likes);
return "{'module':'springmvc'}";
}
}