一、ModelAndView、ModelMap和Model三者存放值的用法
(1)ModelAndView
ModelAndView对象有两个作用:
作用一: 设置转向地址,如下所示(这也是ModelAndView和ModelMap的主要区别)
ModelAndView view = newModelAndView("path:ok");
作用二: 用于传递控制方法处理结果数据到结果页面,也就是说我们把需要在结果页面上需要的数据放到ModelAndView对象中即可,他的作用类似于request对象的setAttribute方法的作用,用来在一个请求过程中传递处理的数据。通过以下方法向页面传递参数:
addObject(String key,Object value);
在页面上可以通过el变量方式$key或者bboss的一系列数据展示标签获取并展示ModelAndView中的数据。
(2)ModelMap对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面上需要的数据放到ModelMap对象中即可,他的作用类似于request对象的setAttribute方法的作用,用来在一个请求过程中传递处理的数据。通过以下方法向页面传递参数:
addAttribute(String key,Object value);
在页面上可以通过el变量方式$key或者bboss的一系列数据展示标签获取并展示modelmap中的数据。
modelmap本身不能设置页面跳转的url地址别名或者物理跳转地址,那么我们可以通过控制器方法的返回值来设置跳转url地址别名或者物理跳转地址。
ModelMap跟model的用法一模一样。谁最后赋值就先取谁,通过addAttribute 方法把值存放进去
(3)Model是一个接口, 其实现类为ExtendedModelMap,继承了ModelMap类。
二、拦截器
package com.test.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("controller之前执行该方法");
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("controller执行之后,生成视图之前执行");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("controller之后执行该方法");
}
}
Springmvc.xml配置
<mvc:interceptors>
<!—拦截器对所有请求都进行拦截 -->
<bean class="com.demo.interceptor.MyInterceptor"></bean> <!--拦截器链 针对user.do进行拦截 可以编写多个拦截器-->
<mvc:interceptor>
<mvc:mapping path="/user.do" />
<!—对test下面的一级路径进行拦截-->
<!--<mvc:mapping path="/test/*" />-->
<!—对test下面的多级路径进行拦截-->
<!--<mvc:mapping path="/test/**" />-->
<bean class="com.demo.interceptor.MyInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
三、文件下载
package com.test.controller;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.io.File;
@Controller
public class DownloadController {
@RequestMapping("/download.do")
public ResponseEntity<byte[]> download() throws Exception {
String path="F:\\IDEA\\apache-tomcat-9.0.0.M26\\webapps\\images\\1.png";
File file=new File(path);
HttpHeaders headers=new HttpHeaders();
//String fileName=new String("你好.txt".getBytes("UTF-8"),"iso-8859-1"); //为了解决中文乱码问题
headers.setContentDispositionFormData("attachment","1.png");
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
}
}
