SpringMVC
简介
-
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,跟Spring,Mybatis框架并称为SSM。是由Spring官方提供的基于MVC设计理念的web框架也是基于Servlet封装的用于实现MVC控制的框架,实现前端和服务端的交互
-
与Servlet技术功能相同,均是基于web层开发,但是比servlet更简洁简便
-
web流程:前端页面使用异步提交的方式发送请求到后端服务器,后端服务器采用表现层、业务层、数据层三层架构形式进行开发,页面发送的请求由表现层接收后传给业务层,业务层访问数据层后处理后返回给表现层,表现层将数据转换成 json 格式发送给前端页面
入门
例子
-
导包
<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>
-
配置类
继承并实现
AbstractDispatcherServletInitializer
类即可@Configuration @ComponentScan("SpringMVC") public class SpringMvcConfig{ }
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { //让tomcat容器加载springMVC配置 protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringMvcConfig.class); return ctx; } //当请求发过来之后哪些交由SpringMVC处理,"/"表示所有请求都是 protected String[] getServletMappings() { return new String[]{"/"}; } protected WebApplicationContext createRootApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringConfig.class);//spring容器,只使用mvc的话可以不加载 return ctx; } }
-
创建SpringMVC控制类
@Controller
:在SpringMVC中使用此注解开发表现层的Bean@RequestMapping()
:定义访问路径,在类上使用用于定义前缀@ResponseBody
:设置返回值类型
//定义bean @Controller //设置请求路径前缀,可以不设置 @RequestMapping("/C1") public class C1 { //设置访问路径 @RequestMapping("/save") //设置返回值类型 @ResponseBody public String save(){ System.out.println("c1 save"); return "{'info':'c1 save'}"; } }
-
启动程序(启动先需先配置)
<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>
工作流程
启动服务器初始化过程
- 服务器启动,执行ServletContainersInitConfig类,初始化web容器
- 执行createServletApplicationContext方法,创建了WebApplicationContext对象
- 加载SpringMvcConfig
- 执行@ComponentScan加载对应的bean
- 加载UserController,每个@RequestMappingl的名称对应一个具体的方法
- 执行getServletMappings方法,定义所有的请求都通过SpringMVC
其他操作
bean加载控制
-
SpringMVC相关bean(表现层bean)
-
Spring控制的bean
- 业务bean(Service)
- 功能bean(DataSource等)
-
SpringMVC相关bean加载控制
- SpringMVC加载的bean对应的包均在com.itheima.controller包内
-
Spring相关bean加载控制
- 方式一:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包内的bean
- 方式二:Spring加载的bean设定扫描范围为精准范围,例如servicet包、dao包等
-
方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中
过滤
@ComponentScan(value = "包名",
excludeFilters = @ComponentScan.Filter(
//过滤规则
)
)
-
按注解过滤
@ComponentScan(value = "com.controller", excludeFilters = @ComponentScan.Filter( type = FilterType.ANNOTATION, classes = Controller.class //过滤掉Controller注解 ) )
PostMan工具
- Postman:是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件
- 作用:常用于进行接口测试
- 特征:简单、实用、美观、大方
中文乱码处理
处理方式:设置过滤器
ServletContainersInitConfig.java中新增过滤器
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
传参和响应
传参
传参方式
-
GET传参
http://localhost/user/get?res=1&name=wg
@RequestMapping("/get") @ResponseBody public String get(int res,String name){ //可以获取多个参数 System.out.println("/user/get -> "+res); System.out.println("/user/get -> "+name); return "{'module':'common param'}"; }
>>/user/get -> 1 >>/user/get -> wg
-
POST传参
方法和GET一样
-
指定提交方式
在
@RequestMapping()
注解中修改method
参数@RequestMapping(value = "/post",method = RequestMethod.POST)
- 用处:同一个路径可以在不同的函数中指定不同的提交方式以作区分
-
从路径中取值
-
在
@RequestMapping()
注解中value的后面使用{}
来圈定元素 -
在函数形参中使用
@PathVariable
注解来获取圈定的元素
@RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE) @ResponseBody public void id(@PathVariable Integer id){ System.out.println(id); }
-
参数传递
-
普通参数
默认直接传入参数名相同的形参,设置时使用
@RequestParam()
注解public String get(@RequestParam("res") String test){...}
-
传POJO类型对象
当传入的参数名和实体类中的元素名一样时,会自动生成一个实体类对象
http://localhost/user/get?name=wg&id=1
@RequestMapping("/get") @ResponseBody public void get(User user){ System.out.println("/user/get -> "+user); }
/user/get -> User{name='null', id=0}
-
嵌套P0]0类型参数
当实体类中有别的实体类时,传入参数使用
类名.元素名
http://localhost/user/get?name=wg&id=1&address.country=China
-
数组类型参数
http://localhost/user/test?res=1&res=2&res=3
@RequestMapping("/test") @ResponseBody public void test(String[] res){ System.out.println("/user/test -> "+ Arrays.toString(res)); }
>>/user/test -> [1, 2, 3]
-
集合类型参数
问题:传类时springMVC会自动使用构造函数,但是集合接口没有构造函数
解决:使用
@RequestParam
注解在形参前http://localhost/user/test?res=1&res=2&res=3
@RequestMapping("/test") @ResponseBody public void test(@RequestParam List<String> res){ System.out.println("/user/test -> "+ res); }
>>/user/test -> [1, 2, 3]
-
传JSON数据
- 需要导入依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.1</version> </dependency>
-
开启转换JSON的功能
在SpringMvc配置中使用
@EnableWebMvc
注解@Configuration @ComponentScan(value = "com.controller") @EnableWebMvc public class SpringMvcConfig {}
-
接收函数的形参使用
@RequestBody
注解@RequestMapping("/json") @ResponseBody public void json(@RequestBody List<String> res){ System.out.println("/user/test -> "+ res); }
-
如何用Postman网站传JSON数据
-
>>/user/test -> [aa, bb, cc]
-
JSON传类
响应
-
响应页面 / 跳转页面
直接返回页面文件名称的字符串即可
@RequestMapping("/jumpPage") public String jumpPage(){ return "page.jsp"; }
-
响应字符串
使用
@ResponseBody
注解,然后直接返回字符串@RequestMapping("/jumpPage2") @ResponseBody public String text(){ return "text"; }
-
响应POJO对象
使用
@ResponseBody
注解,直接返回对象将对象转成json这件事是jackson包做的,所以需要导入
jackson-databind
依赖响应POJO集合对象时也是直接返回
@RequestMapping("/jsonPOJO") @ResponseBody public User jsonPOJO(){ return new User("Wg",1); }
-
@ResponseBody
- 将controller的方法返回的对象通过适当的转换器转换成指定格式后写入response对象的body区
- 即用来返回JSON数据或XML数据
- 可以直接使用在类上,代表该类所有方法都使用此注解
- 将controller的方法返回的对象通过适当的转换器转换成指定格式后写入response对象的body区
REST风格
介绍
-
REST:表现形式状态转换
-
例子
-
传统风格资源描述形式:
http://localhost/user/getById?id=1 http://localhost/user/saveUser
-
REST风格描述形式
http://localhost/user/1 http://localhost/user
-
-
优点:
- 书写简化
- 隐藏很多细节,更加安全,无法通过地址得知对资源是什么操作
-
使用示例
简化注解
- 类注解
@RestController
:相当于@Controller
+@ResponseBody
- 方法注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping