1. 程式人生 > >整理筆記--Web基礎

整理筆記--Web基礎

結果 quest 虛擬主機 獲取參數 有關 ttr 成功 轉發和重定向 維護

c/s是客戶機/服務器,b/s是瀏覽器/服務器。

ipv4 192.168.....(內網ip) 通過路由器的NAT(維護了一張表,用來轉換ip對應外網)。

當ipv6推廣開,就不用使用路由器了。

通信原理:

寫ip地址訪問太麻煩,於是有了域名,它會先訪問本地的hosts,沒有則去網絡訪問DNS服務器,DNS服務器會幫我們去查找目標服務器,然後把對應的Ip地址返回。

虛擬主機(可以讓多個主機名稱,在一個單一服務器(或是一個服務器組)上運作,而且可以分開支持每個單一的主機名稱),

web.xml放在WEB-INF其實就是為了可以訪問虛擬主機。

Servlet

生命周期:

技術分享圖片

服務器啟動時,Servlet生命周期中的任何方法都不會被調用。
當Servlet第一次被訪問時,首先調用構造函數,之後是init()方法,該方法僅被調用一次,之後是service()方法。
如果Servlet再被訪問,每次訪問服務器都會開啟新線程,調用service()方法。
當服務器重啟或正常關閉(shutdown.bat)時,調用destroy()方法。
Servlet對象是tomcat創建的,每次請求都會調用service()方法,tomcat服務器會在每次調用service()方法時,為該方法創建Request對象和Response對象。
在HttpServlet代碼實現中,根據請求方式的不同,調用相應的doXXX方法,例如get方式請求調用doGet()方法,post方式調用doPost()方法。

補充:

<!--Servlet隨服務器啟動而初始化-->
<load-on-startup>1</load-on-startup> 

Cookie(key-value形式)原理:

技術分享圖片

Cookie的有效時間:

cookie.setMaxAge(數值):
  -1,默認值,表示只在瀏覽器內存中存活。
  60*60,代表一小時。
  0,代表作廢。
cookie.setPath(“/”):設置路徑。

Cookie的生命周期:

 Cookie cookie =new Cookie("name", "value")//創建

銷毀:
  1.會話Cookie在瀏覽器關閉時銷毀。

  2.持久Cookie在Cookie過期時銷毀。

Session原理:

當首次使用session時,服務器端要創建session,session是保存在服務器端,而給客戶端的是session的id(一個cookie中保存了sessionId)。客戶端帶走的是sessionId,而數據是保存在session中。
當客戶端再次訪問服務器時,在請求中會帶上sessionId,而服務器會通過sessionId找到對應的session,而無需再創建新的session。

Session的生命周期:

 request.getSession();//創建

銷毀:
  1.服務器關閉時銷毀。
  2.Session過期時銷毀。
  3.調用HttpSession.invalidate()。

設置Session過期時間:
  1.配置web.xml:

<session-config>
 <!-- 單位是分鐘-->
<session-timeout>30<session-timeout>
</session-config>

  2.調用session.setMaxInactiveInterval(int interval),單位是秒。
  3.手動調用session.invalidate()。

ServletContext
生命周期:服務器啟動時創建,服務器關閉銷毀,所有Servlet共享保存全局數據。
用途:數據庫連接池、工程配置屬性、配置文件內容。

  a.轉發和重定向:

    轉發(java特有):

      1.如果服務器在處理客戶請求的時候,需要多個服務器程序進行同時處理,這時候就需要使用轉發.。

2.ServletContext.getRequestDispatcher(String path) : 指定轉發路徑。
3.RequestDispatcher.forward(ServletRequest request, ServletResponse response) : 轉發參數,進行後續操作。

    重定向 : 服務器收到請求後,通知客戶端需要訪問下一個目標程序進行後續處理。

  區別:

    1.轉發產生一次請求一次響應,重定向產生兩次請求兩次響應。
    2.轉發只能跳轉站內資源,重定向可以定向任何站點資源 。
    3.轉發URL地址不變,重定向URL地址改變 。
    4.轉發對客戶端不可見,重定向對客戶端可見。
    5.轉發共享同一個Request中數據,重定向產生兩次請求,兩個不同的Request對象,不能共享Request數據。

  b.獲取Web應用資源文件:

    1.在Web應用中,必須通過絕對磁盤路徑來獲取文件。如果該文件位於/WEB-INF/classes目錄下(src的文件保存在/WEB-INF/classes目錄中),還可以通過類加載器獲取
clazz.getResource("/文件").getFile();

2.ServletContext.getRealPath(String path) : 獲取Web應用中的資源的絕對磁盤路徑,String path參數代表相對路徑。

  c.獲取參數:

1.getServletConfig()-->初始化參數。
2.getServletContext()-->全局參數。

  d.數據共享

1.ServletContext.setAttribute(String name, Object object):保存一個全局參數。
2.ServletContext.getAttribute(String name):獲取一個全局參數的值。

HttpSession
生命周期:訪問JSP/Servlet等程序時創建。
用途:系統登陸信息、購物車數據

同一客戶端機器多次請求同一個資源,session一樣嗎?

