SpringMVC(四)-- 文件下载、自定义拦截器、异常处理

1.文件下载

用ResponseEntity<byte[]> 返回值完成文件下载

具体参见本博客之前的《文件上传下载》

@RequestMapping(value="/testResponseEntity")
public ResponseEntity<byte[]> testResponseEntity(HttpServletRequest request) throws Exception{
	ServletContext servletContext = request.getServletContext();
	String fileName = "风吹麦浪.mp3";
	String realPath = servletContext.getRealPath("/WEB-INF/"+fileName);
	InputStream in = new FileInputStream(new File(realPath));

	byte[] body = new byte[in.available()];
	in.read(body);
	MultiValueMap<String, String> headers = new HttpHeaders();

	fileName = new String(fileName.getBytes("gbk"),"iso8859-1");

	headers.set("Content-Disposition", "attachment;folename="+fileName);
	HttpStatus statusCode = HttpStatus.OK;

	ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body, headers, statusCode);
	in.close();
	return response;
}

2.自定义拦截器

Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必 须实现HandlerInterceptor接口

1).自定义实现类实现 HandlerInterceptor接口

public class MyInterceptor implements HandlerInterceptor{
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("1-preHandle");
		return true;
	}
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("1-postHandle");
	}
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("1-afterCompletion");
	}
}

三个方法

–    preHandle():该方法在目标方法之前被调用,

若返回值为true,则继续调用后续的拦截器和目标方法

若返回值为false,则不会再调用后续的拦截器和目标方法

可以考虑做权限,日志或者事务等!

–    postHandle():调用目标方法之后,但渲染视图之前被调用

可以对请求域中的属性或者视图做出修改!

–    afterCompletion():渲染视图之后被调用,

可以在该方法中进行一些资源清理的操作。

2).在springmvc配置文件中配置相对应的拦截器

<mvc:interceptors>
      <!--配置自定义拦截器 ,MyFilter都拦截 -->
      <bean class="com.neuedu.springmvc.filter.MyFilter"></bean>
</mvc:interceptors>

若有多个拦截器

<mvc:interceptors>
	<bean class="com.neuedu.springmvc.interceptor.MyInterceptor"></bean>
	<mvc:interceptor>
	        <mvc:mapping path="/**"/><!-- 都拦截 -->
		<mvc:exclude-mapping path="/testInterceptor"/><!-- 除了这个都拦截 -->
		<bean class="com.neuedu.springmvc.interceptor.BInterceptor"></bean>
	</mvc:interceptor>
</mvc:interceptors>

  <mvc:mapping path=" "/> 与 <mvc:exclude-mapping path=" "/> 连用

  前者代表:都拦截

  后者代表:除了这个都拦截

3.SpringMVC的异常处理

1.加上<mvc:annotation-driven>标签:

2.在当前Handler中定义由@ExceptionHandler注解修饰的方法,用于处理异常信息!

注意:

1)[email protected] 方法修饰的入参中可以加入Exception类型的参数,该参数即对应发生的异常信息

2)[email protected] 方法的入参中不能传入Map.若希望把异常信息传到页面上,需要使用ModelAndView作为方法的返回值

@ExceptionHandler(value={ArithmeticException.class})
public ModelAndView handleException(Exception ex){
    ModelAndView mv = new ModelAndView();
    mv.setViewName("error");
    mv.addObject("exception", ex);
    return mv;
}

3)[email protected] 注解定义的方法优先级问题:

例如发生的是NullPointerException,但是声明的异常有 RuntimeException 和 Exception,此候会根据异常的最近继承关系找到继承深度最浅的那个 @ExceptionHandler 注解方法,即标记了 RuntimeException 的方法

4).ExceptionHandlerMethodResolver 内部若找不到@ExceptionHandler 注解的话,会找@ControllerAdvice 中的@ExceptionHandler 注解方法

@ControllerAdvice
public class HangleException {
      @ExceptionHandler(value={ArithmeticException.class})
      public String handleException(){
            System.out.println("no");
            return "error";
      }
}

4,基于配置的异常处理

