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 { protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringMvcConfig.class); return ctx; }
protected String[] getServletMappings() { return new String[]{"/"}; }
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'}"; } }
|