springmvc-文件上传 拦截器 全局异常 返回json 处理流程

11 篇文章 0 订阅

spring mvc上传

  1. 添加项目依赖

    <!-- 上传组件 -->
    <dependency>
    	<groupId>commons-io</groupId>
    	<artifactId>commons-io</artifactId>
    	<version>2.5</version>
    </dependency>
    <dependency>
    	<groupId>commons-fileupload</groupId>
    	<artifactId>commons-fileupload</artifactId>
    	<version>1.3.2</version>
    </dependency>
    
  2. 添加上传限制

    <!-- upload -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    	<property name="maxUploadSize">
    		<!-- 上传文件的大小 10M -->
    		<value>10485760</value>
    	</property>
    </bean>
    
  3. 添加上传逻辑

    • 上传的表单必须为post请求,并且设置enctype=“multipart/form-data”

    • 在controller 方法里面添加类型
      以下是重要代码

      file.getOriginalFilename();//文件名称
      request.getServletContext().getRealPath("/");//项目路径
      request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();//项目URL
      

spring mvc 拦截器

  1. 声明一个类,并且实现HandlerInterceptor

  2. 配置拦截器,在spring mvc的配置文件加上

    <mvc:interceptors>  
       <!--  使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求   -->
    	<!-- <bean class="xxxx"/> -->   
    	<mvc:interceptor>  
    		<!-- 进行拦截:/**表示拦截所有controller -->
    		<!-- 进行拦截:/*是会分层级的 -->
    		<mvc:mapping path="/**" />
    	   <!-- 不进行拦截 -->
    		<mvc:exclude-mapping path="/index.html"/>
    		<bean class="xxxx"/>  
    	</mvc:interceptor>  
    </mvc:interceptors>   
    

spring mvc 全局异常

  1. 声明一个类,并且实现HandlerExceptionResolver
  2. 把这个类放到spring 容器里面

spring mvc 返回json

  1. 添加项目依赖

    <dependency>
    	<groupId>com.fasterxml.jackson.core</groupId>
    	<artifactId>jackson-databind</artifactId>
    	<version>2.8.6</version>
    </dependency>
    <dependency>
    	<groupId>commons-beanutils</groupId>
    	<artifactId>commons-beanutils</artifactId>
    	<version>1.9.2</version>
    </dependency>
    <dependency>
    	<groupId>org.codehaus.jackson</groupId>
    	<artifactId>jackson-mapper-asl</artifactId>
    	<version>1.9.13</version>
    </dependency>
    <dependency>
    	<groupId>org.codehaus.jackson</groupId>
    	<artifactId>jackson-core-asl</artifactId>
    	<version>1.9.13</version>
    </dependency>
    
    
  2. 在方法上添加@ResponseBody

spring mvc 处理流程

​ 1.用户发送请求至 前端控制器DispatcherServlet。
​ 2.前端控制器DispatcherServlet收到请求后调用处理器映射器HandlerMapping。
​ 3.处理器映射器HandlerMapping根据请求的Url找到具体的处理器,生成处理器对象Handler及处理器拦截器HandlerIntercepter(如果有则生成)一并返回给前端控制器DispatcherServlet。
​ 4.前端控制器DispatcherServlet通过处理器适配器HandlerAdapter调用处理器Controller。
​ 5.执行处理器(Controller,也叫后端控制器)
​ 6.处理器Controller执行完后返回ModelAnView。
​ 7.处理器映射器HandlerAdapter将处理器Controller执行返回的结果ModelAndView返回给前端控制器DispatcherServlet。
​ 8.前端控制器DispatcherServlet将ModelAnView传给视图解析器ViewResolver。
​ 9.视图解析器ViewResolver解析后返回具体的视图View。
​ 10.前端控制器DispatcherServlet对视图View进行渲染视图(即:将模型数据填充至视图中)
​ 11.前端控制器DispatcherServlet响应用户。

在之前的项目中:

pom添加依赖:

<!-- 上传组件 -->
<dependency>
	<groupId>commons-io</groupId>
	<artifactId>commons-io</artifactId>
	<version>2.5</version>
</dependency>
<dependency>
	<groupId>commons-fileupload</groupId>
	<artifactId>commons-fileupload</artifactId>
	<version>1.3.2</version>
</dependency>

bean配置中添加:

<!-- upload -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<property name="maxUploadSize">
		<!-- 上传文件的大小 10M -->
		<value>10485760</value>
	</property>
</bean>

uploadController:上传页面跳转回显

package com.liuxi.controller;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class UploadController {

	@RequestMapping("/toUpload")
	private String toUpload() {

		return "upload";

	}

	@RequestMapping("upload")
	private String upload(@RequestParam(required = true) MultipartFile file, HttpServletRequest request, ModelMap map)
			throws IOException {

		String filename = file.getOriginalFilename();// 获取文件名
		String path = request.getServletContext().getRealPath("/");// 项目路径
		String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
				+ request.getContextPath();// 项目url

		String filename2 = uploadFile(file, filename, path, url);
		map.put("imgURL", filename2);

		return "upload";
	}

	private String uploadFile(MultipartFile file, String filename, String path, String url)
			throws IOException, FileNotFoundException {
		System.out.println(url);

		System.out.println(filename);
		System.out.println(path);

		// 上传到文件夹
		path += "/upload/";
		File file2 = new File(path);
		if (!file2.exists()) {
			file2.mkdirs();
		}

		// 随机生成文件名,使用时间戳
		String hz = filename.substring(filename.lastIndexOf("."));

		String filename2 = new Date().getTime() + hz;

		// 上传文件,写io流
		InputStream inputStream = file.getInputStream();

		OutputStream outputStream = new FileOutputStream(path + filename2);

//		byte[] bs = new byte[1024];
//
//		int i = -1;
//		while ((i = inputStream.read(bs)) != -1) {
//			outputStream.write(bs, 0, i);
//		}
//		outputStream.flush();
//		outputStream.close();
//		inputStream.close();
//

		FileCopyUtils.copy(inputStream, outputStream);
		return "/upload/" + filename2;
	}
}

上传页面:

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
	我是上传页面
	<br>
	<form action="${pageContext.request.contextPath}/upload.do"
		method="post" enctype="multipart/form-data">
		文件:<input type="file" name="file"> <input type="submit">

		<img src="${pageContext.request.contextPath}${imgURL}" alt="上海鲜花港 - 郁金香" />
	</form>
</body>
</html>

拦截器:

实现拦截器类:

package com.liuxi.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class FirstInterceptor implements HandlerInterceptor {

	// 前
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("preHandle");
		response.sendRedirect(request.getContextPath() + "/ toLogin.do");
		return false;
	}

	// 请求
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("postHandle");

	}

	// 后
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("afterCompletion");

	}

}

配置拦截器,在spring mvc的配置文件加上:

	<mvc:interceptors>
		<!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
		<!-- <bean class="xxxx"/> -->
		<mvc:interceptor>
			<!-- 进行拦截:/**表示拦截所有controller -->
			<!-- 进行拦截:/*是会分层级的 -->
			<mvc:mapping path="/**" />
			<!-- 不进行拦截 -->
			<mvc:exclude-mapping path="/toLogin.do" />
			<bean class="com.liuxi.interceptor.FirstInterceptor" />
		</mvc:interceptor>
	</mvc:interceptors>

全局异常:

logincontroller:

package com.liuxi.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class LoginController {

	@RequestMapping("toLogin")
	private String toLogin() {
		int i = 1 / 0;
		return "login";
	}
}

方法一:

package com.liuxi.resolver;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

@Component
public class FirstResolver implements HandlerExceptionResolver {

	@Override
	public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
			Exception ex) {
		ModelAndView modelAndView = new ModelAndView("error");
		return modelAndView;
	}

}

全局异常2:

package com.liuxi.resolver;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice /// 原本@ExceptionHandler只是当前controller的异常处理类,只要在类型上加上@controllerAdvice,就会变成全局异常处理类。
public class SecondResolver {

	@ExceptionHandler
	private String aaa(Exception exception) {// 添加上@ExceptionHandler之后就是一个全局异常处理方法
		exception.printStackTrace();// 直接输出异常到控制台
		return "error";// 和controller 一样,因为视图解析器在这个地方一样生效
	}
}

返回json:

添加项目依赖:

		<!-- json -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.8.6</version>
		</dependency>
		<dependency>
			<groupId>commons-beanutils</groupId>
			<artifactId>commons-beanutils</artifactId>
			<version>1.9.2</version>
		</dependency>
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
			<version>1.9.13</version>
		</dependency>
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-core-asl</artifactId>
			<version>1.9.13</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.71</version>
		</dependency>


jsonController:

package com.liuxi.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSON;

@Controller
public class JsonController {

	@RequestMapping("toJsonReturn")
	private String toJsonReturn() {
		return "json";// 因为配置视图解析器,直接返回字符串,请求就会跳转到对应的页面
	}

	@RequestMapping("jsonReturn")
	@ResponseBody // 返回的数据,转成字符串返回,添加上了@ResponseBody.视图解析器就不再生效了。
	private String jsonReturn() {

		Map map = new HashMap();
		map.put("key", "value");
		return JSON.toJSONString(map);
	}

	@RequestMapping("jsonReturnMap")
	@ResponseBody
	private Map jsonReturnMap() {

		Map map = new HashMap();
		map.put("key", "value");
		return map;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值