IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringMVC(三) -> 正文阅读

[Java知识库]SpringMVC(三)

一、SpringMVC实现文件上传

1. 文件上传的回顾

  1. 导入文件上传的jar包
<dependency> 
	<groupId>commons-fileupload</groupId> 
	<artifactId>commons-fileupload</artifactId> 
	<version>1.3.1</version> 
</dependency> 
<dependency> 
	<groupId>commons-io</groupId> 
	<artifactId>commons-io</artifactId> 
	<version>2.4</version> 
</dependency>
  1. 编写文件上传的JSP页面
<h3>文件上传</h3> 
<form action="user/fileupload" method="post" enctype="multipart/form-data"> 
	选择文件:<input type="file" name="upload"/><br/> 
	<input type="submit" value="上传文件"/> 
</form>
  1. 编写文件上传的Controller控制器
/**
* 文件上传 
* @throws Exception 
*/ 
@RequestMapping(value="/fileupload") 
public String fileupload(HttpServletRequest request) throws Exception { 
	// 先获取到要上传的文件目录 
	String path = request.getSession().getServletContext().getRealPath("/uploads"); 
	// 创建File对象,一会向该路径下上传文件 
	File file = new File(path); 
	// 判断路径是否存在,如果不存在,创建该路径 
	if(!file.exists()) { 
		file.mkdirs(); 
	}
	// 创建磁盘文件项工厂 
	DiskFileItemFactory factory = new DiskFileItemFactory(); 
	ServletFileUpload fileUpload = new ServletFileUpload(factory); 
	// 解析request对象 
	List<FileItem> list = fileUpload.parseRequest(request); 
	// 遍历 
	for (FileItem fileItem : list) { 
		// 判断文件项是普通字段,还是上传的文件 
		if(fileItem.isFormField()) {
		 
		}else { 
			// 上传文件项
			// 获取到上传文件的名称 
			String filename = fileItem.getName(); 
			// 上传文件 
			fileItem.write(new File(file, filename)); 
			// 删除临时文件 
			fileItem.delete(); 
		} 
	}
	return "success"; 
}

2. SpringMVC传统方式文件上传

  1. SpringMVC框架提供了MultipartFile对象,该对象表示上传的文件,要求变量名称必须和表单file标签的name属性名称相同。
  2. 代码如下
/**
* SpringMVC方式的文件上传 
*
* @param request 
* @return 
* @throws Exception 
*/ 
@RequestMapping(value="/fileupload2") 
public String fileupload2(HttpServletRequest request,MultipartFile upload) throws Exception { 
	System.out.println("SpringMVC方式的文件上传..."); 
	// 先获取到要上传的文件目录 
	String path = request.getSession().getServletContext().getRealPath("/uploads"); 
	// 创建File对象,一会向该路径下上传文件 
	File file = new File(path); 
	// 判断路径是否存在,如果不存在,创建该路径 
	if(!file.exists()) { 
		file.mkdirs(); 
	}
	// 获取到上传文件的名称 
	String filename = upload.getOriginalFilename(); 
	String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase(); 
	// 把文件的名称唯一化 
	filename = uuid+"_"+filename; 
	// 上传文件 
	upload.transferTo(new File(file,filename)); 
	return "success"; 
}
  1. 配置文件解析器对象
<!-- 配置文件解析器对象,要求id名称必须是multipartResolver --> 
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
	<property name="maxUploadSize" value="10485760"/> 
</bean>

3. SpringMVC跨服务器方式文件上传

  1. 搭建图片服务器
    1. 根据文档配置tomcat9的服务器,现在是2个服务器
    2. 导入资料中day02_springmvc5_02image项目,作为图片服务器使用
  2. 实现SpringMVC跨服务器方式文件上传
    1. 导入开发需要的jar包
<dependency> 
	<groupId>com.sun.jersey</groupId> 
	<artifactId>jersey-core</artifactId> 
	<version>1.18.1</version> 
</dependency> 
<dependency> 
	<groupId>com.sun.jersey</groupId> 
	<artifactId>jersey-client</artifactId> 
	<version>1.18.1</version> 
</dependency>
2. 编写文件上传的JSP页面
<h3>跨服务器的文件上传</h3> 
<form action="user/fileupload3" method="post" enctype="multipart/form-data"> 
	选择文件:<input type="file" name="upload"/><br/> 
	<input type="submit" value="上传文件"/> 
</form>
  1. 编写控制器
/**
* SpringMVC跨服务器方式的文件上传 
*
* @param request 
* @return 
* @throws Exception 
*/ 
@RequestMapping(value="/fileupload3")
public String fileupload3(MultipartFile upload) throws Exception { 
	System.out.println("SpringMVC跨服务器方式的文件上传..."); 
	// 定义图片服务器的请求路径 
	String path = "http://localhost:9090/day02_springmvc5_02image/uploads/"; 
	// 获取到上传文件的名称 
	String filename = upload.getOriginalFilename(); String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase(); 
	// 把文件的名称唯一化 
	filename = uuid+"_"+filename; 
	// 向图片服务器上传文件 
	// 创建客户端对象 
	Client client = Client.create(); 
	// 连接图片服务器 
	WebResource webResource = client.resource(path+filename); 
	// 上传文件 
	webResource.put(upload.getBytes()); 
	return "success"; 
}

二、SpringMVC的异常处理

1. 异常处理思路

  1. Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进
    行异常的处理。

2. SpringMVC的异常处理

  1. 自定义异常处理器
package cn.itcast.exception; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.web.servlet.HandlerExceptionResolver; 
import org.springframework.web.servlet.ModelAndView; 
/**
* 异常处理器 
* @author rt 
*/ 
public class SysExceptionResolver implements HandlerExceptionResolver{ 
	/**
	* 跳转到具体的错误页面的方法 
	*/ 
	public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { 
		ex.printStackTrace(); 
		SysException e = null; 
		// 获取到异常对象 
		if(ex instanceof SysException) { 
			e = (SysException) ex; 
		}else { 
			e = new SysException("请联系管理员"); 
		}
		ModelAndView mv = new ModelAndView(); 
		// 存入错误的提示信息 
		mv.addObject("message", e.getMessage()); 
		// 跳转的Jsp页面 
		mv.setViewName("error"); 
		return mv; 
	} 
}
  1. 自定义异常处理器
package cn.itcast.exception; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.web.servlet.HandlerExceptionResolver; 
import org.springframework.web.servlet.ModelAndView; 
/**
* 异常处理器 
* @author rt 
*/ 
public class SysExceptionResolver implements HandlerExceptionResolver{ 
	/**
	* 跳转到具体的错误页面的方法 
	*/ 
	public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { 
		ex.printStackTrace(); 
		SysException e = null; 
		// 获取到异常对象 
		if(ex instanceof SysException) { 
			e = (SysException) ex; 
		}else { 
			e = new SysException("请联系管理员"); 
		}
		ModelAndView mv = new ModelAndView(); 
		// 存入错误的提示信息 
		mv.addObject("message", e.getMessage()); 
		// 跳转的Jsp页面 
		mv.setViewName("error"); 
		return mv; 
	} 
}
  1. 配置异常处理器
<!-- 配置异常处理器 --> 
<bean id="sysExceptionResolver" class="cn.itcast.exception.SysExceptionResolver"/>

三、SpringMVC框架中的拦截器

1. 拦截器的概述

  1. SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。
  2. 可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链
    中的拦截器会按着定义的顺序执行。
  3. 拦截器和过滤器的功能比较类似,有区别
    1. 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。
    2. 拦截器是SpringMVC框架独有的。
    3. 过滤器配置了/*,可以拦截任何资源。
    4. 拦截器只会对控制器中的方法进行拦截。
  4. 拦截器也是AOP思想的一种实现方式
  5. 想要自定义拦截器,需要实现HandlerInterceptor接口。

2. 自定义拦截器步骤

  1. 创建类,实现HandlerInterceptor接口,重写需要的方法
package cn.itcast.demo1; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.web.servlet.HandlerInterceptor; 
/**
* 自定义拦截器1 
* @author rt 
*/ 
public class MyInterceptor1 implements HandlerInterceptor{ 
	/**
	* controller方法执行前,进行拦截的方法 
	* return true放行 
	* return false拦截 
	* 可以使用转发或者重定向直接跳转到指定的页面。 
	*/ 
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
		System.out.println("拦截器执行了..."); 
		return true; 
	} 
}
  1. 在springmvc.xml中配置拦截器类
<!-- 配置拦截器 --> 
<mvc:interceptors> 
	<mvc:interceptor> 
		<!-- 哪些方法进行拦截 --> 
		<mvc:mapping path="/user/*"/> 
		<!-- 哪些方法不进行拦截 
		<mvc:exclude-mapping path=""/> 
		--> 
		<!-- 注册拦截器对象 --> 
		<bean class="cn.itcast.demo1.MyInterceptor1"/> 
	</mvc:interceptor> 
</mvc:interceptors>

3. HandlerInterceptor接口中的方法

  1. preHandle方法是controller方法执行前拦截的方法
    1. 可以使用request或者response跳转到指定的页面
    2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
    3. return false不放行,不会执行controller中的方法。
  2. postHandle是controller方法执行后执行的方法,在JSP视图执行前。
    1. 可以使用request或者response跳转到指定的页面
    2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
  3. postHandle方法是在JSP执行后执行
    1. request或者response不能再跳转页面了

4. 配置多个拦截器

  1. 再编写一个拦截器的类
  2. 配置2个拦截器
<!-- 配置拦截器 --> 
<mvc:interceptors> 
	<mvc:interceptor> 
		<!-- 哪些方法进行拦截 --> 
		<mvc:mapping path="/user/*"/> 
		<!-- 哪些方法不进行拦截 
		<mvc:exclude-mapping path=""/> 
		-->
		<!-- 注册拦截器对象 --> 
		<bean class="cn.itcast.demo1.MyInterceptor1"/> 
	</mvc:interceptor> 
	<mvc:interceptor> 
		<!-- 哪些方法进行拦截 --> 
		<mvc:mapping path="/**"/> 
		<!-- 注册拦截器对象 --> 
		<bean class="cn.itcast.demo1.MyInterceptor2"/> 
	</mvc:interceptor> 
</mvc:interceptors>
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 08:57:09  更:2021-08-29 08:57:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:54:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码