如果希望对所有异常进行统一处理,可以使用 SimpleMappingExceptionResolver,它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
     <!-- exceptionAttribute用于指定异常对象在request域中的键 -->
     <property name="exceptionAttribute" value="ex"></property>
     <property name="exceptionMappings">
          <props>
          <!-- key:指定异常的全类名   value:出现错误后要转发到的页面,但是此处没有value属性,所以直接写,如"error"-->
                <prop key="java.lang.ArithmeticException">error</prop>
          </props>
     </property>
</bean>

在 jsp页面写   ${exception },会在页面显示错误信息

这是因为默认将该信息写到 request 域中

如果不想用这个 名称,可以在配置信息中添加

<property name="exceptionAttribute" value="ex"></property>

这样在 jsp 页面写 ${ex }  也会在页面显示错误信息

时间: 2024-10-11 23:15:27

SpringMVC(四)-- 文件下载、自定义拦截器、异常处理的相关文章

SpringMVC 文件上传&amp;拦截器&amp;异常处理

文件上传 Spring MVC 为文件上传提供了直接的支持,这种支持是通过即插即用的 MultipartResolver 实现的.Spring 用 Jakarta Commons FileUpload 技术实现了一个MultipartResolver 实现类:CommonsMultipartResovlerSpring MVC 上下文中默认没有装配 MultipartResovler,因此默认情况下不能处理文件的上传工作,如果想使用 Spring 的文件上传功能,需现在上下文中配置 Multip

springMVC整理04--文件上传 &amp; 拦截器 &amp; 异常处理

1.  文件上传 SpringMVC 的文件上传非常简便,首先导入文件上传依赖的 jar: 1 <!-- 文件上传所依赖的 jar 包 --> 2 <dependency> 3 <groupId>commons-fileupload</groupId> 4 <artifactId>commons-fileupload</artifactId> 5 <version>1.3.1</version> 6 </

SpringMVC 学习笔记(九) 自定义拦截器

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Spring MVC</span><span style="font-family: 宋体; background-color: rgb(255, 255, 255);">也可以使用拦截器对请求进行拦截处理,用户 可以自定义拦截器来实现特定的功

SpringMVC自定义拦截器详解 (转)

经过一天的奋战,终于会使用了SpringMVC,下面讲下他的拦截器.使用SpringMVC拦截器和Struts2一样,Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口.完整的例子可以到我的资源下载:http://download.csdn.net/download/tjcyjd/4255319 HandlerInterceptor接口的代码如下: package org.springfra

springMVC --拦截器流程详细,使用和自定义拦截器

先看看拦截器都做些什么: 1.日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV(PageView)等. 2.权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面: 3.性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录): 4.通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Loca

【第四十章】Spring Boot 自定义拦截器

1.首先编写拦截器代码 package com.sarnath.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Service; import org.springframework.web.servlet.HandlerInterceptor; import

springmvc之RestFul和拦截器

一:什么是Restful? Restful就是开发人员都默认和准守的一种对于url请求的一种规范:因为随着HTML5的兴起,数据的提交已经不仅仅局限在表单了,如果需要多个终端来公用一个后端,一般来说主流的设计方案就是使用json数据来传递. 在Restful中: 1,一个url操作一个资源: 2,使用http的请求方式来描述请求的行为:例如: GET(查) http://localhost:8080/book/1 查询id为1的书POST(增) http://localhost:8080/boo

struts2 文件的上传下载 表单的重复提交 自定义拦截器

文件上传中表单的准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置为 post 需添加 <input type=“file”> 字段. Struts 对文件上传的支持 在 Struts 应用程序里, FileUpload 拦截器和 Jakarta Commons FileUpload 组件可以完成文件的上传. 步骤:1. 在 Jsp 页面的文件上传表单里使用

JAVAEE——struts2_04:自定义拦截器、struts2标签、登陆功能和校验登陆拦截器的实现

一.自定义拦截器 1.架构 2.拦截器创建 //拦截器:第一种创建方式 //拦截器生命周期:随项目的启动而创建,随项目关闭而销毁 public class MyInterceptor implements Interceptor{} //创建方式2: 继承AbstractInterceptor -> struts2的体贴 //帮我们空实现了init 和 destory方法. 我们如果不需要实现这两个方法,就可以只实现intercept方法 public class MyInterceptor2