第一章 Web應用程序開發基礎


一、HTTP協議工作機制

HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用於從WWW服務器傳輸超文本到本地瀏覽器的傳送協議。它是一種主流B/S架構中應用的通信協議。具有以下特點:
1、無狀態
  服務端不會記錄客戶端每次提交的請求,服務器一旦相應客戶端之后,就會結束本次的通信過程。客戶端下一次的請求是一個新的 連接,和上一次通信沒有任何關系。
2、簡單靈活
  HTTP是基於請求(request)和響應(response)的模型
3、支持客戶端與服務端
  支持主流的B/S架構的通信以及C/S架構的通信。
  注意:C/S架構可選的協議有多種,例如:TCP/IP,UDP,HTTP
​  而B/S架構通常只支持HTTP協議

HTTP協議的工作原理

  • 四個步驟

  • 工作原理

  (1)連接:Web瀏覽器與Web服務器建立連接,打開一個稱為socket(套接字)的虛擬文件,此文件的建立標志着連接建立成功。( 客戶端-----通過socket建立連接-----服務器)
  (2)請求:Web瀏覽器通過socket向Web服務器提交請求。HTTP的請求一般是GET或POST命令(POST用於FORM參數的傳遞)。GET命令的格式為:GET 路徑/文件名 HTTP/1。其中,文件名指出所訪問的文件,HTTP/1.0指出Web瀏覽器使用的HTTP版本。
  (3)應答:Web瀏覽器提交請求后,通過HTTP協議傳送給Web服務器。Web服務器接到后,進行事務處理,處理結果又通過HTTP傳回給Web瀏覽器,從而在Web瀏覽器上顯示出所請求的頁面。例:假設客戶機與www.mycompany.com:8080/mydir/index.html建立了連接,就會發送GET命令:GET /mydir/index.html HTTP/1.0。主機名為www.mycompany.com的Web服務器從它的文檔空間中搜索子目錄mydir的文件index.html。如果找到該文件,Web服務器把該文件內容傳送給相應的Web瀏覽器。為了告知 Web瀏覽器傳送內容的類型,Web服務器首先傳送一些HTTP頭信息,然后傳送具體內容(即HTTP體信息),HTTP頭信息和HTTP體信息之間用一個空行分開。其中,常用的HTTP頭信息如下。
  HTTP 1.0 200 Ok:這是Web服務器應答的第一行,列出服務器正在運行的HTTP版本號和應答代碼。代碼"200 OK"表示請求完成。
  MIME_Version:1.0:它指示MIME類型的版本。
  content_type:類型:這個頭信息非常重要,它指示HTTP體信息的MIME類型。如:content_type:text/html指示傳送的數據是HTML文檔。
  content_length:長度值:它指示HTTP體信息的長度(以字節為單位)。
  (4)關閉連接 :當應答結束后,Web瀏覽器與Web服務器必須斷開,以保證其他Web瀏覽器能夠與Web服務器建立連接。

客戶端的請求信息被封裝在request對象中,通過它才能了解到客戶的需求,然后做出響應。它是HttpServletRequest類的實例

http的特點

1)支持客戶/服務器模式。(c/s模式)
2)簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
3)靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
4)無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
5)無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

解決http的無狀態的問題:cookie和session

  • Cookie

  兩種用於保持HTTP連接狀態的技術就應運而生了,一個是Cookie,而另一個則是Session
  由於采用服務器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要借助於cookie機制來達到保存標識的目的,但實際上它還有其他選擇。

  Cookie是通過客戶端保持狀態的解決方案。從定義上來說,Cookie就是由服務器發給客戶端的特殊信息,而這些信息以文本文件的方式存放在客戶端,然后客戶端每次向服務器發送請求的時候都會帶上這些特殊的信息。
  cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成cookie的作用范圍。若不設置過期時間,則表示這個cookie的生命期為瀏覽器會話期間,關閉瀏覽器窗口,cookie就消失。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。
會話cookie一般不存儲在硬盤上而是保存在內存里,當然這種行為並不是規范規定的。若設置了過期時間,瀏覽器就會把cookie保存到硬盤上,關閉后再次打開瀏覽器,這些cookie仍然有效直到超過設定的過期時間。存儲在硬盤中的cookie可以在不同瀏覽器間共享,比如兩個IE窗口。而對於保存在內存里的cookie,不同的瀏覽器有不同的處理方式

  Cookie支持跨域名訪問,例如將domain屬性設置為“.helloweenvsfei.com”,則以“.helloweenvsfei.com”為后綴的所有域名均可以訪問該Cookie。跨域名Cookie現在被廣泛用在網絡中,例如Google、Baidu、Sina等。而Session則不會支持跨域名訪問。Session僅在他所在的域名內有效。 

