1.  文件上传

SpringMVC 的文件上传非常简便,首先导入文件上传依赖的 jar:

 <!-- 文件上传所依赖的 jar 包 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>

在 springMVC-servlet.xml 配置文件中配置文件解析器:

 <!--1*1024*1024 即 1M resolveLazily 属性启用是为了推迟文件解析,以便捕获文件大小异常
-->
<!--文件上传解析器-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1048576"/>
<property name="defaultEncoding" value="UTF-8"/>
<property name="resolveLazily" value="true"/>
</bean>

注意解析器的 id 必须等于 multipartResolver,否则上传会出现异常:

1.1  单个文件上传

 @Controller
public class FileController {
/**
* 上传单个文件操作
* MultipartFile file 就是上传的文件
* @return
*/
@RequestMapping(value = "/upload1.html")
public String fileUpload1(@RequestParam("file") MultipartFile file) {
try {
//将上传的文件存在 E:/upload/下
FileUtils.copyInputStreamToFile(file.getInputStream(),
new File("E:/upload/",
file.getOriginalFilename()));
} catch (Exception e) {
e.printStackTrace();
}
//上传成功返回原来页面
return "/file.jsp";
}
}上传文件时,Controller 的方法中参数类型是 MultipartFile 即可将文件映射到参数上。

页面file.jsp:

 <form method="post" action="/upload1.html" enctype="multipart/form-data">
<input type="file" name="file"/>
<button type="submit" >提交</button>
</form>

另外上传的文件还可以映射成 CommonsMultipartFile,它是 MultipartFile 的子类:

 /**
* CommonsMultipartFile 是 MultipartFile 的子类
* @return
*/
@RequestMapping("/upload2.html")
public String fileUpload2(@RequestParam("file") CommonsMultipartFile file) {
try {
System. out .println("fileName:" + file.getOriginalFilename());
String path = "E:/upload/" + file.getOriginalFilename();
File newFile = new File(path);
//通过 CommonsMultipartFile 的方法直接写文件
file.transferTo(newFile);
} catch (Exception e) {
e.printStackTrace();
}
return "/file.jsp";
}

页面:

 <form method="post" action="/upload2.html" enctype="multipart/form-data">
<input type="file" name="file"/>
<button type="submit" >提交</button>
</form>

1.2  批量上传

 /**
* 批量上传的时候参数是数组
* @return
*/
@RequestMapping("/upload3.html")
public String fileUpload3(@RequestParam("file") CommonsMultipartFile[] file) {
try {
//批量上传时遍历文件数组
for (CommonsMultipartFile f : file) {
System. out .println("fileName:" + f.getOriginalFilename());
String path = "E:/upload/" + f.getOriginalFilename();
File newFile = new File(path);
f.transferTo(newFile);
}
} catch (Exception e) {
e.printStackTrace();
}
return "/file.jsp";
}

页面:

 <form method="post" action="/upload3.html" enctype="multipart/form-data">
<!--注意 name 都是 file,与 Controller 中方法的参数名对应-->
<input type="file" name="file"/>
<input type="file" name="file"/>
<input type="file" name="file"/>
<button type="submit" >提交</button>
</form>

2.  使用拦截器

