文件的上传
数据源和连接池技术
数据源(DataSource) 就是在 服务器中 事先配置好,用来创建与数据库交互的连接!
我们启动服务器的时候,数据源创建的链接已经存在!
conf/context.xml文件中 配置
连接池(Connection Pool)
01.连接池中的链接 由 数据源提供
02.负责管理和释放连接
03.是一种缓冲池技术
04.可以自动分配连接对象以及对闲置连接对象的回收
JDBC
JNDI (Java Naming And Directory Interface)
java命名和目录接口
Context 上下文
DataSource 数据源
通过上下文 找到 数据源
sql心跳 :目的是确保我们使用的每一个连接都是有效的!
因为只有sql语句才能访问数据库,所以我们需要定时想数据库发送信息,来确保能正确返回数据,证明数据库还活着!
所以我们需要写一条sql语句给数据库!
这条sql语句越简单越好! select 1
文件上传:
1.必须引入需要的jar包
fileupload io
2.文件上传所在的form表单中的enctype属性值必须是 multipart/form-data
3.form表单中并不是所有的元素都是文件类型,所以我们需要划分类别
01.普通的文本元素 新闻标题 新闻内容 新闻创建时间
02.img 文件类型
4.form表单中辣么多元素,我们怎么能知道那些是普通文本,那些是 文件类型???
我们引入的fileupload jar中有一个ServletFileUpload类
01.类中有一个isMultipartContent(request)
根据用户的请求,来判断form表单中是否含有文件上传类型
02.parseRequest(request)
根据用户的请求, 能获取form表单中所有的元素! 返回值是一个List<FileItem>
每一个元素对应的对象======>FileItem
5.现在是找到了所有元素,需要确定 具体的文件上传元素
FileItem类中有isFormField()
如果返回值是true=====>普通元素
返回值是fasle=====>文件上传元素
6.确定元素之后,把用户选择的文件上传到服务器的指定位置
FileItem类中有
输入流 getInputStream() 放进内存中
输出流 getOutputStream() 放进服务器的指定位置
7.实现文件上传 必须使用 DiskFileItemFactory implements FileItemFactory
文件上传的步骤:
1.创建DiskFileItemFactory的实例对象 设置缓冲区 存放位置
2.通过DiskFileItemFactory创建 ServletFileUpload
通过ServletFileUpload.isMultipartContent(request)
来判断from表单是不是文件上传类型
3. ServletFileUpload.parseRequest(request)获取所有的元素
返回值是 List<FileItem>
4.遍历List<FileItem> 集合,确定文件上传类型
每遍历一次都要使用isFormField()来判断元素的类型
01.普通元素
getFileName获取form表单中的name属性值
getString设置编码格式
02.文件元素
getName 获取上传文件的名称
输入和输出流实现上传
1 package com.xdf.servlet; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.text.ParseException; 6 import java.text.SimpleDateFormat; 7 import java.util.Iterator; 8 import java.util.List; 9 10 import javax.servlet.ServletException; 11 import javax.servlet.annotation.WebServlet; 12 import javax.servlet.http.HttpServlet; 13 import javax.servlet.http.HttpServletRequest; 14 import javax.servlet.http.HttpServletResponse; 15 16 import org.apache.commons.fileupload.FileItem; 17 import org.apache.commons.fileupload.FileUploadException; 18 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 19 import org.apache.commons.fileupload.servlet.ServletFileUpload; 20 21 import com.xdf.bean.Easybuy_News; 22 import com.xdf.service.news.NewsService; 23 import com.xdf.service.news.NewsServiceImpl; 24 25 @WebServlet("/addNews") 26 public class NewsServlet extends HttpServlet { 27 28 @Override 29 protected void doGet(HttpServletRequest req, HttpServletResponse resp) 30 throws ServletException, IOException { 31 doPost(req, resp); 32 } 33 34 @Override 35 protected void doPost(HttpServletRequest req, HttpServletResponse resp) 36 throws ServletException, IOException { 37 System.out.println("进入了 NewsServlet"); 38 // 解决post请求乱码问题 39 req.setCharacterEncoding("utf-8"); 40 resp.setCharacterEncoding("utf-8"); 41 // 调用service层代码 42 NewsService service = new NewsServiceImpl(); 43 // 创建新闻对象 44 Easybuy_News news = new Easybuy_News(); 45 46 // 1.创建DiskFileItemFactory的实例对象 设置缓冲区 存放位置 47 DiskFileItemFactory factory = new DiskFileItemFactory(); 48 // 2.通过DiskFileItemFactory创建 ServletFileUpload 49 ServletFileUpload upload = new ServletFileUpload(factory); 50 // 3.判断是否是文件上传类型 enctype=multipart/form-data 51 @SuppressWarnings("static-access") 52 boolean flag = upload.isMultipartContent(req); 53 if (flag) { // 证明 form表单含有文件上传 54 try { 55 // 4.获取form所有元素 56 List<FileItem> items = upload.parseRequest(req); 57 Iterator<FileItem> its = items.iterator(); 58 // 5.循环遍历 59 while (its.hasNext()) { 60 FileItem item = its.next(); 61 // 6.判断是普通元素还是 上传元素 62 if (item.isFormField()) { // 普通的元素 63 String filedName = item.getFieldName(); 64 switch (filedName) { 65 case "title": 66 news.setTitle(item.getString("utf-8")); 67 break; 68 case "content": 69 news.setContent(item.getString("utf-8")); 70 break; 71 case "createTime": 72 news.setCreateTime(new SimpleDateFormat("MM/dd/yy") 73 .parse(item.getString("utf-8"))); 74 break; 75 } 76 } else {// 文件上传 77 // 指定文件上传到服务器的位置 78 String uploadPath = req.getSession() 79 .getServletContext().getRealPath("/upload"); 80 File file = new File(uploadPath); 81 if (!file.exists()) { 82 file.mkdirs();// 创建服务器文件 83 } 84 // 获取用户上传的文件名称 85 String fileName = item.getName(); 86 // 解决中文乱码问题 87 fileName = new String(fileName.getBytes(), "utf-8"); 88 // 判断用户是否选择了上传文件 89 if (!"".equals(fileName) && null != fileName) { 90 File saveFile = new File(uploadPath, fileName); 91 // 开始上传 92 item.write(saveFile); 93 news.setImg(uploadPath + "\\" + fileName); // 保存路径到数据库 94 } 95 } 96 } 97 98 } catch (FileUploadException e) { 99 e.printStackTrace(); 100 } catch (ParseException e) { 101 e.printStackTrace(); 102 } catch (Exception e) { 103 e.printStackTrace(); 104 } 105 } 106 service.addNews(news); // 真正的上传 107 108 } 109 }