1. 程式人生 > >JavaWeb17-HTML篇筆記(二)

JavaWeb17-HTML篇筆記(二)

Java

1.3案例二:使用Servlet3.0技術完成文件的上傳:
1.3.1需求:
技術分享圖片
1.3.2分析:
1.3.2.1技術分析:
【Servlet3.0】
Servlet3.0 與 Servlet2.5:

  • Servlet3.0需要運行在tomcat7以上的服務器中.
  • Servlet3.0以後web.xml就不是必須的.1.Servlet3.0支持註解開發.
    2.提供異步請求.
    3.支持文件上傳.
    【Servlet3.0支持註解開發】
    使用@WebServlet替換web.xml中配置的Servlet:
    br/>1.Servlet3.0支持註解開發.
    2.提供異步請求.
    3.支持文件上傳.
    【Servlet3.0支持註解開發】
    使用@WebServlet替換web.xml中配置的Servlet:

使用@WebListener替換web.xml中監聽器的配置:
@WebListener

使用@WebFilter替換web.xml中的過濾器的配置:@WebFilter(urlPatterns="/*")
br/>@WebFilter(urlPatterns="/*")
使用的是多線程的方式處理的,將傳統的方式一次請求的非常耗時的操作,分成多個線程去處理.
需要在Servlet上添加一個屬性:
@WebServlet(urlPatterns="/ServletDemo2",asyncSupported=true)

@WebServlet(urlPatterns="/ServletDemo2",asyncSupported=true)

public class ServletDemo2 extends HttpServlet{

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    AsyncContext context = req.startAsync(req, resp);
    context.start(new MyRunner(context));

    for(int i=1;i<=20;i++){
        System.out.println(i);
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doGet(req, resp);
}

}

class MyRunner implements Runnable{

private AsyncContext context;

public MyRunner(AsyncContext context) {
    this.context = context;
}

@Override
public void run() {
    for(char i=‘a‘;i<=‘z‘;i++){
        try {
            context.getResponse().getWriter().println(i);
            Thread.sleep(100);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

}
【Servlet3.0的文件上傳】
?文件上傳:
文件上傳:指的是將本地的文件 寫到 服務器上.
?文件上傳的要素:
1.表單的提交的方式必須是POST.
2.表單中必須有一個文件上傳項:<input type=”file”>,而且文件上傳項必須有name屬性和值.

  • <input type=”file” name=”upload”/>
    3.表單的enctype屬性的值必須是multipart/form-data
    ?文件上傳的抓包分析:
    未修改enctype屬性的時候:

POST /WEB17_WEB/demo1/demo1.jsp HTTP/1.1
Accept: text/html, application/xhtml+xml, /
X-HttpWatch-RID: 22325-10011
Referer: http://localhost:8080/WEB17_WEB/demo1/demo1.jsp
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8080
Content-Length: 47
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=99CD51DA9A47D29200168968AD983E9E

upload=C%3A%5CUsers%5Capple%5CDesktop%5Caaa.txt

已經修改了enctype屬性:
POST /WEB17_WEB/demo1/demo1.jsp HTTP/1.1
Accept: text/html, application/xhtml+xml, /
X-HttpWatch-RID: 22325-10026
Referer: http://localhost:8080/WEB17_WEB/demo1/demo1.jsp
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Content-Type: multipart/form-data; boundary=---------------------------7e02e526160b66
Accept-Encoding: gzip, deflate
Host: localhost:8080
Content-Length: 224
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=99CD51DA9A47D29200168968AD983E9E

-----------------------------7e02e526160b66
Content-Disposition: form-data; name="upload"; filename="C:\Users\apple\Desktop\aaa.txt"
Content-Type: text/plain

Hello shouyi
-----------------------------7e02e526160b66—
【文件上傳的原理】
根據分割線將請求體的部分分成幾塊:

  • 判斷 每塊是 普通項還是文件上傳項.
    • 普通項:獲得名稱和值.
    • 文件上傳項:獲得文件名 和 文件內容輸入流.
      【文件上傳的技術】
      JspSmartUpload: jspSmartUpload組件是應用JSP進行B/S程序開發過程中經常使用的上傳下載組件,它使用簡單,方便。現在我又為其加上了下載中文名字的文件的支持,真個是如虎添翼,必將贏得更多開發者的青睞。-Model1年代的文件上傳的工具.
      FileUpload 是 Apache commons下面的一個子項目,用來實現Java環境下面的文件上傳功能,與常見的SmartUpload齊名.應用在Model2年代了.
      Servlet3.0 :
      Struts2 :
      1.3.2.2步驟分析:
      設計一個文件上傳頁面:
      提交到Servlet:
      ?接收普通項:request.getParameter();
      ?接收上傳項:Part:
      通過Part對象中的方法完成文件的上傳.
      1.3.3代碼實現
      package com.itheima.servlet;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

/**

  • 文件上傳的Servlet*/
    @WebServlet("/UploadServlet")
    br/>*/
    @WebServlet("/UploadServlet")
    public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 接收普通項:
    request.setCharacterEncoding("UTF-8");
    String desc = request.getParameter("desc");
    System.out.println("文件描述:"+desc);
    Part part = request.getPart("upload");
    // 獲得上傳的文件的大小
    long size = part.getSize();
    System.out.println("文件大小"+size);
    String type = part.getContentType();
    System.out.println("文件類型"+type); // text/plain image/jpeg
    String name = part.getName();
    System.out.println(name);
    // 獲得文件名:
    String header = part.getHeader("Content-Disposition");
    System.out.println(header);

    int idx = header.lastIndexOf("filename=\"");
    String fileName = header.substring(idx+10, header.length()-1);
    System.out.println(fileName);
    
    // 獲得文件內容:
    InputStream is = part.getInputStream();
    
    // 獲得文件上傳路徑:
    String path = this.getServletContext().getRealPath("/upload");
    
    OutputStream os = new FileOutputStream(path+"/"+fileName);
    int len = 0;
    byte[] b = new byte[1024];
    while((len = is.read(b))!=-1){
        os.write(b, 0, len);
    }
    is.close();
    os.close();

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
    }

}
1.3.4總結:
1.3.4.1文件名重名的問題:
UUID隨機產生一個文件名.
1.3.4.2文件上傳的目錄分離:
按用戶分 :一個用戶創建一個或多個路徑.
按時間分 :按月,星期,天進行劃分.
按個數分 :一個路徑中存3000個文件.
按分離算法分 :按照一定的算法進行劃分.

JavaWeb17-HTML篇筆記(二)