spring mvc上传
- 添加项目依赖
<!-- 上传组件 -->
<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>
- 添加上传限制
<!-- upload -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<!-- 上传文件的大小 10M -->
<value>10485760</value>
</property>
</bean>
- 添加上传逻辑
- 上传的表单必须为post请求,并且设置enctype=“multipart/form-data”
- 在controller 方法里面添加类型
以下是重要代码
file.getOriginalFilename();//文件名称
request.getServletContext().getRealPath("/");//项目路径
request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();//项目URL
spring mvc 拦截器
- 声明一个类,并且实现HandlerInterceptor
- 配置拦截器,在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 全局异常
- 声明一个类,并且实现HandlerExceptionResolver
- 把这个类放到spring 容器里面
spring mvc 返回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>
- 在方法上添加@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;
}
}