模拟登陆拦截器:

 public class  LoginInterceptor  extends HandlerInterceptorAdapter { {
@Override
public bo olean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception { {
System. out .println(" " 开始拦截" ");
// 其他情况判断 n session 中是否有 key ,有的话继续用户的操作
if ( request. getSession(). getAttribute( "user") != null) { {
return true;
} }
// 最后的情况就是进入登录页面
response. sendRedirect( request. getContextPath() + "/login.jsp");
return false;
} }
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception { {
System. out .println(" " 视图解析前 postHandle");
} }
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception { {
System. out .println(" " 处理异步请求" ");
} }
} }

配置拦截器:

 <mvc:interceptors>
<mvc:interceptor><!--配置局部拦截器,需要满足下列路径条件-->
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/login.html" />
<bean class="interceptor.LoginInterceptor"/><!--自定义拦截器注册-->
</mvc:interceptor>
</mvc:interceptors>

登陆的 Controller

 @Controller
public class LoginController { {
@RequestMapping( "login.html")
public String login( String username, HttpServletRequest request){ {
// 模拟登陆
request. getSession(). setAttribute( "user", username);
return "redirect:index.html";
} }
} }

登陆页面:

 <form action="/login.html">
<input name="username"/><input type="submit">
</form>

3.  异常处理

3.1  集成异常处理

对 于 一 些 通用 的 ,不 需 要特 殊 处 理的 异 常,可 以 使 用统 一 的 异常 处 理器 , 在springMVC-servlet.xml 中加入配置:

 <!--集成异常处理-->
<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定义默认的异常处理页面-->
<property name="defaultErrorView" value="error.jsp"></property>
<!-- 定义异常处理页面用来获取异常信息的变量名,默认名为 exception -->
<property name="exceptionAttribute" value="ex"></property>
<!-- 定义需要特殊处理的异常,用类名或完全路径名作为 key,异常也页名作为值 -->
<property name="exceptionMappings">
<props>
<prop key="java.lang.NullPointerException">error.jsp</prop>
<prop key="java.lang.ClassCastException">error.jsp</prop>
<prop key="java.lang.IndexOutOfBoundsException">error.jsp</prop>
<!-- 这里还可以继续扩展对不同异常类型的处理 -->
</props>
</property>
</bean>

我们写一个 controller 专门抛出异常,用来模拟程序中可能出现的异常信息:

 @Controller
public class ExceptionController {
@RequestMapping("/ex.html")
public String exceptionTest(Integer type) throws Exception {
//手动抛出几个异常,模拟程序中可能出现的异常
switch (type) {
case 1:
throw new NullPointerException("测试空指针异常");
case 2:
throw new ClassCastException("测试类型转换异常");
case 3:
throw new IndexOutOfBoundsException("测试越界异常");
}
return "index.jsp";
}
}

测试页面:

 <body>
<a href="/ex.html?type=1">空指针</a><br/>
<a href="/ex.html?type=2">类型转换</a><br/>
<a href="/ex.html?type=3">越界</a><br/>
${ex}<!--就是 spring 异常处理器中配置的 exceptionAttribute-->
</body>

运行结果:

点击不同的链接可以看大不同的提示信息。

3.2  自定义异常处理

对于需要特殊处理的异常,可以自定义异常处理器自定义异常处理的类需要继承 HandlerExceptionResolver

 public class  MyExceptionHandler  implements HandlerExceptionResolver { {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o o, Exception e e) { {
String msg = e e.getMessage();
httpServletRequest. setAttribute( "ex", msg);
return new ModelAndView( "/error.jsp");
} }
} }

在 spring 配置文件中定义 bean:

 <!--自定义异常处理-->
<bean id="exceptionHandler" class="exception.MyExceptionHandler"/>

注:自定义异常处理和前面的集成异常处理不能一起使用,需要将 前面例子的 bean 注释掉。如果需要处理 ajax 发送的请求,出现异常时返回 json 数据,可以增加处理 json 的代码。
修改 MyExceptionHandler 中的代码:

 public class MyExceptionHandler implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, Exception e) {
String msg = e.getMessage();
if (httpServletResponse.isCommitted()) {
return null;
}
//如果是 ajax 请求就返回 json 数据
if (isAjax(httpServletRequest)) {
Map<String, String> result = new HashMap<>();
result.put("ex", msg);
MappingJackson2JsonView view = new MappingJackson2JsonView();
return new ModelAndView(view, "result", result);
} else {//不是 ajax 就返回错误页面
httpServletRequest.setAttribute("ex", msg);
return new ModelAndView("/error.jsp");
}
}
public static boolean isAjax(HttpServletRequest request) {
return
"XMLHttpRequest".equalsIgnoreCase(request.getHeader("X-Requested-With")) ||
request.getParameter("ajax") != null;
}
}

测试页面:

 <script type="text/javascript" src="jquery-1.10.1.min.js"></script>
<input type="button" onclick=" testEx ()" value="测试自定义异常"/>
<script type="text/javascript">
function testEx (){
$.ajax({
type: "POST",
url: "/ex.html?type=1",
success: function(data){
alert(data.result.ex);//读取 json 数据
}
});
}
</script>

测试结果:

