目录
项目准备JSONJSON作用JSON演示@ResponseBody注解日期返回json格式
文件上传与下载文件上传准备工作文件项上传文件完成
文件下载文件下载页面下载业务代码
SpringMVC的执行流程
项目准备
大体步骤:
新建dynamic web project, 修改默认输出的class路径,修改content directory名,勾选生成web.xml拷贝SpringMVC核心配置文件 开启扫描包路径 放行静态资源 使spring注解生效 视图解析器拷贝web.xml 前端控制器,过滤器部署Tomcat导包编写TestControllerwebapp\WEB-INF\views下新建index.jsp
测试
JSON
JSON作用
在实际开发中,通常需要和别的系统交换数据,数据交换的格式通常有XML和JSON等;JSON(JavaScript Object Notation:JavaScript对象表示法)是一种基于JavaScript 语法开放的轻量级数据交换格式,使用js语法来描述数据对象;JSON作为一个轻量级的数据格式,相对于XML,文档更小,结构清晰简洁,读写效率更高,XML需要很多的标签,在数据传输的时候无疑会消耗更多网络资源和流量: (1)用XML表示一个对象:
(2)用JSON表示一个对象:{“id”:1,“name”:“tom”,“salary”:5000.0}
JSON演示
// 定义json
var obj = {"id":123,"name":"王天霸","age":30};
// 弹出框
alert(obj.name);
alert(obj.age);
var arr = [{"name":"tom","age":20},{"name":"jack","age":30}];
alert(arr[1].age)
alert(arr[0].name)
@ResponseBody注解
会把数据转成json格式,并且不会走视图解析器了
@Controller
public class JsonController {
/**
* 返回一个json格式的user对象
* tips:406:缺少jar
*/
@RequestMapping("/user")
@ResponseBody // 会把数据转成json格式,并且不会走视图解析器了
public User json1(){
User user = new User(111, "力很弱", 20);
return user;
}
@RequestMapping("/list")
@ResponseBody // 会把数据转成json格式,并且不会走视图解析器了
public List
User user1 = new User(111, "力很弱", 20);
User user2 = new User(222, "王天霸", 21);
User user3 = new User(333, "阮经天", 22);
List
list.add(user1);
list.add(user2);
list.add(user3);
return list;
}
}
日期返回json格式
User
public class User {
private Integer id;
private String name;
private Integer age;
@JsonFormat(pattern="yyyy^_^MM^_^dd HH^_^mm^_^ss",timezone="GMT+8")
private Date date;
public User() {
super();
}
public User(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public User(Integer id, String name, Integer age, Date date) {
super();
this.id = id;
this.name = name;
this.age = age;
this.date = date;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
JsonController
/**
* 日期格式问题
*/
@RequestMapping("/date")
@ResponseBody
public User json3(){
User user = new User(111, "力很弱", 20, new Date());
return user;
}
文件上传与下载
文件上传与下载实质都是IO流的读写操作
文件上传
文件上传:把本地资源上传到服务器,即将本地磁盘中的文件复制到服务器指定的地方 输入流(读) - 输出流(写)
准备工作
1.新建upload.html,填写上传表单
2.导包 commons-fileupload-1.2.2.jar,commons-io-1.4.jar
3.上传解析器 SpringMVC.xml
文件项
以前写的username,password。。。 :简单的表单项 文件上传: 复杂表单项
tips:文件名和路径名尽量不要重复,如upload
UploadController
@Controller
public class UploadController {
/**
* photo: 复杂表单项---以前获取参数的方式不行了
* MultipartFile:文件项 接收的是一个地址值---包含了上传的内容了
*/
@RequestMapping("/upload")
public String uploadFile(MultipartFile photo){
boolean empty = photo.isEmpty();
if (!empty) {
String filename = photo.getOriginalFilename();
System.out.println(filename);
}
return null;
};
}
上传文件完成
@Controller
public class UploadController {
/**
* photo: 复杂表单项---以前获取参数的方式不行了
* MultipartFile:文件项 接收的是一个地址值---包含了上传的内容了
*/
@RequestMapping("/upload")
public String uploadFile(MultipartFile photo,HttpServletRequest request) throws IOException{
if (!photo.isEmpty()) {
// 获取当前项目路径
String realPath = request.getServletContext().getRealPath("/upload1");
// 获取文件名 u=19008.jpg
String filename = photo.getOriginalFilename();
// 获取上传文件的后缀
int index = filename.lastIndexOf(".");
// 后缀
String suffix = filename.substring(index);
// 随机生成一个文件名 1610434039685.xml
// 获取时间戳
long i = System.currentTimeMillis();
// 拼接之后的名字
String name = i+suffix;
// 通过File构造获取一个完整的file路径
File file = new File(realPath, name);
// 输入流
InputStream input = photo.getInputStream();
// 获取输出流
FileOutputStream output = new FileOutputStream(file);
// 上传的核心代码
IOUtils.copy(input, output);
// 关流
output.close();
input.close();
}
// 重定向到当前页面
return "redirect:/uploadFile.html";
}
}
文件下载
从服务器将文件复制到本地磁盘中 重点:输入流,输出流
把download目录放入工程中代表服务器资源
文件下载页面
新建download.jsp
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
tips:要解决IE浏览器点击有中文的A标签报错400的问题,用uff-8编码解决
下载业务代码
tips: 1.要解决浏览器能打开就直接打开不下载的问题 2.要解决中文乱码的问题(文件名乱码)
DownloadController
@Controller
public class DownloadController {
@RequestMapping("/download")
public void download(String filename,HttpServletRequest req,
HttpServletResponse resp) throws IOException{
// 获取download路径
String realPath = req.getServletContext().getRealPath("/download");
// 完整的file文件
File file = new File(realPath, filename);
// 不同的浏览器去处理中文乱码方式
if(req.getHeader("User-Agent").toUpperCase().indexOf("TRIDENT")!=-1){
filename = URLEncoder.encode(filename, "utf-8");
//电脑自带edge【edʒ】浏览器
}else if(req.getHeader("User-Agent").toUpperCase().indexOf("EDGE")!=-1){
filename = URLEncoder.encode(filename, "utf-8");
}else{//其他浏览器
filename = new String(filename.getBytes("UTF-8"),"ISO-8859-1");//转码的方式
};
// 告诉浏览器我要以下载的方式处理这个文件
resp.setHeader("Content-Disposition", "attachment; filename=" + filename);
// 获取输入流
FileInputStream input = new FileInputStream(file);
// 获取响应输出流
ServletOutputStream output = resp.getOutputStream();
// 核心代码
IOUtils.copy(input, output);
// 关流
output.close();
input.close();
}
}
SpringMVC的执行流程
四大器:前端控制器、处理器映射器、处理器适配器、视图解析器 前端控制器之前还有一个过滤器,之后有三个阶段的拦截器
相关链接
发表评论