JavaWeb17-HTML篇筆記(二)
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)
@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篇筆記(二)