Web常用对象2

一.本次笔记小目标

掌握Cookie的使用,理解常用对象的作用和意义
       掌握域对象的设置与获取
      理解文件上传的步骤
    握文件下载

二.Cookie

1. Cookie 的创建和发送

通过 new Cookie(“key”,”value”);来创建一个 Cookie 对象,要想将 Cookie 随响应发送到客户端,需要先添加到 response 对象中, resp.addCookie(cookie);此时该 cookie 对象则随着响应发送至了客户端。在浏览器上可以看见。

如果服务器端发送重复的 Cookie 那么会覆盖原有的 Cookie。
 


       

package com.shsxt.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Cookie的创建和发送
 * @author Lisa Li
 *
 */
@SuppressWarnings("serial")
public class Cookie01 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		// 创建Cookie对象
		Cookie cookie = new Cookie("user", "shsxt-123456");
		// 发送给客户端
		resp.addCookie(cookie);
		
		// 创建Cookie对象
		Cookie cookie1 = new Cookie("A", "a");
		// 发送给客户端
		resp.addCookie(cookie1);
		
		// 如果cookie的name值一眼,后面的cookie对象会将前面的cookie对象覆盖
		
		// 创建Cookie对象
		Cookie cookie2 = new Cookie("A", "aa");
		// 发送给客户端
		resp.addCookie(cookie2);
	
	}
}

2. Cookie 的获取

在服务器端只提供了一个 getCookies()的方法用来获取客户端回传的所有cookie 组成的一个数组,如果需要获取单个 cookie 则需要通过遍历 getName()获取 Cookie 的名称, getValue()获取 Cookie 的值。

package com.shsxt.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Cookie的获取
 * @author Lisa Li
 *
 */
@SuppressWarnings("serial")
public class Cookie02 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		// 获取cookie数组
		Cookie[] cookies = req.getCookies();
		// 判断数组否是否为空
		if (cookies != null &&cookies.length >0) {
			// 遍历数组
			for (Cookie cookie : cookies) {
				// 判断是否是指定的cookie
				if ("user".equals(cookie.getName())) {
					// 得到cookie对应的value
					System.out.println(cookie.getValue());
				}
			}
		}
	
	}
}

3. Cookie 到期时间的设定

到期时间用来指定该 cookie 何时失效。默认为当前浏览器关闭即失效。我们可以手动设定 cookie 的有效时间(通过到期时间计算),通过 setMaxAge(inttime);方法设定 cookie 的最大有效时间,以秒为单位。

a.负整数:

cookie 的 maxAge 属性的默认值就是-1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么 cookie 就会消失。

b.正整数:

表示 cookie 对象可存活指定的秒数。当生命大于 0 时,浏览器会把 Cookie 保存到硬盘上,就算关闭浏览器,就算重启客户端电脑, cookie 也会存活相应的时间。

c.零:

cookie 生命等于 0 是一个特殊的值,它表示 cookie 被作废!也就是说,如果原来浏览器已经保存了这个 Cookie,那么可以通过 Cookie 的setMaxAge(0)来删除这个 Cookie。 无论是在浏览器内存中,还是在客户端硬盘上都会删除这个 Cookie。

package com.shsxt.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Cookie的过期时间的设定
 * @author Lisa Li
 *
 */
@SuppressWarnings("serial")
public class Cookie03 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		// 创建Cookie对象
		Cookie cookie = new Cookie("B", "bb");
		// 设定cookie的失效时间
		/*
		 * maxAge的取值:单位秒
		 * 	负整数:代表关闭浏览器cookie失效,默认值
		 *  正整数:代表cookie在浏览器中存活指定秒数
		 *  0:代表删除cookie,即刻删除
		 */
		// cookie.setMaxAge(-1);
		// cookie.setMaxAge(30);
		// cookie.setMaxAge(0);
		// 设置3天失效
		cookie.setMaxAge(3 * 24 * 60 * 60);
		// 响应给浏览器
		resp.addCookie(cookie);
		
		Cookie cookie2 = new Cookie("A", null);
		cookie2.setMaxAge(0); // 删除cookie
		resp.addCookie(cookie2);
		
	}
}

4. Cookie 的注意

a.在一般的站点中常常有记住用户名这样一个操作,该操作只是将信息保存在本机上,换电脑以后这些信息就无效了。而且 cookie 还不能跨浏览器。

b.Cookie 中不能出现中文,如果有中文则通过 URLEncoder.encode()来进行编码,获取时通过 URLDecoder.decode()来进行解码。
 

package com.shsxt.web;

