目录
<3>数据名和参数名不同:@RequestParm("数据名")
<1>在@RequestMapping中有一个属性,method = RequestMethod.请求方式
<3>@PathVariable和@RequestBody和@RequestParm三个注解的使用区别
3.简化开发@RestController和@PostMapping。。。等等
<2>在异常处理方法上添加 @ExceptionHandler的注解
<1>声明拦截器的bean并且实现HanderInterceptor接口的三个方法添加@Component
<2>定义配置类,继承WebMvcConfigurationSupport,实现addInterceptor方法
一,springMVC简介
1.初始SpringMvc
2.入门案例
<1>
<2>
<3>
<4>
<!-- 、第一步导入servlet和springmvc的坐标-->
<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.12.RELEASE</version>
</dependency>
<5>
package com.wrx.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
//第二步:定义controller
@Controller
public class UserController {
@RequestMapping("/save")//访问路径
@ResponseBody//返回值类型:返回的整体数据进行响应
public String save(){
System.out.println("save.... be succeeding");
return "Holle,springMvc";
}
}
<6>
package com.wrx.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//3.创建springMvc的配置文件,加载controller对应的bean
@Configuration
@ComponentScan("com.wrx")
public class SpringMvcConfig {
}
<7>
package com.wrx.config;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
//4.定义一个servlet容器启动的配置类,在里面加载spring配置
public class ServletContainerInitConfig 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[]{"/"};
}
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
<8>tomcat7的插件
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8081</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
<9>运行
新增知识点:
入门案例做完之后就无需再做,这些都是固定的,只有controller控制器类是需要多次进行的工作。
工作流程:
3.bean加载配置
现在有一个小问题,就是spring和springmvc在加载bean时候如何加载各自的bean而不出现加载错误的bean:例如spring加载到springmvc的bean
解决方案1:
我们在各自的配置类里在注解处精确到各自的bean所在的包
解决方案2:
可以写大范围的扫描范围,但是排除掉不需要扫描的
简化开发格式:
public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringMvcConfig.class};//加载SpringMvc配置
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{springConfig.class};//加载Spring配置
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};//SpringMvc拦截所有请求
}
}
二.请求与响应
1.设置请求映射路径
当我们的业务层出现了相同的路径会报错,这种的处理方式。
这种情况我们可以在类名上面加上一个访问前缀。
@ResquestMapping的注解不仅可以加在方法上,还可以加载类上面,在类上面就是放访问前缀。我们用不同的访问前缀就可以规避相同的访问路径问题。
2.请求(get和post)
<1>get和post请求接收普通信息参数
如何接收post和get请求发过来的普通数据信息?
我们只需要在接受数据的方法体加上同名参数即可。
请求:
服务端:
运行结果:
<2>解决post请求的中文乱码
在servlet容器启动的配置类里重写一个字符编码过滤方法
//字符编码过滤器
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter Filter = new CharacterEncodingFilter();
Filter.setEncoding("utf-8");
return new Filter[]{Filter};
}
<3>数据名和参数名不同:@RequestParm("数据名")
我们看到数据名和参数名不相同,这是没办法传递数据的。这时候我们添加一个新的注解
@RequestParm("数据名")
在注解里添加数据名就可以了。
<4>接收pojo的对象
只需要数据名和实体类的数据名相同即可,方法体的参数为实体类对象
<5>pojo中含由引用类型
在发送请求时,数据名稍加处理即可:引用名.数据名(这里数据名要与引用类型的pojo的数据名形同)
address为引用类型
运行结果:
<6>数组参数
传递数据的数据名与数组的对象名一致就可以了。
<7>集合对象
第一:数据名与对象名相同
第二:在方法的参数前加上@RequestParm注解
运行结果:
<8>json数据的接收
(1)加坐标
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
(2)
(3)加@EnableWebMvc注解开启自动转换json数据的支持
(4) 加@RequestBody注解,设置接受json数据
******json数组:集合存普通类型 json格式
运行结果:
*******json对象:pojo实体对象存储 json数据
*******json对象:list<>保存多个对象 json数据
<9>日期型数据传递
(1)springmvc的日期默认格式
结果:
如何修改不一样的日期格式呢??
(2)@DateTimeFoermat(pattern = "yyyy-MM-dd")和@DateTimeFoermat(pattern = "yyyy/MM/dd HH:mm:ss")
2022-08-18 springmvc默认
2022/08/18 @DateTimeFoermat(pattern = "yyyy-MM-dd")
2022/08/18 08:22:22 @DateTimeFoermat(pattern = "yyyy/MM/dd HH:mm:ss")
注意传数据时候数据名和参数名一致。
3.响应@ResponseBody
要想响应json数据,需要使用一个注解@ResponseBody
(1)对象转json
只要在方法体上加上@ResponseBody注解,创建实体对象并且使用set方法注入数据即可,然后返回,即可响应json(依赖json坐标完成)
(2)集合对象转json
方法与(1)基本相同,只要响应就会转json
三.Rest风格
1.简介
2.入门案例
第一:
第二:
rest风格,主要是请求方式和路径的组合。
<1>在@RequestMapping中有一个属性,method = RequestMethod.请求方式
我们通过这个属性修改请求方式。
// 1.保存/新增使用POST请求
@RequestMapping(value = "/users",method = RequestMethod.POST)
@ResponseBody//返回值类型:返回的整体数据进行响应
public String save(){
System.out.println("save保存.... be succeeding");
return "Hello,springMvc保存功能";
}
// 2.查询 使用GET请求
@RequestMapping(value = "/users",method = RequestMethod.GET)
@ResponseBody//返回值类型:返回的整体数据进行响应
public String Select(){
System.out.println("select查询全部.... be succeeding");
return "select查询全部功能";
}
// 3.修改 使用PUT请求
@RequestMapping(value = "/users",method = RequestMethod.PUT)
@ResponseBody//返回值类型:返回的整体数据进行响应
public String Update(){
System.out.println("修改功能.... be succeeding");
return "访问修改功能.....";
}
<2>@PathVariable和路径上的{参数名}
当传递单个参数时我们在方法体的参数前加上@PathVariable,并且在路径上加上{参数名},这里的参数名和方法体的参数名相同。
// 4.删除单个用户信息 使用DELETE请求,使用@PathVariable注解,访问路径新增{参数名}
@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)
@ResponseBody//返回值类型:返回的整体数据进行响应
public String Delete(@PathVariable Integer id){
System.out.println("删除功能.... be succeeding");
return "访问删除功能.....";
}
// 5.指定单个用户查询 GET请求 使用@PathVariable注解,访问路径新增{参数名}
@RequestMapping(value = "/users/{id}",method = RequestMethod.GET)
@ResponseBody//返回值类型:返回的整体数据进行响应
public String SelectByID(@PathVariable Integer id){
System.out.println("selectById.... be succeeding id:"+id);
return "selectById功能id为:"+id;
}
<3>@PathVariable和@RequestBody和@RequestParm三个注解的使用区别
3.简化开发@RestController和@PostMapping。。。等等
1.
2.
3.
4.
新的知识点:
4.过滤器类,防止SpringMvc拦截web端资源
package com.wrx.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
// 当访问/pages/**时,走/pages/
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");;
registry.addResourceHandler("/css/**").addResourceLocations("/css/");;
registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");;
}
}
四.SSM整合
1.整合配置
2.功能模块开发
3.接口测试
4.表现层封装
<1>定义Result数据实体类
在Controller层定义一个Result的实体类,用于表现层封装数据
<2>定义状态码
静态属性和全局变量
<3>把表现层的方法的返回值都设置为Result类型
5.异常处理(AOP的思想)
我们处理异常的方式是把数据层,业务层的异常全部抛到表现层,由表现层统一处理。
<1>添加@RestControllerAdvice的注解
创建异常处理类,并且添加 @RestControllerAdvice的注解,声明这个类是用来做异常处理的
<2>在异常处理方法上添加 @ExceptionHandler的注解
拦截所有异常
<3>返回异常数据
6.前端与后端联合
五.拦截器
1.制作拦截器
<1>声明拦截器的bean并且实现HanderInterceptor接口的三个方法添加@Component
<2>定义配置类,继承WebMvcConfigurationSupport,实现addInterceptor方法
加好@Configuration,方便加载
<3>添加拦截器访问路径
1.
2.
3. 加载拦截器配置
4.效果
2.拦截器参数
1.对于request。我们可以通过它的方法getHandler()来获取请求的数据
2.对于reponse同理
3.对于handler,我们拦截的那个方法,handler就是这个方法的对象,可以对被拦截的对象进行操作,使用它的方法。
spring有异常处理机制,不用使用这个。
3.拦截器链
如何配置多个拦截器??例如两个
<1>我们做两个拦截器的bean,1和2,两个内容基本类似
<2>两个bean都注入
先配置那个路径。先执行那个过滤器
<3>运行结果