SpringMVC 作用域传值的几种方式以及文件的上传下载

文章目录

      • JSP中的四大作用域
      • SpringMVC 作用域传值的几种方式
      • 文件下载
      • 文件上传


JSP中的四大作用域

  • page:在当前页面不会被重新实例化
  • request:在一次请求中是同一个对象,下一次请求会重新创建一个request对象
  • session:表示一次会话,只要Jsessionid不变,session不会被重新实例化
    • 有效时间:浏览器关闭前,或默认失效时间之内
  • application:tomcat启动时实例化,关闭时销毁

SpringMVC 作用域传值的几种方式

  • 1、使用原生的servlet
    • 在HandlerMethod中添加参数
@Controller
public class DemoController {

	@RequestMapping("demo1")
	public String demo1(HttpServletRequest req) {
		req.setAttribute("req", "req的值");
		HttpSession session = req.getSession();
		session.setAttribute("session", "session的值");
		ServletContext application = req.getServletContext();
		application.setAttribute("application", "application的值");
		return "/index.jsp";
	}
}
request:${requestScope.req }</br>
session:${sessionScope.session }</br>
application:${applicationScope.application }</br>
request:req的值
session:session的值
application:application的值
  • 2、使用 map 集合赋值
    • 把 map 集合中的内容放在 request 作用域中,在其他作用域中取不到
	@RequestMapping("demo2")
	public String demo2(Map<String, Object> map) {
		map.put("map", "map的值");
		return "/index.jsp";
	}
map:${requestScope.map }
  • 3、使用 SpringMVC 中的 Model 接口
    • 最终也是放在 request 作用域中
	@RequestMapping("demo3")
	public String demo3(Model model) {
		model.addAttribute("model", "model的值");
		return "/index.jsp";
	}
  • 4、使用SpringMVC中的 ModelAndView 接口
    • 该接口带有跳转功能
	@RequestMapping("demo4")
	public ModelAndView demo4() {
		ModelAndView mav = new ModelAndView("/index.jsp");
		mav.addObject("mav", "mav的值");
		return mav;
	}

文件下载

  • 访问资源时,响应头如果没有设置 Content-Disposition,浏览器默认按照 inline 值进行处理
    • inline 能显示就显示,不能显示就下载
  • 只需要修改响应头中 Context-Disposition=”attachment;filename=文件名”
    • attachment 下载,以附件形式下载
    • filename=值就是下载时显示的下载文件名

使用
1、 导 jar 包
在这里插入图片描述2、创建超链接

<a href="download?filename=a.txt">下载a>

3、写控制器

	@RequestMapping("download")
	public void download(String filename, HttpServletRequest req, HttpServletResponse resp) throws IOException {
		resp.setHeader("Content-Disposition", "attachment;filename="+filename);
		ServletOutputStream os = resp.getOutputStream();
		File file = new File(req.getServletContext().getRealPath("files"), filename);
		byte[] bytes = FileUtils.readFileToByteArray(file);
		os.write(bytes);
		os.flush();
		os.close();
	}

文件上传

  • 基于 apache 的 commons-fileupload.jar 完成文件上传
  • MultipartResovler 作用
    • 把客户端上传的文件流转换成 MutipartFile 封装类
    • 通过 MutipartFile 封装类获取到文件流
  • 表单数据类型分类
    • 在的 enctype 属性控制表单类型
    • 默认值 application/x-www-form-urlencoded,普通表单数据(少量文字信息)
    • text/plain 大文字量时使用的类型,邮件,论文
    • multipart/form-data 表单中包含二进制文件内容

1、编写 JSP 页面

<form action="upload" enctype="multipart/form-data" method="post">
	姓名:<input type="text" name="name"/><br/>
	文件:<input type="file" name="file"/><br/> 
	<input type="submit" value=" 提 交 "/> 
</form>

2、配置 springmvc.xml


	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.Comm onsMultipartResolver">
		<property name="maxUploadSize" value="50">property>
	bean>
	
	
	<bean id="exceptionResolver"
		class="org.springframework.web.servlet.handler.Simple MappingExceptionResolver">
		<property name="exceptionMappings">
			<props>
				<prop
					key="org.springframework.web.multipart.MaxUploadSizeE xceededException">/error.jspprop>
			props>
		property>
	bean>

3、编写控制器类

  • MultipartFile 对象名必须和的 name 属性值相同
@RequestMapping("upload") 
public String upload(MultipartFile file,String name) throws IOException{ 
	String fileName = file.getOriginalFilename(); 
	String suffix = fileName.substring(fileName.lastIndexOf("."));
	//判断上传文件类型 
	if(suffix.equalsIgnoreCase(".png")){ 
		String uuid = UUID.randomUUID().toString();
		FileUtils.copyInputStreamToFile(file.getInputStream (), new File("E:/"+uuid+suffix)); 
		return "/index.jsp"; 
	}else{ 
		return "error.jsp"; 
	} 
}

你可能感兴趣的:(#,SpringMVC)