c/s是客戶機/伺服器,b/s是瀏覽器/伺服器。 ipv4 192.168.....(內網ip) 通過路由器的NAT(維護了一張表,用來轉換ip對應外網)。 當ipv6推廣開,就不用使用路由器了。 通信原理: 寫ip地址訪問太麻煩,於是有了功能變數名稱,它會先訪問本地的hosts,沒有則去網路訪問DNS服務 ...
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