文章目录
HttpMessageConverter
1、报文信息转换器,将请求报文
转换为Java对象
,或将Java对象
转换为响应报文
2、HttpMessageConverter提供了两个注解 @RequestBody
,@ResponseBody
3、HttpMessageConverter提供了两个类型RequestEntity
, ResponseEntity
1、@RequestBody
是控制器方法设置一个形参,使用@RequestBody进行标识
@RequestMapping(value = "/test")
public String test(@RequestBody String requestBody) {
System.out.println("requestBody :" + requestBody); // requestBody :username=123&password=123
return "success";
}
<body>
<h1>这里是首页</h1>
<form th:action="@{/test}" method="post">
用户名 : <input type="text" name="username"> <br/>
密码 : <input type="password" name="password"> <br/>
<input type="submit" value="提交">
</form>
</body>
2、RequestEntity
是控制器方法设置一个形参,封装请求报文的一种类型
getHeaders()方法
获取请求头星系
getBody()方法
获取请求体信息
@RequestMapping(value = "/test")
public String test(RequestEntity<String> requestEntity) {
System.out.println("getHeaders : " + requestEntity.getHeaders());
System.out.println("getBody : " + requestEntity.getBody());
return "success";
}
getHeaders :[host:"localhost:8080", connection:"keep-alive", content-length:"29", cache-control:"max-age=0", sec-ch-ua:"" Not A;Brand";v="99", "Chromium";v="99", "Google Chrome";v="99"", sec-ch-ua-mobile:"?0", sec-ch-ua-platform:""Windows"", upgrade-insecure-requests:"1", origin:"http://localhost:8080", user-agent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36", accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", sec-fetch-site:"same-origin", sec-fetch-mode:"navigate", sec-fetch-user:"?1", sec-fetch-dest:"document", referer:"http://localhost:8080/SpringMVCTest3/", accept-encoding:"gzip, deflate, br", accept-language:"zh-CN,zh;q=0.9", cookie:"Idea-d37c046e=ebb3202d-fa81-4695-90eb-6420b887c3b4; Idea-fcd81231=efa34384-1545-4b0c-b27c-c041c22f2f01", Content-Type:"application/x-www-form-urlencoded;charset=UTF-8"]
getBody : username=admin&password=admin
3、@ResponseBody
用于标识一个控制器方法,可以将该方法的返回值直接作为响应报文的响应体响应到 浏览器
@ResponseBody
@RequestMapping(value = "/test")
public String test(){
return "success";
}
这里,浏览器页面显示success
4、SpringMVC处理json
1、导入jackson依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
2、在SpringMVC的核心配置文件中开启mvc的注解驱动,此时在HandlerAdaptor
中会自动装配一个消 息转换器:MappingJackson2HttpMessageConverter
,可以将响应到浏览器的Java对象
转换为Json格式
的字符串
<mvc:annotation-driven />
测试
@ResponseBody
@RequestMapping(value = "/test")
public User test(){
return new User("admin","admin",1);
}
这里,浏览器页面显示{"username":"admin","password":"admin","id":1}
5、SpringMVC处理ajax
<div id="app">
<a th:href="@{/testAjax}" @click="testAjax">testAjax</a><br>
</div>
<script type="text/javascript" th:src="@{/static/js/vue.js}"></script>
<script type="text/javascript" th:src="@{/static/js/axios.min.js}"></script>
<script type="text/javascript">
var vue = new Vue({
el:"#app",
methods:{
testAjax:function (event) {
axios({
method:"post",
url:event.target.href,
params:{
username:"admin",
password:"123456"
}
}).then(function (response) {
alert(response.data);
});
event.preventDefault();
}
}
});
</script>
@RequestMapping("/testAjax")
@ResponseBody
public String testAjax(String username, String password){
System.out.println("username:"+username+",password:"+password); // admin 123456
return "hello,ajax";
}
6、@RestController
这是一个混合注解,相等于 @Controller注解
+ 每个方法都添加@ResponseBody注解
文件的上传和下载
1、文件下载
ResponseEntity
用于控制器方法的返回值类型
,该控制器方法的返回值就是响应到浏览器的响应报文
@RequestMapping("/testDown")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
ServletContext servletContext = session.getServletContext();
String realPath = servletContext.getRealPath("/static/img/1.jpg");
FileInputStream is = new FileInputStream(realPath);
byte[] bytes = new byte[is.available()];
is.read(bytes);
MultiValueMap<String,String> headers = new HttpHeaders();
headers.add("Content-Disposition","attachment;filename=1.jpg");
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes,headers,statusCode);
is.close();
return responseEntity;
}
2、文件上传
1、请求为post
2、添加属性enctype="multipart/form-data"
<form th:action="@{/testUp}" method="post" enctype="multipart/form-data">
头像 : <input type="file" name="photo"><br/>
<input type="submit" value="上传图片">
</form>
3、MultipartFile
对象可以获取文件相关信息
getOriginalFilename()方法
: 获取上传文件的文件名
transferTo()方法
: 上传到哪
UUID
类 : 用于处理重名问题
@RequestMapping("/testUp")
public String testUp(MultipartFile photo,HttpSession session) throws IOException {
String fileName = photo.getOriginalFilename();
// 处理重名
String hzName = fileName.substring(fileName.lastIndexOf("."));
fileName = UUID.randomUUID().toString() + hzName;
ServletContext servletContext = session.getServletContext();
// 获取服务器中photo目录的路径
String photoPath = servletContext.getRealPath("photo");
File file = new File(photoPath);
if(!file.exists()){
file.mkdir();
}
String finalPath = photoPath + File.separator + fileName;
photo.transferTo(new File(finalPath));
return "success";
}
具体需要
导入依赖
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --
>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
SpringMVC的配置文件中添加配置
<!--必须通过文件上传解析器的解析才能将文件转换为MultipartFile对象-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>
拦截器
三个位置:控制器方法执行之前、控制器方法执行之后、渲染视图完毕之后
1、拦截器的配置
需要
1、实现HandlerInterceptor
接口
2、SpringMVC的配置文件中进行配置 <mvc:interceptors>
标签里,<bean>
或者<ref>
<!-- 配置拦截器 -->
<mvc:interceptors>
<bean class="com.flzj.interceptors.FirstInterceptor"></bean>
<!-- <ref bean="firstInterceptor"/>也行 -->
</mvc:interceptors>
3、通过mvc:mapping
设置需要拦截的请求,通过mvc:exclude-mapping
设置需要排除的请求,即不需要拦截的请求
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*"/>
<mvc:exclude-mapping path="/"/>
<ref bean="firstInterceptor"></ref>
</mvc:interceptor>
</mvc:interceptors>
2、拦截器的三个抽象方法
preHandle()
控制器方法执行之前执行
返回true放行,返回false拦截
postHandle()
控制器方法执行之后执行
afterComplation()
处理完视图和模型数据,渲染视图完毕之后执行
3、多个拦截器执行顺序
每个拦截器的preHandle()都返回true
此时,多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关:
preHandle()
会按照配置的顺序执行,而postHandle()
和afterComplation()
会按照配置的反序执行
某个拦截器的preHandle()返回了false
返回false的preHandle()和它之前的拦截器的preHandle()
都会执行,postHandle()
都不执行,返回false 的拦截器之前的拦截器的afterComplation()
会执行
异常处理
1、基于配置
<property>标签
name=exceptionMappings
时,处理异常跳转页面
name=exceptionAttribute
时,将异常放到请求域中(value是request域中的k)
<prop>标签
键表示处理器方法执行过程中出现的异常
值表示若出现指定异常时,设置一个新的视图名称,跳转到指定页面
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.ArithmeticException">error</prop>
</props>
</property>
<property name="exceptionAttribute" value="ex"/>
</bean>
2、基于注解
@ControllerAdvice注解
: 将当前类标识为异常处理的组件
@ExceptionHandler注解
: value属性,包含一个Class数组
Exception
: 可以作为控制器方法的形参,被捕获到
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler(value = {ArithmeticException.class,NullPointerException.class})
public String testException(Exception ex, Model model){
model.addAttribute("ex",ex);
return "error";
}
}
End
最近和隔壁宿舍训练,确实被锤爆了,下面,我宣布,正式训练下路😡😡😡😡