SpringMVC的学习(五)——SpringMVC返回值、SpringMVC实现文件上传

一、SpringMVC返回值

①json数据

访问控制器返回Json类型数据

导入对应的JSON包

支持:

jackson : jackson-databind/jackson-annotations/jack-core

gson: gson

注意:  jackson需要三个jar包!如果使用maven引入jackson-databind会连带引入 core和annotations。如果非maven项目,必须加入三个jar包!

Fastjson:fastjson

实现代码:

主要使用@ResponseBody

@ResponseBody
	@RequestMapping("/json")
	public List<User> getJson() {
		
		User user = new User();
		user.setUsername("小毛");
		user.setPassword("admin");
		user.setBirthday(new Date());

		List<User> list = new ArrayList<User>();
		list.add(user);
		list.add(user);
		return list;
	}

②String

情况1: 查找到指定的视图

  return "user/show";  默认就是转发

情况2: 转发或者重定向

  return "redirect: path";

  return "forword:path";

③ModelAndView

返回数据视图模型对象

    ModelAndView mv = new ModelAndView();

    mv.setViewName("查找视图路径");

mv.addObject("key","object type data");

④Object对象

配合@ResponseBody返回Json数据类型!

@ResponseBody
	@RequestMapping("/json1")
	public User getJson1() {
		User user = new User();
		user.setUsername("小毛");
		user.setPassword("admin");
		user.setBirthday(new Date());
		return user;
	}

⑤void

可以返回其他mimetype类型的数据!通常将方法定义成void!

配合方法传参得到Response对象,通过Response.getWriter().writer("数据")

二、SpringMVC实现文件上传

Spring MVC为文件上传提供了直接支持,这种支持是通过即插即用的MultipartResolver实现. Spring使用Jakarta Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver

在SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要先在上下文中配置MultipartResolver。

①需要引入jar包:

commons-fileupload.jar

  commons-io.jar

②在SpringMVC.xml中配置multipartResolver

<!--multipartResolver配置 -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="defaultEncoding" value="UTF-8"/>
		<property name="maxUploadSize" value="5242880"/>
		<property name="uploadTempDir" value="file:/d:/temp"/>
	</bean>

其中属性详解:

defaultEncoding="UTF-8" 是请求的编码格式,默认为iso-8859-1

maxUploadSize="5400000" 是上传文件的大小,单位为字节

uploadTempDir="file:/d:/temp" 为上传文件的临时路径

③编写文件上传表单

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
  <center>
      <form method="post" enctype="multipart/form-data" action="user/upload">
            <label for="name">文件名称<input type="text" id="name" name="name" /></label>
            <input type="file" name="file" />
            <button>提交</button>
      </form>
  </center>
</body>
</

④编写控制器

@Controller
@RequestMapping("/user")
public class UploadController {

	@RequestMapping("/upload")
	public String saveFile(@RequestParam("name") String name, @RequestParam("file") MultipartFile file) throws IOException {
		// 接收表单提交的数据,包含文件
		System.out.println("name = " + name);
		if (!file.isEmpty()) {
			file.transferTo(new File("G:/temp/" + file.getOriginalFilename()));
		}
		return "success";
	}
}

SpringMVC会将上传文件绑定到MultipartFile对象上. MultipartFile提供了获取长传文件内容,文件名等方法,通过transferTo()方法还可将文件存储到磁盘中,具体方法如下:

改进版:

@Controller
@RequestMapping("/user")
public class UploadController {

	@RequestMapping("/upload")
	public String saveFile(@RequestParam("name") String name, @RequestParam("file") MultipartFile file,HttpServletRequest request) throws IOException {
		// 接收表单提交的数据,包含文件
		System.out.println("name = " + name);
		File path = createDir(request.getSession().getServletContext());
		String fileName=createName(file.getOriginalFilename());
		File f=new File(path, fileName);
		if (!file.isEmpty()) {
			file.transferTo(f);
		}
		return "success";
	}

	// 创建目录---以日期,一天一个文件夹
	private File createDir(ServletContext context) {
		String realPath = context.getRealPath("/static/upload");
		String date = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime());
		File file = new File(realPath, date);
		if (!file.exists()) {
			file.mkdir();
		}
		return file;
	}

	// 创建文件名--区分同名文件,在文件名前加上当前的时间
	private String createName(String name) {
		return new SimpleDateFormat("yyyyMMddHHmmssSSS").format(Calendar.getInstance().getTime()) + "_" + name;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值