springMVC整理04--文件上传 & 拦截器 & 异常处理的更多相关文章

  1. SpringMVC 文件上传&拦截器&异常处理

    文件上传 Spring MVC 为文件上传提供了直接的支持,这种支持是通过即插即用的 MultipartResolver 实现的.Spring 用 Jakarta Commons FileUpload ...

  2. struts文件上传拦截器分析

    struts有默认的文件拦截器,一般配置maximumSize就可以了. 知道原理,我们可以写一个类继承它,实现自己的配置上传文件大小的方式.   然后细究页面上传文件的时候,发现了一些问题. act ...

  3. struts文件上传拦截器中参数的配置(maximumSize,allowedTypes ,allowedExtensions)问题

    <interceptor-ref name="fileUpload"> <param name="allowedTypes">image ...

  4. struts文件上传拦截器maximumSize设置文件大小不起作用

    <interceptor-ref name="fileUpload">                <param name="allowedTypes ...

  5. SpringMVC的文件上传下载,异常处理,拦截器的小总结

    文件的上传和下载 我们通常在访问网页时会使用到文件的上传与下载的功能,那么他是如何实现的呢? 1 下载: ResponseEntity :用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览 ...

  6. (转)SpringMVC学习(九)——SpringMVC中实现文件上传

    http://blog.csdn.net/yerenyuan_pku/article/details/72511975 这一篇博文主要来总结下SpringMVC中实现文件上传的步骤.但这里我只讲单个文 ...

  7. 使用SpringMVC框架实现文件上传和下载功能

    使用SpringMVC框架实现文件上传和下载功能 (一)单个文件上传 ①配置文件上传解释器 <!—配置文件上传解释器 --> <mvc:annotation-driven>&l ...

  8. 转:【专题十一】实现一个基于FTP协议的程序——文件上传下载器

    引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...

  9. SpringMVC简单的文件上传

    引入依赖包: <!-- 文件上传的依赖 --> <dependency> <groupId>commons-fileupload</groupId> & ...

随机推荐

  1. lambda函数

    1.lambda函数是语法简短的匿名函数 2.lambda函数可以接受一个或多个参数 3.lambda函数只能有一个表达式 4.一般用于非重用的代码块 1)g = lambda x : x**2 g( ...

  2. Randomized Online PCA Algorithms with Regret Bounds that are Logarithmic in the Dimension

    目录 Setup of Batch PCA and Online PCA Hedge Algorithm 改进算法 用于矩阵 \(rounding()\) 前俩次,都用到了\(rounding()\) ...

  3. MyEclipse和eclipse的区别

    对于新手来说,MyEclipse和eclipse来说的区别可能就是MyEclipse比eclipse多了my,MyEclipse主要为JavaEE开发,而Eclipse主要为Java开发..那么MyE ...

  4. github导入文件操作

    建立本地仓库: 创建新仓库的指令: git init //把这个目录变成Git可以管理的仓库 git add README.md //文件添加到仓库 git add . //不但可以跟单一文件,还可以 ...

  5. net core 小坑杂记之配置文件读取(不定期更新)

    其实很早就想写了,原想等积累差不多了再写的,但是发现遇到一个当时记下效果会比较好,所以就不定期更新这个系列了,后面获取会整个整理一下. 此篇记载net core入门时踩的一些坑,网上教程太少了,也不规 ...

  6. Python_列表初识及操作

    列表 列表初识 列表属于容器性数据类型. li = [123, '狗', True, [1, 2, 3], {'name': 'Lon'}, (1, 2, 3)] 其中包含有int型,例如123:字符 ...

  7. mysql cpu 100% 满 优化方案

    解决MySQL CPU占用100%的经验总结 - karl_han的专栏 - CSDN博客 https://blog.csdn.net/karl_han/article/details/5630782 ...

  8. Drools 规则引擎

    Drools - Drools - Business Rules Management System (Java™, Open Source) http://drools.org/ [Drools]J ...

  9. tomcat启动参数

    /usr/java/jdk1..0_191-amd64/bin/java -Djava.util.logging.config./conf/logging.properties -Djava.util ...

  10. XManager&XShell如何保存登录用户和登录密码

    Xshell配置ssh免密码登录 - qingfeng2556的博客 - CSDN博客https://blog.csdn.net/wuhenzhangxing/article/details/7948 ...