import java.io.IOException;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Cookie的注意
 * 	1、Cookie不能跨浏览器(不跨电脑)
 * 	2、Cookie不能储存中文
 * 		如果一定要存中文,需要编码
 * 		如果直接存中文
 * 			java.lang.IllegalArgumentException: Cookie name "姓名" is a reserved token
 *	3、Cookie的覆盖
 *		如果服务器端发送name属性值相同的 Cookie 那么会覆盖原有的 Cookie。
 *		除了value和maxAge的值被改变的情况下回覆盖,其他的(path、domain)都会重新创建一个cookie对象,
 * @author Lisa Li
 *
 */
@SuppressWarnings("serial")
public class Cookie04 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		// 定义name和value
		String name = "姓名";
		String value = "张三";
		
		// 将中文编码
		name = URLEncoder.encode(name, "UTF-8");
		value = URLEncoder.encode(value, "UTF-8");
		
		// 创建Cookie对象
		Cookie cookie = new Cookie(name, value);
		// 响应给浏览器
		resp.addCookie(cookie);
	}
}

5. Cookie 的路径

a.在 Servlet 中保存的 Cookie 如果没有设置 path,那么它的 path 默认为当前 Servlet 的所在路径;
       b.当访问的路径包含了 cookie 的路径时,则该请求将带上该 cookie;如果访问路径不包含 cookie 路径,则该请求不会携带该 cookie;

三.Session

1.前奏

HttpSession 对象是 javax.servlet.http.HttpSession 的实例,该接口并不像HttpServletRequest 或 HttpServletResponse 还存在一个父接口,该接口只是一个纯粹的接口。 这因为 session 本身就属于 HTTP 协议的范畴。在整个 session 中,最重要的就是属性的操作。

2. Session 的作用

Session 的作用就是为了标识一次会话,或者说确认一个用户;并且在一次会话(一个用户的多次请求)期间共享数据。我们可以通过 req.getSession()方法,来获取当前会话的 session 对象。

3. 标识会话 JSESSIONID

Session 既然是为了标识一次会话,那么此次会话就应该有一个唯一的标志,这个标志就是 sessionId。Session 的底层依赖 Cookie 来实现。
 

package com.shsxt.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@SuppressWarnings("serial")
public class Session01 extends HttpServlet {
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// 创建或获取session对象(当session对象不存在时,创建新的session对象;如果存在,获取该session对象)
		HttpSession session = req.getSession();
		
		// 获取session的标识符
		String sessionId = session.getId();
		System.out.println("获取sesion的标识符: " + sessionId);
		
		// 第一次访问的时间(创建时间)
		long createTime = session.getCreationTime();
		System.out.println("创建时间: " + createTime);
		
		// 最后访问的时间
		long lastTime = session.getLastAccessedTime();
		System.out.println("最后访问的时间: " + lastTime);
		
		// 当前是否是新的session对象
		boolean flag = session.isNew();
		System.out.println("当前是否是新的session对象: " + flag);
				
		HttpSession session2 = req.getSession();
		
		// 获取session的标识符
		String sessionId2 = session2.getId();
		System.out.println("获取sesion的标识符2: " + sessionId2);
		
		// 第一次访问的时间(创建时间)
		long createTime2 = session2.getCreationTime();
		System.out.println("创建时间2: " + createTime2);
		
		// 最后访问的时间
		long lastTime2 = session2.getLastAccessedTime();
		System.out.println("最后访问的时间2: " + lastTime2);
		
		// 当前是否是新的session对象
		boolean flag2 = session2.isNew();
		System.out.println("当前是否是新的session对象2: " + flag2);
					
    }
}

4. 作为域对象

Session 用来表示一次会话,在一次会话中数据是可以共享的,这时 session作为域对象存在,可以通过 setAttribute(name,value);方法向域对象中添加数据,通过 getAttribute(name) 从域对象中获取数据,通过 removeAttribute(name)从域对象中移除数据。

package com.shsxt.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@SuppressWarnings("serial")
public class Session02 extends HttpServlet {
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// 存request作用域
		req.setAttribute("uname", "zhangsan");
		
		// 存session作用域
		HttpSession session = req.getSession();
		System.out.println(session.getId());
		session.setAttribute("name", "admin");
		
		// 请求转发  request作用域有效,session作用域有效
		// req.getRequestDispatcher("s03").forward(req, resp);
		
		// 重定向    request作用域失效,session作用域有效
		resp.sendRedirect("s03");
		
		
	}
}

5. Session 的销毁

a.默认时间到期