生成Cookie對象:

java.util.Date date = new java.util.Date(); // 前面一個參數是key,后面一個參數是value值。
Cookie c = new Cookie("lastVisited",date.toString()); // 設定Cookie的有效期,單位為毫秒
c.setMaxAge(60*60*24); // Cookie的路徑與域名: 
c.setPath("/"); c.setDomain(".v512.com"); // 發送Cookie對象: 
response.addCookie(c);

讀取或設置Cookie:

 1 // 讀取Cookie
 2 Cookie [] cookies=request.getCookies();  3 Cookie c = null;  4 if(cookies!= null) {  5     for(int i=0;i<cookies.length;i++) {  6          c = cookies[i];  7          out.println("cookie name:"+c.getName()+"<br>");  8          out.println("cookie value:"+c.getValue()+"<br>");  9  } 10 } 11 
12 // 修改Cookie: 
13 Cookie [] cookies=request.getCookies(); 14 Cookie c = null; 15 } 16 
17 //刪除Cookie:即把Cookie的失效時間設置為0即可。 
18 c.setMaxAge(0); 19 
20 //Cookie文本信息的大小和數量有限制。以明文保存,沒有任何加密措施。 
21 for(int i=0;i<cookies.length;i++) 22 { 23          c = cookies[i]; 24          if(c.getName().equals("lastVisited")) 25  { 26              c.setValue("2010-10-1"); 27              c.setMaxAge(6000); 28  response.addCookie(c); 29  } 30 } 
  • session

   當然還是在服務器端程序運行的過程中創建的,不同語言實現的應用程序有不同創建Session的方法,而在Java中是通過調用HttpServletRequest的getSession方法(使用true作為參數)創建的。在創建了Session的同時,服務器會為該Session生成唯一的Session id,而這個Session id在隨后的請求中會被用來重新獲得已經創建的Session;在Session被創建之后,就可以調用Session相關的方法往Session中增加內容了,而這些內容只會保存在服務器中,發到客戶端的只有Session id;當客戶端再次發送請求的時候,會將這個Session id帶上,服務器接受到請求之后就會依據Session id找到相應的Session,從而再次使用之。

創建或者獲取session:

 1 package xdp.gacl.session;  2 
 3 import java.io.IOException;  4 import javax.servlet.ServletException;  5 import javax.servlet.http.HttpServlet;  6 import javax.servlet.http.HttpServletRequest;  7 import javax.servlet.http.HttpServletResponse;  8 import javax.servlet.http.HttpSession;  9 
10 public class SessionDemo1 extends HttpServlet { 11 
12     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 13         response.setCharacterEncoding("UTF=8"); 14         response.setContentType("text/html;charset=UTF-8"); 15         // 使用request對象的getSession()獲取session,如果session不存在則創建一個
16         HttpSession session = request.getSession(); 17         // 或 HttpSession session = request.getSession(boolean); 18         
19         //將數據存儲到session中 session.setAttribute("key", 值對象);
20         session.setAttribute("userId", "100001"); 21         
22         // 獲取session的Id
23         String sessionId = session.getId(); 24         
25         // 獲取session值 對象類型 obj = (對象類型)session.getAttribute("key");
26         String name = (String)session.getAttribute("userId"); 27         
28         // 刪除session 指定屬性健:
29         session.removeAttribute("userId"); 30 
31         // 判斷session是不是新創建的
32         if (session.isNew()) { 33             response.getWriter().print("session創建成功,session的id是:"+sessionId); 34         }else { 35             response.getWriter().print("服務器已經存在該session了,session的id是:"+sessionId); 36  } 37         
38         // 清除所有的session,使當前 session 完全失效:
39  session.invalidate(); 40  } 41 
42     public void doPost(HttpServletRequest request, HttpServletResponse response) 43             throws ServletException, IOException { 44  doGet(request, response); 45  } 46 }

session超時周期設置:

1.Tomcat 安裝位置 conf/web.xml :

<session-config>
    <!-- 設置消失時長3分鍾 -->
    <session-timeout>30</session-timeout>
</session-config>

2. Tomcat 安裝位置 conf/server.xml:

<!-- defaultSessionTimeOut="3600" 單位:秒-->
<Context path="/test" docBase="/test"   defaultSessionTimeOut="3600" isWARExpanded="true"   isWARValidated="false" isInvokerEnabled="true"   isWorkDirPersistent="false"/>

3、Java 代碼設置:

//單位:秒
HttpSession session = request.getSession(); session.setMaxInactiveInterval(1200);

