【概述】
SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
【优点】
1、导入SpringMVC坐标与Servlet坐标
<dependencies>
<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>
</dependencies>
2、初始化SpringMVC环境(同Spring环境)
@Configuration
public class SpringMvcConfig {
}
3、创建SpringMVC控制器,设定请求方法的返回值为字符串类型,并返回自定义json数据
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save...");
return "{'info':'SpringMVC'}";
}
}
4、设定SpringMVC加载对应的bean
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
5、初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC请求拦截的路径
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//加载SpringMVC对应的容器对象
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
//设置SpringMVC所管理的请求
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
//加载Spring对应的容器对象
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
例:
@Controller
public class UserController {
}
例:
@RequestMapping("/save")
public void save(){
System.out.println("user save ...");
}
【相关属性】
value(默认):请求访问路径
例:
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save...");
return "{'info':'SpringMVC'}";
}
}
【概述】
SpringMVC提供的快速初始化Web3.0容器的抽象类
1、createServletApplicationContext()方法
【作用】
创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围
例:
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
2、getServletMappings()方法
【作用】
设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理
例:
protected String[] getServletMappings() {
return new String[]{"/"};
}
3、createRootApplicationContext()方法
【作用】
如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()
例:
protected WebApplicationContext createRootApplicationContext() {
return null;
}
Spring相关bean加载控制
例:
@Configuration
@ComponentScan(value = "com.itheima",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
)
public class SpringConfig {
}
【属性】
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
@Override
protected WebApplicationContext createRootApplicationContext() {
AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return ctx;
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
简化:
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
}
【概述】
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件
【作用】
常用于进行接口测试
例:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save...");
return "{'module':'user save'}";
}
@RequestMapping("/delete")
@ResponseBody
public String delete(){
System.out.println("user delete...");
return "{'module':'user delete'}";
}
}
普通参数:form表单post请求传参,表单参数名与形参变量名相同,定义形参即可接收参数
【Post请求中文乱码处理】
为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器
// 配字符编码过滤器
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("utf-8");
return new Filter[]{filter};
}
【注意】
多个过滤器写法:{filter1,filter2,...}
Get和Post请求的接收参数方法一致
//普通参数
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name, int age) {
System.out.println("普通参数传递 name==>" + name);
System.out.println("普通参数传递 age==>" + age);
return "{'module':'common param'}";
}
【种类】
//普通参数不同名
@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(@RequestParam("name") String username, int age) {
System.out.println("普通参数传递 name==>" + username);
System.out.println("普通参数传递 age==>" + age);
return "{'module':'common param different name'}";
}
【@RequestParam】
请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数
//pojo参数
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user) {
System.out.println("pojo参数传递 user==>" + user);
return "{'module':'pojo param'}";
}
请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数
//pojo嵌套参数
@RequestMapping("/pojoContainPojoParam")
@ResponseBody
public String pojoContainPojoParam(User user) {
System.out.println("pojo嵌套pojo参数传递 user==>" + user);
return "{'module':'pojo contain pojo param'}";
}
请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接收参数
//数组参数
@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'}";
}
1、添加json数据转换坐标
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
2、开启自动转换json数据的支持
【@EnableWebMvc】
例:
@EnableWebMvc
public class SpringMvcConfig {
}
3、设置发送json数据(请求body中添加json数据)
4、设置接收json数据
//集合参数:Json格式
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes) {
System.out.println("list common(json)参数传递 likes ==> " + likes);
return "{'module':'list common for json param'}";
}
【@RequestBody】
POJO参数:json数据与形参对象属性名相同,定义POJO类型形参即可接收参数
1、2、同【json数组】
3、设置发送json数据(请求body中添加json数据)
4、设置接收json数据
//pojo参数:Json格式
@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user) {
System.out.println("pojo(json)参数传递 user==>" + user);
return "{'module':'pojo for json param'}";
}
POJO集合参数:json数组数据与集合泛型属性名相同,定义List类型形参即可接收参数
1、2、同【json数组】
3、设置发送json数据(请求body中添加json数据)
4、设置接收json数据
//集合pojo参数:Json格式
@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'}";
}
【注意】
@RequestBody与@RequestParam区别
日期类型数据基于系统不同格式也不尽相同
接收形参时,根据不同的日期格式设置不同的接收方式
//日期参数
@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("参数传递 date(yyyy-MM-dd) ==> " + date1);
System.out.println("参数传递 date(yyyy/MM/dd HH:mm:ss) ==> " + date2);
return "{'module':'data param'}";
}
【@DateTimeFormat】
例:
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date){
System.out.println("参数传递 date ==> "+date);
return "{'module':'data param'}";
}
【类型转换器:Converter接口】
public interface Converter<S, T> {
@Nullable
T convert(S var1);
}
【功能】
【注意】
@EnableWebMvc功能之一:根据类型匹配对应的类型转换器
使用类型转换器时要开启@EnablWebMvc
【@ResponseBody】
例:
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("save...");
return "{'info':'springmvc'}";
}
【类型转换器:HttpMessageConverter接口】
public interface HttpMessageConverter<T> {
boolean canRead(Class<?> clazz, @Nullable MediaType mediaType);
boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType);
List<MediaType> getSupportedMediaTypes();
T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException;
void write(T t, @Nullable MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException;
}
http://localhost:8080/toJumpPage
//响应页面/跳转页面
@RequestMapping("/toJumpPage")
public String toJumpPage(){
System.out.println("跳转页面");
return "page.jsp";
}
//响应文本数据
@RequestMapping("/toText")
@ResponseBody
public String toText(){
System.out.println("返回纯文本数据");
return "response text";
}
//响应POJO对象
@RequestMapping("/toJsonPOJO")
@ResponseBody
public User toJsonPOJO(){
System.out.println("返回json对象数据");
User user=new User();
user.setName("zhangsan");
user.setAge(15);
return user;
}
//响应POJO对象
@RequestMapping("/toJsonList")
@ResponseBody
public List<User> toJsonList(){
System.out.println("返回json对象数据");
User user1=new User();
user1.setName("zhangsan");
user1.setAge(15);
User user2=new User();
user2.setName("lisi");
user2.setAge(12);
List<User> userList=new ArrayList<>();
userList.add(user1);
userList.add(user2);
return userList;
}
因篇幅问题不能全部显示,请点此查看更多更全内容