当客户端第一次请求 servlet 并且操作 session 时, session 对象生成,Tomcat 中 session 默认的存活时间为 30min,即你不操作界面的时间,一旦有操作, session 会重新计时。可以在 Tomcat 中的 web.xml 文件中进行修改。 如下图:

b.自己设定到期时间

当然除了以上的修改方式外,我们也可以在程序中自己设定 session 的生命周期,通过 session.setMaxInactiveInterval(int);来设定 session 的最大不活动时间,单位为秒。

c.立刻失效

或者我们也可以通过 session.invalidate();方法让 session 立刻失效

d.关闭浏览器

从前面的 JESSION 可知道, session 的底层依赖 cookie 实现,并且该 cookie的有效时间为关闭浏览器, 从而 session 在浏览器关闭时也相当于失效了(因为没有 JSESSIONID 再与之对应)。

e.关闭服务器

非正常关闭服务器时, session 销毁;当正常关闭服务器时, Session 将被序列化到磁盘上,在工作空间 work 目录下的 SESSION.ser 文件中,下次启动服务时,自动加载到内存。
 

package com.shsxt.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@SuppressWarnings("serial")
public class Session04 extends HttpServlet {
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// Session的销毁
		/**
		 * 1、达到最大沉默时间(达到服服务器默认的设置时间,默认30min,可以在Tomcat下的web.xml中修改session-timeout)
		 * 2、手动设置到期时间  session.setMaxInactiveInterval(int); 单位秒,允许最大的不活动时间
		 * 3、立即失效、销毁session   session.invalidate();
		 * 4、关闭浏览器   session 的底层依赖 cookie 实现,并且该 cookie的有效时间为关闭浏览器
		 * 5、当非正常关闭服务器时, session 销毁;当正常关闭服务器时, Session 将被序列化到磁盘上,在工作空间 work 目录下的 SESSION.ser 文件中,下次启动服务时,自动加载到内存。
		 */
		HttpSession session = req.getSession();
		System.out.println(session.getId());
		// 设置最大不活动时间为10秒
		session.setMaxInactiveInterval(100);
		// 销毁session对象
		// session.invalidate();
							
	}
}

四.ServletContext 对象

1. ServletContext 对象的获取

               a.获取 ServletContext 对象的途径有很多例如通过 request 对象可以

               b.通过 session 可以

               c.通过 servletConfig 可以,在 Servlet 标准中提供了获取 ServletConfig 的方法

              d.本身 Servlet 标准后期的实现类中也提供了直接获取 ServletContext 的方法(常用)

package com.shsxt.web;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class Servlet01  extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// 获取servletContext对象的四种方式
		
		// 通过request对象获取
		ServletContext servletContext = req.getServletContext();
		
		// 通过session对象获取
		ServletContext servletContext2 = req.getSession().getServletContext();
		
		// 通过servletConfig对象获取
		ServletContext servletContext3 = getServletConfig().getServletContext();
		
		// 直接得到
		ServletContext servletContext4 = getServletContext();
				
		// 获取服务器的版本
		String serverInfo = servletContext.getServerInfo();
		System.out.println("获取服务器的版本: " + serverInfo);
		
		// 获取资源在服务器上的真实路径
		String realPath = servletContext.getRealPath("/");
		System.out.println("获取资源在服务器上的真实路径: " + realPath);
				
	}
}

2. 作为域对象

ServletContext 也可当做域对象来使用,通过向 ServletContext 中存取数据,可以使得整个应用程序共享某些数据。当然不建议存放过多数据,因为ServletContext 中的数据一旦存储进去没有手动移除将会一直保存。

 Servlet02

package com.shsxt.web;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@SuppressWarnings("serial")
public class Servlet02 extends HttpServlet {
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// 存request作用域
		req.setAttribute("uname", "zhangsan");
		
		// 存session作用域
		HttpSession session = req.getSession();
		System.out.println(session.getId());
		session.setAttribute("name", "admin");
		
		
		// 存servletContext作用域
		ServletContext context = getServletContext();
		context.setAttribute("userName", "lisi");
		
		// 请求转发  request作用域有效,session作用域有效
		//req.getRequestDispatcher("s03").forward(req, resp);
		
		// 重定向    request作用域失效,session作用域有效
		resp.sendRedirect("s03");
				
	}
}

 Servlet03

package com.shsxt.web;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@SuppressWarnings("serial")
public class Servlet03 extends HttpServlet {
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// 获取request作用域中的值
		String uname = (String) req.getAttribute("uname");
		
		System.out.println("uname: " + uname);
		