對於多標簽的瀏覽器(比如360瀏覽器)來說,在一個瀏覽器窗口中,多個標簽同時訪問一個頁面,session是一個。對於多個瀏覽器窗口之間,同時或者相隔很短時間訪問一個頁面,session是多個的,和瀏覽器的進程有關。對於一個同一個瀏覽器窗口,直接錄入url訪問同一應用的不同資源,session是一樣的。

禁用Cookie後使用Session:

API:response.encodeURL
註意:
如果服務器進行URL重寫,必須對所有路徑進行重寫,
實際開發中,不要讓用戶禁用Cookie。

例子:

protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute("name", "zhangsan");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("寫出成功");
String url = "/LoginDemo/GetSession";
// 重寫URL
String encodeURL = response.encodeURL(url);
response.getWriter().write("<a href=‘" + encodeURL + "‘>查看數據</a>");
}

HttpServletRequest
生命周期:客戶端發起請求時,服務器創建對象,在響應結束時,對象銷毀保存Servlet向JSP傳輸數據信息,Servlet將操作結果傳遞JSP。

用途:登錄錯誤信息

  a.轉發:

getRequestDispatcher(path).forward(request,response)

  和ServletContext的區別:

  1.ServletContext對象當服務器啟動時創建,服務器關閉時銷毀

  2.HttpServletRequest對象當產生請求時創建,響應結束時銷毀

  b.亂發問題解決:

  1.POST請求 :

 request.setCharacterEncoding("客戶端編碼集");

  2.GET請求 :使用new String(name.getBytes("iso-8859-1"), "utf-8")構造函數對數據進行重新編碼

生命周期的長度:

ServletContext > HttpSession > HttpServletRequest 

開發中選擇的原則:優先使用生命周期短的。

HttpServletResponse

有關setHeader(頭信息):

  1.自動刷新

  需求 : 完成一個類似論壇登錄成功,三秒後打開主頁的功能。
  實現 :
  方式一 :

 "refresh:3;url=http://www.baidu.com" //設置頭信息

  方式二 : 使用meta標簽
  meta標簽能夠實現和頭信息相同的效果

  http-equiv = 頭信息的name
  content = 頭信息的value

  2.禁止緩存

  實現:

設置信息頭 :

"Cache-Control", "no-cache"
"Pragma", "no-cache"
"Expires", "Thu, 01 Dec 1994 16:00:00 GMT"

//下面這個設置時間的是上面的簡單方法

setDateHeader("Expires", -1)

  由於市面上的瀏覽器比較多,支持的屬性不一致,所以通常情況下會把三個信息頭同時設置。

  3.下載文件

  getServletContext().getMimeType(path): 獲取文件的編碼類型

  ("Content-Disposition","attachment;filename=" + fileName)
  //attachment: 要以下載的形式下載這個文件
  // filename: 指定要下載的文件的名字

輸出中文字符:

setCharacterEncoding() : 設置對外輸出的內容的編碼,無法生成頭信息
setContentType("text/html;charset=utf-8") : 設置對外輸出的內容的編碼,同時生成頭信息,通知瀏覽器按照對應的格式解析內容

Servlet與線程安全:

因為一個類型的Servlet只有一個實例對象,那麽就有可能會現時出一個Servlet同時處理多個請求,Servlet不是線程安全的。
所以我們不應該在Servlet中隨意創建成員變量.

tomcat常見問題:
1. 內存溢出
系統彈出設置tomcat配置頁面,在Argument中末尾添加參數中的VM arguments中追加:

-Xms256M -Xmx512M -XX:PermSize=256m -XX:MaxPermSize=512m


參數的意思

-vmargs:說明後面是VM的參數
-Xms40m:虛擬機占用系統的最小內存
-Xmx256m:虛擬機占用系統的最大內存
-XX:PermSize:最小棧內存大小。一般報內存不足時,都是說這個太小,堆空間剩余小於5%就會警告,建議把這個稍微設大一點,不過要視自己機器內存大小來設置
-XX:MaxPermSize:最大棧內存大小。這個也適當大些
-Xmx512M的5%為25.6M,理論上要求-Xmx的數值與-XX:MaxPermSize必須大於25.6M

技術分享圖片


2. 命令啟動不了
右鍵編輯啟動指令 在第一行下面添加

SET JAVA_HOME=C:\Program Files\Java\jdk1.7.0_80
SET TOMCAT_HOME=C:\ruan_jian\apache-tomcat-7.0.73


3. 啟動速度變快

<Host appBase="webapps" autoDeploy="false" deployOnStartup="false" name="localhost" unpackWARs="true">

Servers下的 server.xml 116行 註釋掉原來的

4. 解決GET請求
64行 tomcat get亂碼過濾 URIEncoding="utf-8"

5. 本地tomcat啟動不了 maven tomcat能啟動(或相反)
換一個工作空間 並且重新配置tomcat

連接池:

不使用連接池的缺點:

用戶每次請求都需要向數據庫獲得鏈接,而數據庫創建連接通常需要消耗相對較大的資源,創建時間也較長。假設網站一天10萬訪問量,數據庫服務器就需要創建10萬次連接,極大的浪費數據庫的資源,並且極易造成數據庫服務器內存溢出、拓機。

第3方連接池:

  1.DBCP 2.C3P0

整理筆記--Web基礎