Java Webhtml
JavaWeb工做原理java
Web應用程序web
Web服務器數組
Web瀏覽器瀏覽器
HTML文件緩存
HTTP協議(超文本傳輸協議)安全
位於TCP/IP協議的應用層(頂層)服務器
TCP協議是長鏈接,HTTP是短鏈接多線程
HTTP協議主要特色併發
1.遵循請求/響應模型
無鏈接
無狀態
工做流程
創建鏈接
發送請求信息
HTTP請求包括請求行、請求頭、空行、消息體
請求行由三部分組成:請求方法、URL、HTTP版本
請求方法有8中,經常使用GET和POST
回送響應信息
HTTP響應包括狀態行、響應頭、空行、消息體
狀態行中的狀態碼有5種
1xx:信息,請求收到,繼續處理
2xx:成功
3xx:重定向,爲了完成請求,必須進一步執行的動做
4xx:客戶端錯誤
5xx:服務端錯誤
關閉鏈接
Web服務器缺陷
只能提供靜態頁面
CGI程序:多進程,沒法實現高併發
Java的解決方案:Servlet及Web容器
Servlet(無main方法,屬於javaEE)
主要任務
讀取瀏覽器發送的數據
作業務處理,生成結果
給瀏覽器作響應
Web容器
負責Servlet的管理和運行
通訊支持
生命週期管理
多線程支持
JSP支持
處理安全性
Web容器和Servlet對請求和響應的處理總結
JavaWeb page12-13
JavaWeb應用程序的組成
配置文件:web.xml(必須在WEB-INF目錄下),瀏覽器只能訪問到WEB-INF外面的文件
靜態文件
類文件和包
Web容器Tomcat
目錄結構
bin:啓動和關閉服務器
lib:共用的jar文件
logs:日誌
webapps:應用程序部署目錄
發佈Web應用
打war包命令:jar cvf myweb.war html images jsp WEB-INF *.html *.jsp
Servlet基礎
Servlet規範
Web應用程序
Servlet和HTTP Servlet
過濾器
安全
國際化
Servlet API
HttpServlet繼承GenencServlet,GenencServlet實現了ServletConfig和Servlet接口
開發Servlet程序的步驟
1.自定義類繼承httpServlet
2.重寫doGet和doPost方法
3.在web.xml中作配置
Servlet中不能用全局變量,線程安全問題
解決1:用局部變量
解決2:線程同步 synchronized
Servlet 生命週期
五個過程:建立、初始化、提供服務、銷燬、GC回收
建立(構造器)
初始化:init方法
服務:調用Service方法(它去調用doGet或doPost)
銷燬:調用destroy方法
GC卸載
正常狀況下,服務能夠執行屢次,其餘只執行一次。在長時間沒有發送請求後,須要從新建立Servlet
Servlet默認是多線程的,所以給定時間內容器只裝載一個Servlet實例
Servlet基本配置
<url-patttern>匹配規則三種
徹底匹配:<url-pattern>/servlet/MyServlet.do</url-pattern>
目錄匹配:<url-pattern>/servlet/*</url-pattern>
擴展名匹配:<url-pattern>*.do</url-pattern>
容器查找規則:首先查找徹底匹配,找不到則查找目錄匹配,若是還找不到就查找擴展名匹配。一個請求能夠匹配多個目錄匹配,容器最終會選擇最長的目錄匹配
Servlet初始化配置
在一個Servlet元素中使用<init-param>、<param-name>、<param-value>元素
訪問初始化參數
this.getServletConfig().getInitParameter(String name)
this.getInitParameter(String name)
ServletContext應用上下文對象
歸納
屬於整個Web應用程序
能夠訪問到Web應用程序資源的本地輸入流
把資源的虛擬路徑轉換爲物理路徑
記錄事件日誌
綁定一個對象在整個Web應用程序中共享
獲取應用上下文對象
ServletContext context= this.getServletConfig().getServletContext()
ServletContext context= this.getServletContext()
經常使用方法
context.getRealPath():將虛擬路徑轉換爲部署到服務器那邊的真實物理路徑
數據共享
context.setAttribute("username","張三"):在應用上下文中保存數據(能夠存任何數據類型)
context.getAttribute("username"):在應用上下文中取出數據(根據鍵取出值,再強轉)
getInitParameter():得到全局的初始化參數(初始化配置中,在Servlet元素外用<Context-Param>元素)
使用Servlet處理HTTP響應
HttpServletResponse對象用於建立響應
設置響應狀態行
五類狀態碼
1xx:信息,請求收到,繼續處理
2xx:成功
3xx:重定向,爲了完成請求,必須進一步執行的動做
4xx:客戶端錯誤
5xx:服務端錯誤
設置狀態碼
setStatus()方法,例:resp.setStatus(HttpServletResponse.SC_NOT_FOUND)
兩種專用方法
sendError(HttpServletResponse.SC_NOT_FOUND,"你輸入的路徑有錯") 生成一個404應答, 能夠自定義錯誤信息!
sendRedirect(String URL)重定向,用於跳轉頁面或跳轉Servlet!
重定向跳轉Servlet時寫的路徑不加/
原理:首先將狀態碼設置爲302,再根據響應頭裏Location的URL地址,從新發送請求
設置響應頭
setHeader(name,value)
自定義響應頭:resp.setHeader("username", "張三");
經過Content-Type響應頭告訴瀏覽器響應的數據類型是普通HTML文本:resp.setHeader("Content-Type", "text/html");
setContentType(String mimetype)
Content-Type值的類型,叫作MIME(Multipurpose Internet Mail Extending)
text/html
text/plain
image/jpeg
設置響應消息體
傳遞文本流getWriter()
傳遞二進制流getOutputStream()
下載文件
使用Servlet處理HTTP請求
瀏覽器向服務器發HTTP請求的四種方式
地址欄輸入 Get
超連接 Get
表單提交 Get/Post
表單提交中傳輸二進制數據,只能使用POST方法
改變默認編碼集 enctype="multipart/form-data"
開啓Servlet3.0文件上傳開關 @MultipartConfig
提交方法 method="post"
AJAX Get/Post
GET/POST方法比較
GET
提交數據類型:文本
提交數據長度:不超過255個字符
提交數據可見性:做爲URL地址的一部分顯示在瀏覽器地址欄
提交數據緩存:緩存在瀏覽器URL歷史狀態中
POST
提交數據類型:文本,二進制文本
提交數據長度: 沒有限制
提交數據可見性: 做爲請求的消息體,不可見
提交數據緩存:不會被瀏覽器緩存
如何選擇GET/POST方法
請求一個靜態頁面或圖形文件時使用GET方法,由於僅僅須要發送文件名
發送大數據的時候使用POST方法
上傳文件時使用POST方法
發送用戶名、密碼或其餘保密信息的時候使用POST方法
獲取HTTP協議請求行
獲取HTTP協議請求頭
request.getHeader("User-Agent");
獲取HTTP協議消息體
獲取表單數據
request.getParameterValues("hobby") 返回字符串數組
request.getParameter("sex")返回字符串
請求轉發
request.getRequestDispatcher("/FromServlet").forward(request, response);跳頁面或者Servlet
一次請求一次響應。請求轉發在服務器內部完成,而重定向由瀏覽器完成,重定向至少兩次請求兩次響應
使用request對象做爲倉庫
傳數據線程安全(只在一次請求一次響應中有效)