		// 获取session作用域中的值
		HttpSession session = req.getSession();
		System.out.println("SessionID:" + session.getId());
		String name = (String) session.getAttribute("name");
		System.out.println("name: " + name);
		
		// 获取servletContext的作用域
		ServletContext servletContext = getServletContext();
		String userName = (String) servletContext.getAttribute("userName");
		System.out.println("userName:" + userName);
		
	}
}

五.文件上传下载

1. 文件上传

文件上传涉及到前台页面的编写和后台服务器端代码的编写,前台发送文件,后台接收 并保存文件,这才是一个完整的文件上传。

a.前台页面

在做文件上传的时候,会有一个上传文件的界面,首先我们需要一个表单,并且表单的 请求方式为 POST;其次我们的 form 表单的 enctype 必须设为 ”multipart/form-data” 即 enctype="multipart/form-data" 意 思 是 设 置 表 单 的MIME 编码。默认情况下这个编码格式 是 ”application/x-www-form-urlencoded”,不能用于文件上传;只有使用了 multipart/form-data 才能完整地传递文件数据。
 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
	<!-- 
		超链接下载
			能够被浏览器识别的资源,则直接显示
			不能被识别,则会被下载
			download属性
				指定超链接可以下载资源(无论资源是否能够被浏览器识别)
				默认下载的名称是文件名称,如需修改文件名,则设置download的属性值即可
	 -->
	<a href="service.jpg">图片</a><br>
	<a href="test.txt">TXT</a><br>
	<a href="test.exe">exe</a><br>
	
	<hr><br>
	<a href="service.jpg" download>图片下载</a><br>
	<a href="service.jpg" download="a.jpg">图片下载</a><br>
	
	<hr><br>
	
	<form action="download" method="post">
		文件名:<input type="text" name="fileName" />
		<input type="submit" value="下载"/>
	</form>
	
</body>
</html>

b.后台 commons-fileupload 的使用

首先需要导入第三方 jar 包, http://commons.apache.org/ 下 载commons-io 和 commons-fileupload 两个 jar 的资源。解压并导入到项目中。commons-fileupload.jar 是文件上传的核心包 commons-io.jar 是 filefupload 的依赖包,同时又是一个工具包。

步骤:

1、 创建一个 DiskFileItemFactory 工厂类,并制定临时文件和大小
        2、 创建 ServletFileUpload 核心类,接收临时文件,做请求的转换
        3、 通过 ServletFileUpload 类转换原始请求,得到 FileItem 集合
        4、 遍历集合中的各个元素并处理
        5、 判断每个元素是否是普通表单项,如果是则按照普通表单项处理
        6、 如果不是普通表单项,则是文件,通过处理的方式进行处理(上传)
 

package com.shsxt.web;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 文件下载
 */
public class DownloadServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/**
		 * 	Step1:
		 * 		需要通过 HttpServletResponse.setContentType 方法设置 Content-type头字段的值, 为浏览器无法使用某种方式或激活某个程序来处理的 MIME 类型,
				例 如 ”application/octet-stream” 或 ”application/x-msdownload” 等
			Step2:
				需要通过 HttpServletResponse.setHeader 方法设置Content-Disposition 头的值 为”attachment;filename=文件名 ”
			Step3: 
				读取下载文件,调用 HttpServletResponse.getOutputStream 方法返回的 OutputStream 对象来向客户端写入附件内容。
		 */
		
		// 设置请求的编码
		request.setCharacterEncoding("UTF-8");
		// 设置响应的编码
		response.setContentType("text/html;charset=UTF-8");
		
		
		
		// 得到参数,得到需要下载的文件名
		String fileName = request.getParameter("fileName");
		// 判断文件名是否为空
		if (fileName == null || fileName.length() < 1) {
			// 得到输出流
			PrintWriter out = response.getWriter();
			out.write("<h1>请输入要下载的文件名!</h1><h3><a href='download.html'>返回</a></h3>");
			out.close();
			return;
		}
		// 得到资源的真实路径
		String realPath = getServletContext().getRealPath("/upload/");
		// 得到被下载的文件的存放路径
		String filePath = realPath + fileName;
		// 通过路径得到file对象
		File file = new File(filePath);
		// 判断被下载的文件是否存在,并且是一个标准文件
		if (file.exists() && file.isFile()) {
			
			// 设置响应类型
			response.setContentType("application/x-msdownload");
			// 设置下载的弹出框信息
			response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
			
			// 得到输入流
			InputStream in = new FileInputStream(file);
			
			// 得到字节输出流
			ServletOutputStream out = response.getOutputStream();
			
			byte[] bytes = new byte[1024];
			
			int len = 0;
			
			while((len = in.read(bytes)) != -1) {
				out.write(bytes,0,len);
			}
			
			// 关闭流
			out.close();
			in.close();
			
		} else {
			// 得到输出流
			PrintWriter out = response.getWriter();
			out.write("<h1>文件不存在!</h1><h3><a href='download.html'>返回</a></h3>");
			out.close();
		}
				
	}

}

2. 文件下载

文件下载即将服务器上的资源下载(拷贝)到本地,我们可以通过两种方式下载。第一种是通过超链接本身的特性来下载;第二种是通过手动写出来下载

a.超链接下载

当我们在 HTML 或 JSP 页面中使用标签时,原意是希望能够进行跳转,但当超链接遇到浏览器不识别的动态网页时则会自动下载。

b.后台实现下载

Step1:

需要通过 HttpServletResponse.setContentType 方法设置 Content-type头字段的值, 为浏览器无法使用某种方式或激活某个程序来处理的 MIME 类型,例 如 ”application/octet-stream” 或 ”application/x-msdownload” 等

Step2:

需要通过 HttpServletResponse.setHeader 方法设置Content-Disposition 头的值 为”attachment;filename=文件名”

Step3:

读取下载文件,调用 HttpServletResponse.getOutputStream 方法返回的 OutputStream 对象来向客户端写入附件内容。
 

前端代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
	<!-- 
		如果是文件上传表单
			1、必须设置enctype="multipart/form-data",设置MIME编码
			2、请求方式为POST
			3、文件域需要设置name属性值
	 -->
	<form action="upload" method="post" enctype="multipart/form-data">
		用戶名:<input type="text" name="uname" />
		文件名:<input type="file" name="myfile" />
		<input type="submit" />
	</form>
</body>
</html>

后端代码:

package com.shsxt.web;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

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

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;
	
	
	/**
	 *  DiskFileItemFactory – 设置磁盘空间,保存临时文件。只是一个工具类
		ServletFileUpload – 文件上传的核心类,此类接收 request,并解析
		ServletFileUpload.parseRequest(request); – List 解析 request
		1、 创建一个 DiskFileItemFactory 工厂类,并制定临时文件和大小
		2、 创建 ServletFileUpload 核心类,接收临时文件,做请求的转换
		3、 通过 ServletFileUpload 类转换原始请求,得到 FileItem 集合
		4、 遍历集合中的各个元素并处理
		5、 判断每个元素是否是普通表单项,如果是则按照普通表单项处理
		6、 如果不是普通表单项,则是文件,通过处理的方式进行处理(上传)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 设定编码,可以获取中文文件名
		request.setCharacterEncoding("UTF-8");
		// 获取tomcat下的upload目录的路径
		String path = getServletContext().getRealPath("/upload");
		// 临时文件目录
		String tempPath = getServletContext().getRealPath("/temp");
		// 检查我们是否有文件上传请求
		// boolean isMultipart = ServletFileUpload.isMultipartContent( req);
		// 1、声明DiskFileItemFactory工厂类,用于在指定磁盘上设置一个临时目录
		DiskFileItemFactory disk = new DiskFileItemFactory(1024 * 10, new File(tempPath));
		// 2、声明ServletFileUpload,接收上面的临时文件。也可以默认值
		ServletFileUpload up = new ServletFileUpload(disk);
		// 3、解析request
		try {
			List<FileItem> list = up.parseRequest(request);
			if (list.size() > 0) {
				for (FileItem file : list)
					// 判断是否是普通的表单项
					if (file.isFormField()) {
						String fieldName = file.getFieldName();
						// 中文乱码,此时还需要指定获取数据的编码方式
						// String value = file.getString();
						String value = file.getString("UTF-8");
						System.out.println(fieldName + "=" + value);
					} else { // 说明是一个文件
						// 获取文件本身的名称
						String fileName = file.getName();
						System.out.println(file.getFieldName());
						// 处理文件名称
						fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
						System.out.println("old Name : " + fileName);
						// 修改名称
						String extName = fileName.substring(fileName.lastIndexOf("."));
						String newName = UUID.randomUUID().toString().replace("-", "") + extName;
						// 保存新的名称,并写出到新文件中
						file.write(new File(path + "/" + newName));
						System.out.println("文件名是: " + fileName);
						System.out.println("文件大小是: " + file.getSize());
						file.delete();
					}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}





























 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_38982845/article/details/82191300