其他說明:
1. session 過期情況:

(1)、客戶端瀏覽器關閉:
(2)、session 會話過期;
(3)、客戶端會話調用了 .invalidate();

2. 瀏覽器關閉與session是否還在;
  當客戶端瀏覽器關閉后,session 在服務端還是會存在一定時間的,只是當瀏覽器器再次打開時,就會生成一個新的 session ,瀏覽器通過生成的 sessionid 屬性來 匹配服務端的 session; 那上次的session 雖然還在,但是就訪問不到了;
3. <% @ page session="false" %> 是什么情況?:
  這句話的意思是,當前不能使用 session, 但是 頁面 session 還是可以創建的;
4. session 在什么時候 被創建:
  在 程序 調用 HttpServletRequest.getSession(true) 時創建;如果 頁面沒有使用 <%@ page session="false"%> 時,在 jsp 頁面編譯成 Servlet 時,會自動 加上 HttpSession session = HttpServletRequest.getSession(true);

  • cookie 和session 的區別:

1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
考慮到安全應當使用session,將登陸信息等重要信息存放為SESSION,其他信息如果需要保留,可以放在COOKIE中
3、session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能
考慮到減輕服務器性能方面,應當使用COOKIE
4、單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能3K。
5.session需要借助cookie才能正常工作。如果客戶端完全禁止cookie,session將失效。
6.session不能區分路徑,同一個用戶在訪問一個網站期間,所有的session在任何一個地方都可以訪問到。而cookie中如果設置了路徑參數,那么同一個網站中不同路徑下的cookie互相是訪問不到的。
7.session調用了 session.invalidate()方法或者前后兩次請求超出了session指定的生命周期時間,Session會銷毀,否則在用戶會話結束后就會關閉了。但若不設置過期時間,則表示這個cookie的生命期為瀏覽器會話期間,關閉瀏覽器窗口,cookie就消失。保存在硬盤里的,可以長期保存
8.session保存在服務器,客戶端不知道其中的信息;cookie保存在客戶端,服務器能夠知道其中的信息。
9.Session則不會支持跨域名訪問。Session僅在他所在的域名內有效。

二、Web應用程序及其優點

應用程序類型

1、C/S類型應用程序:Client客戶端/Server服務器
  客戶端必須安裝專門的一個桌面軟件才能使用。
  優點:速度快,安全性高,客戶端比較強大
  缺點:每台客戶端計算機都要下載安裝升級,部署維護困難
  例如:QQ,各種網絡游戲
2、B/S類型應用程序:Browser瀏覽器/Server服務器
  客戶端不用安裝特定的軟件,只要通過瀏覽器打開就可使用。
  優點:維護容易,只需要維護服務器
  缺點:速度慢,安全性相對較低,客戶端較弱
  例如:WebQQ,各大網站,各種網頁游戲

什么是Web應用程序?

  Web應用程序是一種可以通過Web訪問的應用程序。Web應用程序的一個最大好處就是用戶很容易訪問應用程序。用戶只要有瀏覽器即可,不需要再安裝其他軟件。web應用程序舉例:淘寶、天貓、新浪、搜狐。web應用程序開發,是目前軟件開發領域的三大方向之一。

web應用程序的優缺點:

優點

  • 網絡應用程序不需要任何復雜的“展開”過程,你所需要的只是一個適用的瀏覽器;
  • 網絡應用程序通常耗費很少的用戶硬盤空間,或者一點都不耗費;
  • 它們不需要更新,因為所有新的特性都在服務器上執行,從而自動傳達到用戶端;
  • 網絡應用程序和服務器端的網絡產品都很容易結合,如email功能和搜索功能;
  • 因為它們在網絡瀏覽器窗口中運行,所以大多數情況下它們是通過跨平台使用的 (例如Windows,Mac,Linux等等)

缺點

  • 網絡應用程序強調瀏覽器的適用性。如果瀏覽器方沒有提供特定的功能,或者棄用特定的平台或操作系統版本(導致不適用),就會影響大量用戶;
  • 網絡應用依靠互聯網遠程服務器端的應用文件。因此,當連接出問題時,應用將不能正常使用。但是,如果使用HTML5 API,這些應用就可以被下載安裝而可離線使用。Google Gears,就是一個好例子;
  • 許多網絡應用程序不是開源的,只能依賴第三方提供的服務,因此不能針對用戶定制化、個性化,而且大多數情況下用戶不能離線使用,因而損失了很多靈活性;
  • 它們完全依賴應用服務商的可及性。如果公司倒閉,服務器停止使用,用戶也無法追索以前的資料。對比而看,即使軟件制造商倒閉了,傳統的安裝軟件也可以繼續運行,盡管不能再更新或有其他用戶服務;
  • 相似地,提供方公司對軟件和其功能有了更大的控制權。只要他們願意就能為軟件添加新特性,即使用戶想等bugs先被解決再更新。跳過較差的軟件版本也不可能了。公司可以強加不受歡迎的特性給用戶,也可以隨意減少帶寬來削減開支。當然,公司會盡量地討用戶歡喜——只在有競爭者提供更好的服務與方便的轉接性的情況下。否則用戶別無選擇,只能默默承受;
  • 公司理論上可以檢索任何的用戶行為。這有可能引起隱私安全問題。

三、Web應用程序的基本結構

一個Web應用程序基本上由以下項目組成:

1.靜態資源(HTML,CSS,圖片,聲音等)
2.Servlet
3.JSP
4.自定義類
5.工具類
6.部署描述文件(web.xml等)、設置信息(Annotation等)

  Web應用程序目錄結構必須符合規范。例如,如果一個應用程序的環境路徑(Context path)是/HelloServlet,則所有的資源項目必須以/HelloServlet為根目錄依規定結構擺放。基本上根目錄中的資源可以直接下載,若index.html位於/HelloServlet下,則可以直接以/HelloServlet/index.html來取得。
  Web應用程序存在一個特殊的/WEB-INF子目錄,此目錄中存在的資源不會被列入應用程序根目錄中可直接訪問的項。即,客戶端(如Browser)不可以直接請求/WEB-INF中的資源(直接在網址上指明訪問/WEB-INF),否則就是404 Not Found的錯誤結果。/WEB-INF中的資源項目有着一定的名稱與結構。

(1)/WEB-INF/web.xml 是部署描述文件
(2)/WEB-INF/classes 用來放置應用程序用到的自定義類(.class),必須包括包(package)結構。
(3)/WEB-INF/lib 用來放置應用程序用到的JAR文件。

四、Tomcat Web服務器的安裝與配置

1、先下載適應於64為Windows操作系統的Tomcat服務器
  地址:http://tomcat.apache.org/
2、解壓tomcat下載壓縮包
3、配置Tomcat服務器的運行環境和Java環境。

我是通過寫bat批處理文件實現,不需要配置Windows系統的環境變量,只需要簡單的寫一個bat批處理文件,點擊運行后即可啟動Tomcat服務器,具體的啟動Tomcat服務器.bat的代碼如下:

rem tomcat安裝bin目錄 set path=D:\code\apache-tomcat\bin rem JDK安裝跟目錄 set JAVA_HOME=C:\program\java\jdk rem tomcat安裝根目錄 set CATALINA_HOME=D:\code\apache-tomcat rem tomcat startup.bat文件路徑 start D:\code\apache-tomcat\bin\startup.bat

  如果配置正確,在瀏覽器輸入 locahost:8080即可打開Tom貓的歡迎頁面。
  現在如果想換掉自己寫的歡迎頁面,比如想在瀏覽器打開locahost:8080地址后,打開一個叫做 zhangphil.html文件,那么需要修改apache-tomcat\conf\web.xml文件,找到web.xml里面的定義welcome-file-list,原始的定義是這樣的:

  通過locahost:8080默認打開的就是welcome-file-list下面定義的文件,Tomcat服務器會自動從上往下尋找列表中的文件,找到就加載。可以在index.html前添加 <welcome-file>welcome.jsp</welcome-file>實現默認的打開自己寫的welcome.jsp文件:

    <welcome-file-list>
        <welcome-file>welcome.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list> 

那welcome.jsp應該放在哪里呢?是在ROOT下面,即apache-tomcat\webapps\ROOT:

修改好web.xml,把welcome.jsp放到ROOT下面,此時再打開http://localhost:8086/后:

 

五、在eclipse中配置Tomcat、JRE

  • 配置JRE

  1、配置JRE環境,通俗點講就是添加一個不同版本的jdk:window-->preferences-->java-->installed jre

  2.點擊添加按鈕

  

  3、選擇一個本機正確的jdk路徑   name和下面lib加載都是系統自動完成的  選擇好路徑后  點 finish就ok了

  •  配置tomcat

  1、window-->preferences-->server-->runtime envrionments

  2、選擇一個tomcat eclipse版本不同 ,可選擇tomcat版本的也不一樣  這里選擇8.0

2、配置tomcat目錄,選擇jdk版本

  

  3、name 系統自動生成 選擇對應版本的tomcat6.0選擇1.6,7.0選擇1.7,8.0選擇1.8不然容易出問題,點擊 finish就ok了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM