SpringMVC简介
SpringMVC概述
SpringMvC是一种基于Java实现MVC模型的轻量级web框架
SpringMVC技术与Servlet技术功能等同,用于表现层功能开发
SpringMVC入门
1、导入坐标
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version>
</dependency>
<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>80</port><path>/</path></configuration></plugin></plugins>
</build>
2、创建SpringMVC控制器类
@Controller
public class UserController {@RequestMapping("/save")@ResponseBodypublic String save() {return "{'info': 'yixuan'}";}
}
3、初始化SpringMVC环境
@Configuration
@ComponentScan("cn.wmhwiki")
public class SpringMvcConfig {
}
4、初始化Servlet容器,加载SpringMVC环境,并设置请求
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() {return null;}
}
5、配置Tomcat环境
6、启动运行项目
7、浏览器访问
浏览器输入http://localhost/save
进行访问,可以看得如下内容
Spring相关bean加载控制
设置spring配置类加载bean时的过滤规则,当前要求排除掉表现层对应的bean
方法一、排除包
@Configuration
// excludeFilters属性:设置扫描加载bean时,排除的过滤规则
// type属性:设置排除规则,当前使用按照bean定义时的注解类型进行排除
// classes属性:设置排除的具体注解类,当前设置排除@Controller定义的bean
@ComponentScan(value="com.itheima",excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)
)
public class SpringConfig {
}
方法二、精准范围
@Configuration
@ComponentScan({"com.itheima.service", "com.itheima.dao"})
public class SpringConfig {
}
方式三、不区分
ServletContainersInitConfig加载Spring配置
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;}
}
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[]{"/"};}
}
请求与响应
设置请求映射路径
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/save")@ResponseBodypublic String save(){System.out.println("user save ...");return "{'module':'user save'}";}@RequestMapping("/delete")@ResponseBodypublic String save(){System.out.println("user delete ...");return "{'module':'user delete'}";}
}@Controller
@RequestMapping("/book")
public class BookController {@RequestMapping("/save")@ResponseBodypublic String save(){System.out.println("book save ...");return "{'module':'book save'}";}
}
- 当类上和方法上都添加了
@RequestMapping
注解,前端发送请求的时候,要和两个注解的value值相加匹配才能访问到。 - @RequestMapping注解value属性前面加不加
/
都可以
参数传递
http://localhost/commonParam?name=itcast&age=15
@Controller
public class UserController {@RequestMapping("/commonParam")@ResponseBodypublic String commonParam(String name,int age){System.out.println("普通参数传递 name ==> " + name);System.out.println("普通参数传递 age ==> " + age);return "{'module':'commonParam'}";}
}
使用x-www-form-urlencoded
发送post请求
中文乱码
GET请求中文乱码
Tomcat8.5以后的版本已经处理了中文乱码的问题,但是IDEA中的Tomcat插件目前只到Tomcat7,所以需要修改pom.xml来解决GET请求中文乱码问题
<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>80</port><!--tomcat端口号--><path>/</path> <!--虚拟目录--><uriEncoding>UTF-8</uriEncoding><!--访问路径编解码字符集--></configuration></plugin></plugins>
</build>
POST请求中文乱码
CharacterEncodingFilter是在spring-web包中,所以用之前需要导入对应的jar包。
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {protected Class<?>[] getRootConfigClasses() {return new Class[0];}protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}protected String[] getServletMappings() {return new String[]{"/"};}//乱码处理@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};}
}
请求参数
普通参数
请求参数名与形参不同
@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(@RequestPaam("name") String userName , int age){System.out.println("普通参数传递 userName ==> " + userName);System.out.println("普通参数传递 age ==> " + age);return "{'module':'common param different name'}";
}
POJO数据类型
POJO参数:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数
请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){System.out.println("pojo参数传递 user ==> " + user);return "{'module':'pojo param'}";
}
嵌套POJO参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数
数组类型
同名请求参数可以直接映射到对应名称的形参数组对象中
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){System.out.println("数组参数传递 likes ==> " + Arrays.toString(likes));return "{'module':'array param'}";
}
集合类型
同名请求参数可以使用@RequestParam
注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){System.out.println("集合参数传递 likes ==> " + likes);return "{'module':'list param'}";
}
SpringMVC将List看做是一个POJO对象来处理,将其创建一个对象并准备把前端的数据封装到对象中,但是List是一个接口无法创建对象,所以报错。
JSON传参
JSON数组
1、pom.xml添加依赖
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version>
</dependency>
2、发送JSON数据
["1", "2", "3"]
3、开启SpringMVC注解支持
在SpringMVC的配置类中开启SpringMVC的注解支持,这里面就包含了将JSON转换成对象的功能。
@Configuration
@ComponentScan("com.itheima.controller")
@EnableWebMvc
public class SpringMvcConfig {
}
4、参数前添加@RequestBody
使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){System.out.println("list common(json)参数传递 list ==> " + likes);return "{'module':'list common for json param'}";
}
JSON对象
{"name":"itcast","age":15
}
@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){System.out.println("pojo(json)参数传递 user ==> " + user);return "{'module':'pojo for json param'}";
}
JSON对象数组
[{"name":"itcast","age":15},{"name":"itheima","age":12}
]
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){System.out.println("list pojo(json)参数传递 list ==> " + list);return "{'module':'list pojo for json param'}";
}
日期类型
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,@DateTimeFormat(pattern="yyyy-MM-dd") Date date1,@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2)System.out.println("参数传递 date ==> " + date);System.out.println("参数传递 date1(yyyy-MM-dd) ==> " + date1);System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> " + date2);return "{'module':'data param'}";
}
响应
响应JSON数据
@Controller
public class UserController {@RequestMapping("/toJsonPOJO")@ResponseBodypublic User toJsonPOJO(){System.out.println("返回json对象数据");return new User("itcast", 15);}
}
需要依赖
@ResponseBody
注解和@EnableWebMvc
注解
REST风格
REST简介
传统方式一般是一个请求url对应一种操作,这样做不仅麻烦,也不安全,因为会程序的人读取了你的请求url地址,就大概知道该url实现的是一个什么样的操作。
REST的优点有:
- 隐藏资源的访问行为,无法通过地址得知对资源是何种操作
- 书写简化
按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
http://localhost/users
查询全部用户信息 GET(查询)http://localhost/users/1
查询指定用户信息 GET(查询)http://localhost/users
添加用户信息 POST(新增/保存)http://localhost/users
修改用户信息 PUT(修改/更新)http://localhost/users/1
删除用户信息 DELETE(删除)
根据REST风格对资源进行访问称为RESTful
Rest快速开发
@RestController //@Controller + ReponseBody
@RequestMapping("/books")
public class BookController {//@RequestMapping(method = RequestMethod.POST)@PostMappingpublic String save(@RequestBody Book book){System.out.println("book save..." + book);return "{'module':'book save'}";}//@RequestMapping(value = "/{id}",method = RequestMethod.DELETE)@DeleteMapping("/{id}")public String delete(@PathVariable Integer id){System.out.println("book delete..." + id);return "{'module':'book delete'}";}//@RequestMapping(method = RequestMethod.PUT)@PutMappingpublic String update(@RequestBody Book book){System.out.println("book update..." + book);return "{'module':'book update'}";}//@RequestMapping(value = "/{id}",method = RequestMethod.GET)@GetMapping("/{id}")public String getById(@PathVariable Integer id){System.out.println("book getById..." + id);return "{'module':'book getById'}";}//@RequestMapping(method = RequestMethod.GET)@GetMappingpublic String getAll(){System.out.println("book getAll...");return "{'module':'book getAll'}";}}