一、springMVC返回值的处理
1、返回值是String类型
返回的字符串就是逻辑视图,需要和视图解析器前缀和后缀拼接为一个真正的视图
在springMVC中,如果需要使用springMVC的处理器来处理请求,但是又不需要访问视图解析器固定的文件夹,可以采用两种方式来解决:
在返回的字符串上使用固定的单词:
转发:只能在当前项目中转发
返回forward地址
测试
重定向:可以跳转其他的项目资源
redirect:资源地址
测试
2、返回值是ModelAndView
返回的的视图和模型:
3、返回值是viod
可以使用servletAPI重定向或者转发
测试
可以返回一个json串
测试
二、srpingMVC的常用注解
(一)@RequestMapping *
1、该注解添加在handler(方法)上:
测试
如果在注解中只写一个路径是默认设置的value值:
测试; 如果限定了访问方法,就会抛出405异常
属性params 限制请求的参数
测试:
如果不传递name
- name 传递的参数中必须是name属性的传参
- !name 不能有name属性传参
- name=zsan 必须有name属性而且值必须是zsan
- name!=zsan 传递的参数如果有name属性 该属性值不能是zsan
2、注解添加在类上
添加到类上,该类下所有的requestMapping的url地址都添加该属性
访问当前类下url成为
作用:用来区别不同的controller,因为在项目开发中 可能多个控制层中不同的方法名称会出现重复。
(二)@requestParam *
如果传递的参数和handler中入参名称写的不一样 不能获取到
添加数据的时候如果提交的和后台的名称不一样:
注意:
可以通过requestParam来修改:
测试:
可以为当前的参数设置默认值:
测试:
属性required 设置当前的参数是必须要提交的:
测试:
添加name
(三)@RequestHeader
获取请求的头信息:
可以在后台获取到请求头信息:
测试:
(四)@ResponseBody *
将返回任意的数据转化为json对象
如果要使用该注解,必须要导入对应的依赖:
<!--springMVC转化为json依赖包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.8</version>
</dependency>
创建一个新的类:
写handler
测试:
可以将任意的数据类型转化为json:
测试:
可以在异步中使用:
注意:js导包进去点锤子!!!!
(五)@RequestBody
获取请求体,可以ajax异步获取请求体:
测试
后台
(六)@SessionAttrbutes
将当前请求中request中对应的数据存放到session
springmvc如果要传输数据,是默认放在request域中的,如果要传输数据到session,就必须将session获取到,来传输数据。
该注解是写在类上的,该类下所有对应的handler中都会自动放数据
测试
demo02:
demo01:
当demo02controller添加注解
02:
01:
可以存放多个数据:
02中:
01中:
总结:存放多个值后会将这些值都存入session中
(七)@ModelAttribut
该注解是写在方法上面的,如果不带属性:
如果在注解中使用了属性,会将属性对应的值作为key,方法返回的值作为value放入到request域中
只要访问当前类中的hanler 都会默认存放 对应的数据
测试:
(八)@CookieValue
获取cookie数据的注解,直接根据cookie对应的key获取数据:
查看当前使用的sessionid
结果:
(九)@PathVarable *
在restFul中使用 在rest风格中传参基本上不使用?传参使用url路径传参
在springMVC中 不能直接获取路径的参数
修改web.xml拦截路径:
访问html:
创建rest风格的handler:
测试:
后台:
可以传递多个参数
测试:
后台
三、springMVC的文件上传和下载
(一)文件上传
使用文件上传需要依赖第三方的插件,fileUpload
<!--文件上传的依赖-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
修改web.xml 使用后缀拦截:
核心配置文件中 要告诉springmvc做文件上传
创建前台页面:文件上传的三要素
创建文件上传的后台handler:
package com.csdn.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
@Controller
@RequestMapping("/demo03")
public class Demo03Controller {
//单文件上传
@RequestMapping("/fileupload.do")
public String fileUpLoad(String name, MultipartFile fileUpLoad, Model model){
//MultipartFile springMVC文件上传的类 有两个方法
//getOriginalFilename 获取上传文件的名称 (包含路径)
String filename = fileUpLoad.getOriginalFilename();
//处理文件名问题
filename = filename.substring(filename.lastIndexOf("\\") + 1);
//添加uuid唯一名称
filename = UUID.randomUUID()+filename;
//创建一个文件 上传地址的文件
File file = new File("G:\\imgs",filename);
//处理异常
try {
//上传文件 transferTo将文件上传到固定的目录
fileUpLoad.transferTo(file);
//上传成功后的信息
model.addAttribute("message",name+",您上传的文件已成功");
} catch (IOException e) {
model.addAttribute("message",name+",您上传的文件未成功");
}
return "success";
}
}
测试:
如果上传的文件超过设计的字节数:
多文件上传:
两种方式:
可以通过单文件上传的进行拓展:
第二种:设置文件标签的属性:
页面:可以选择多个文件
完成多文件上传:
创建文件上传页面:
后台:文件上传使用的是数组,必须添加@RequestParam注解
package com.csdn.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
@Controller
@RequestMapping("/demo04")
public class Demo04Controller {
@RequestMapping("/fileuploads.do")
public String fileUpLoad(String name, @RequestParam MultipartFile[] file01, Model model){
//设置一参数
int count = 0;
//遍历数组
for(MultipartFile multipartFile : file01){
//判断文件是否为空 不能用null判断
if (multipartFile.getSize() > 0){
String filename= multipartFile.getOriginalFilename();
//处理文件名问题
filename = filename.substring(filename.lastIndexOf("\\")+1);
//添加唯一名称uuid
filename = UUID.randomUUID()+filename;
//创建一个文件 上传地址文件
File file = new File("G:\\imgs",filename);
//处理异常
try {
//上传文件transferTo将文件上传到固定的目录
multipartFile.transferTo(file);
//上传成功后此时+1
count++;
} catch (IOException e) {
System.out.println("上传文件失败一次");
}
}
}
//遍历结束 判断上传的成功个数
if (count==0){
model.addAttribute("message",name+",您本次上传文件一个都未成功");
}else{
model.addAttribute("message",name+",您本次上传文件:"+file01.length+"个,上传成功:"+count+"个.");
}
return "success";
}
}
测试:
(二)文件下载
文件下载只支持单文件下载
后台实现单文件下载:
//文件下载
@RequestMapping("/fileDown.do")
public ResponseEntity<byte[]> fileDown(String path) throws IOException {
//创建下载文件的父文件
File file = new File("G:\\imgs");
//解决下载中文乱码问题
String newFileName = new String(path.getBytes("UTF-8"),"ISO-8859-1");
//创建下载文件的file类
File file1 = new File(file,path);
//创建下载的文件头信息
HttpHeaders headers = new HttpHeaders();
//设置头信息下载的文件名称
headers.setContentDispositionFormData("attachment",newFileName);
//设置下载响应的类型 字节流类型
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//返回结果
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file1),headers, HttpStatus.OK);
}
前台页面
测试: