SpringMVC详解五、文件上传、@ResponseBody、@RequestBody、HttpEntity、ResponseEntity、HandlerInterceptor拦截器及异常处理

匿名 (未验证) 提交于 2019-12-03 00:34:01


1MultipartFile :

2@ResponseBody返回json

3@RequestBody接收请求体数据

4HttpEntity参数获取请求头请求体

5ResponseEntity返回值:

6HandlerInterceptor拦截器

7

1

SpringMVC

1、准备一个文件上传的表单

2、jar

commons-fileupload-1.2.1.jar

commons-io-1.4.jar

3、配置文件上传解析器: CommonsMultipartResolver

4、Controller

1.1


<body> 		<form action="${ pageContext.request.contextPath }/upload"  			method="post" enctype="multipart/form-data"> 			用户名:<input type="text" name="username"/><br/> 			头像:<input type="file" name="photo"/><br/> 			<input type="submit" /> 		</form> 	</body>

1.2jar

commons-fileupload-1.2.1.jar

commons-io-1.4.jar

commons-logging-1.1.3.jar

log4j-1.2.17.jar

spring-aop-4.0.0.RELEASE.jar

spring-beans-4.0.0.RELEASE.jar

spring-context-4.0.0.RELEASE.jar

spring-core-4.0.0.RELEASE.jar

spring-expression-4.0.0.RELEASE.jar

spring-web-4.0.0.RELEASE.jar

spring-webmvc-4.0.0.RELEASE.jar

1.3

<!-- 配置在SpringMVC中解决文件上传的协议的解析器 			id 必须是multipartResolver 	 --> 	<bean id="multipartResolver"  		class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 		<!-- 配置字符集为UTF-8 --> 		<property name="defaultEncoding" value="UTF-8" /> 	</bean>


1.4Controller

单个文件上传:

@RequestMapping("/upload") 	public String upload(String username, MultipartFile photo) { 		System.out.println("名字" + username); 		try { 			if (!photo.isEmpty() && photo != null) { 				// 第二个\是转义第一个\ 				// photo.transferTo(new File("e:\\" + 				// photo.getOriginalFilename())); 				// 正常的是访问磁盘路径 				photo.transferTo(new File("e://" + photo.getOriginalFilename())); 			} 		} catch (IllegalStateException e) { 			// TODO Auto-generated catch block 			e.printStackTrace(); 		} catch (IOException e) { 			// TODO Auto-generated catch block 			e.printStackTrace(); 		} 		return "/index.jsp"; 	}

多个文件上传:

@RequestMapping(value = "/upload") 	public String upload(String username, 			@RequestParam(value = "photo") MultipartFile[] photo) { 		System.out.println("用户名:" + username); 		for (MultipartFile multipartFile : photo) { 			// 说明有上传的内容 			// isEmpty判断是否为空 			if (multipartFile != null && !multipartFile.isEmpty()) { 				try { 					// transferTo 将文件写入到硬盘位置 					// getOriginalFilenameaqb 					multipartFile.transferTo(new File("e:\\" 							+ multipartFile.getOriginalFilename())); 				} catch (IllegalStateException e) { 					e.printStackTrace(); 				} catch (IOException e) { 					e.printStackTrace(); 				} 			} 		}  		return "forward:/index.jsp"; 	}

springmc

参数:MultipartFile photo

方法:photo.transferTo(new

2@ResponseBodyjson******

2.1

1、jsonweb

jackson-annotations-2.1.5.jar

jackson-core-2.1.5.jar

jackson-databind-2.1.5.jar

2、编写一个请求的方式接收请求,并返回数据对象

3、在方法上添加注解@ResponseBodyjson

2.2Controller

@ResponseBody 	@RequestMapping(value = "/queryPersonById") 	public Person queryPersonById() { 		return new Person(19, "name10", new Date(), "wzg186@qq.com", 				new BigDecimal(100)); 	}  	@ResponseBody 	@RequestMapping(value = "/personList") 	public List<Person> personList() { 		List<Person> list = new ArrayList<Person>(); 		for (int i = 0; i < 10; i++) { 			list.add(new Person(i, "name" + i, new Date(), "wzg186@qq.com", 					new BigDecimal(100))); 		} 		return list; 	}

从上面可以看出:控制器也可以返回对象类型

2.3




2.4@JsonFormat修改时间在json

1)、可以直接用在属性上

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

privatebirthDate;

2getter()

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")

public

returnbirthDate;

}

@JsonFormat琛ㄧず璁剧疆json

pattern="yyyy-MM-dd HH:mm:ss" yyyy-MM-ddyyyy-MM-ddHH:mm:ss

timezone = "GMT+8"+8小时

3@RequestBody接收请求体数据

HTTPPOSTpost

3.1post


	<form action="${pageContext.request.contextPath }/requestBody" method="post"> 			用户名:<input type="text" name="username" /><br/> 			密码:<input type="password" name="password" /><br/> 			<input type="submit" /> 		</form>

3.2Controller

/** 	 * GET请求 	 * 	1、请求行 	 * 	2、请求头 	 * POST请求 	 *  1、请求行 	 *  2、请求头 	 *  	空行 	 *  3、请求体(请求的参数) 	 */ 	// @RequestBody 它可以接收请求体的数据---请求体,只存在于post请求 	@RequestMapping(value = "/requestBody")  	public String requestBody(@RequestBody String body) { 		System.out.println("请求体的全部内容:" + body); 		return "forward:/index.jsp"; 	}

4HttpEntity参数获取请求头和请求体

页面代码:

<!-- post请求,默认的请求参数都会以name=value&name=value的形式进行拼接,然后发送给服务器。 --> 		<form action="${pageContext.request.contextPath }/httpEntity" method="post"> 			用户名:<input type="text" name="username" /><br/> 			密码:<input type="password" name="password" /><br/> 			<input type="submit" /> 		</form>

Controller

@RequestMapping(value = "/httpEntity") 	public String httpEntity(HttpEntity<String> httpEntity) { 		System.out.println("请求头:" + httpEntity.getHeaders()); 		System.out.println("请求体:" + httpEntity.getBody()); 		return "forward:/index.jsp"; 	}

5ResponseEntity:

@RequestMapping(value = "/download") 	public ResponseEntity<byte[]> download(HttpSession session) { 		try { 			ServletContext ctx = session.getServletContext(); 			// 斜杠(斜线)表示到http://ip:port/工程名/	映射到代码的WebContent目录 			InputStream is = ctx.getResourceAsStream("/imgs/e.jpg"); 			byte[] buffer; 			buffer = new byte[is.available()]; 			//读文件数据 			is.read(buffer); 			is.close(); 			//获取需要下载的文件的数据类型 			String mimeType = ctx.getMimeType("/imgs/e.jpg"); 			 			// 响应头 			HttpHeaders httpHeaders = new HttpHeaders(); 			// 添加响应头,告诉客户端我回去的数据类型是什么 			httpHeaders.add("Content-Type", mimeType); 			httpHeaders.add("Content-Disposition", "attachment; filename=e.jpg"); 			// 第一个参数是你要返回的数据--我们要实现文件下载,就需要把下载的文件字节内容都放body中 			// 第二个参数是 响应头 			// 第三个参数是你要返回的响应状态码和响应 状态描述 符 			ResponseEntity<byte[]> responseEntity = new ResponseEntity<byte[]>( 					buffer, httpHeaders, HttpStatus.OK);  			return responseEntity; 		} catch (IOException e) { 			// TODO Auto-generated catch block 			e.printStackTrace(); 		} 		return null; 	}

6HandlerInterceptor拦截器

6.1HandlerInterceptor

Controller

6.2HandlerInterceptor

1HandlerInterceptor

2SpringSpringMVC

拦截器类实现代码:

public class FirstHandlerInterceptor implements HandlerInterceptor { 	/** 	 * 在拦截到目标方法前调用 	 */ 	@Override 	public boolean preHandle(HttpServletRequest request, 			HttpServletResponse response, Object handler) throws Exception { 		System.out.println("FirstHandlerInterceptor -- >>> preHandle" ); 		//return false不放行 		//return true放行 		return true; 	} 	/** 	 * 在目标方法执行之后执行。 	 */ 	@Override 	public void postHandle(HttpServletRequest request, 			HttpServletResponse response, Object handler, 			ModelAndView modelAndView) throws Exception { 		System.out.println("FirstHandlerInterceptor -- >>> postHandle" ); 	}  	/** 	 * 在目标方法执行完。跳转页面渲染完之后 	 */ 	@Override 	public void afterCompletion(HttpServletRequest request, 			HttpServletResponse response, Object handler, Exception ex) 			throws Exception { 		System.out.println("FirstHandlerInterceptor -- >>> afterCompletion" ); 	}  }

配置拦截的地址:

	<!-- 配置多个拦截器标签mvc:interceptors --> 	<mvc:interceptors> 		<!-- 配置一个拦截器标签mvc:interceptor --> 		<mvc:interceptor> 			<!-- 拦截的地址 --> 			<mvc:mapping path="/hello"/> 			<!-- 拦截器具体实现类 --> 			<bean class="com.tcent.controller.FirstHandlerInterceptor" /> 		</mvc:interceptor> 	</mvc:interceptors>	

FirstHandlerInterceptorhello

正常情况下,拦截器的执行顺序:

FirstHandlerInterceptor -- >>> preHandle

目标方法执行…………

FirstHandlerInterceptor -- >>> postHandle

页面渲染的代码

FirstHandlerInterceptor -- >>> afterCompletion

6.3

false

1、目标方法前执行false

2、这是目标方法不执行

3、目标方法之后不执行

4、这是渲染页面不执行

5、页面渲染完成!不执行

true

1、目标方法前执行true

2、这是目标方法异常

3、目标方法之后不执行

4、这是渲染页面渲染异常页面

5、页面渲染完成!执行

true

1、目标方法前执行true

2、这是目标方法执行

3、目标方法之后异常

4、这是渲染页面渲染异常页面

5、页面渲染完成!执行

true

1、目标方法前执行true

2、这是目标方法执行

3、目标方法之后执行

4、这是渲染页面异常

5、页面渲染完成!执行

7

7.1@ExceptionHandler注解处理异常

//@ExceptionHandler可以拦截到本Controller中的异常 	@ExceptionHandler 	public ModelAndView exceptionHandler(Exception e) { 		System.out.println("exceptionHandler --- Exception"); 		ModelAndView modelAndView = new ModelAndView("forward:/error.jsp"); 		modelAndView.addObject("exception", e); 		return modelAndView; 	} 	 	//@ExceptionHandler可以拦截到本Controller中的异常 	@ExceptionHandler 	public ModelAndView exceptionHandler(RuntimeException e) { 		System.out.println("exceptionHandler --- RuntimeException"); 		ModelAndView modelAndView = new ModelAndView("forward:/error.jsp"); 		modelAndView.addObject("exception", e); 		return modelAndView; 	} 	 	//@ExceptionHandler可以拦截到本Controller中的异常 	@ExceptionHandler 	public ModelAndView exceptionHandler(ArithmeticException e) { 		System.out.println("exceptionHandler --- ArithmeticException"); 		ModelAndView modelAndView = new ModelAndView("forward:/error.jsp"); 		modelAndView.addObject("exception", e); 		return modelAndView; 	}

Controller@ExceptionHandler标注的异常处理方法。

SpringMVC

@ExceptionHandlerController注解在方法上

@ControllerAdviceController注解在类上

7.2@ControllerAdvice注解处理异常

/**  * @ControllerAdvice它可以处理所有Controller中产生的异常  *  */ @ControllerAdvice public class ExceptionEHander2 { 	 	@ExceptionHandler 	public ModelAndView exceptionHandler(Exception e) { 		System.out.println("@ControllerAdvice --- Exception"); 		ModelAndView modelAndView = new ModelAndView("forward:/error.jsp"); 		modelAndView.addObject("exception", e); 		return modelAndView; 	} 	 	@ExceptionHandler 	public ModelAndView exceptionHandler(RuntimeException e) { 		System.out.println("@ControllerAdvice --- RuntimeException"); 		ModelAndView modelAndView = new ModelAndView("forward:/error.jsp"); 		modelAndView.addObject("exception", e); 		return modelAndView; 	} 	 	@ExceptionHandler 	public ModelAndView exceptionHandler(ArithmeticException e) { 		System.out.println("@ControllerAdvice --- ArithmeticException"); 		ModelAndView modelAndView = new ModelAndView("forward:/error.jsp"); 		modelAndView.addObject("exception", e); 		return modelAndView; 	}  }

7.3

在局部异常处理和全局异常处理同时存在的时候,优先顺序是:

1、局部优先---->>>>2

7.4SimpleMappingExceptionResolver类、简单映射异常跳转

说明:配置SimpleMappingExceptionResolver

<!-- 配置SimpleMappingExceptionResolver简单异常映射解析器 --> 	<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 		<!-- 异常映射属性 --> 		<property name="exceptionMappings"> 			<props> 				<!--  					key写上异常全类名 					在prop标签中填写指定的跳转地址 				 --> 				<prop key="java.lang.Exception">forward:/error.jsp</prop> 				<prop key="java.lang.RuntimeException">forward:/error.jsp</prop> 				<prop key="java.lang.ArithmeticException">forward:/error.jsp</prop> 				<prop key="java.lang.NullPointerException">forward:/null.jsp</prop> 			</props> 		</property> 	</bean>

SpringMVC详解四、自带标签库及自定义参数转换器


jar包下载


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!