Servlet學習筆記(1)--第一個servlet&&三種狀態對象(cookie,session,application)&&Servlet的生命周期


servlet的404錯誤困擾了兩天,各種方法都試過了,翻書逛論壇終於把問題解決了,寫此博客來紀念自己的第一個servlet經歷。

下面我會將自己的編寫第一個servlet的詳細過程提供給初學者,大神們可以自動過濾掉。下面的步驟有這樣的前提:你的eclipse嵌入了TomCat插件(我們會在Eclipse上操作servlet)或者本地主機已經有安裝好某一個版本的TomCat,我這里用的是Tomcat7.0.69.

第一步:創建Dynamic Web Project

Eclipse下->new->other->web->Dynamic Web Project,名稱我們就叫TestServlet2

TargetRuntime這個選項,如果你是第一次使用Tomcat的話應該還沒有配置,選擇右邊的New Runtime會出現下面的頁面:

我選擇的是v7.0,因為我電腦上裝的就是v7.0.69;

Configuration右面的選項Modify:我們暫時只需要Dynamic和Java兩項就可以,把那個JavaScript前面的勾去掉,點擊Ok;

點擊next:

src是我們源代碼的目錄位置,下面的Default output folder是我們源代碼編譯之后的.class文件的輸出位置,我們這里改成WEB-INF/classes(為了與我們把應用發布到TomCat的webapps下的目錄一致,方便理解,此時我們的build目錄就沒啥用了,等下它自動生成的時候就可以刪除了);

繼續點擊next:

直接默認就可以了,Context root是我們web應用的主目錄,Context directory是我們存放JSP文件其他文件的,里面包括兩個文件夾META-INF和WEB-INF,最后勾選自動配置web.xml文件;

現在的項目目錄如下圖所示:

第二步:寫我們的servlet

在src目錄下新建一個class,類名就叫做HelloWorldServlet,添加一個包:com.ysw.servlet

在HelloWorldServlet中添加如下代碼:我們這里用extends HttpServlet的方式來編寫,其他兩種方式大家可以自己Google一下;

 1 package com.ysw.servlet;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 public class HelloWorldServlet extends HttpServlet {
11 
12     private static final long serialVersionUID = 1L;
13 
14     @Override
15     protected void doGet(HttpServletRequest request,
16             HttpServletResponse response) throws ServletException, IOException {
17         System.out.println("doGet");
18     }
19 }

實現的簡單功能是在我們Eclipse的控制台打印"doGet"字符串;
第三步:配置文件web.xml

 1 <web-app xmlns="http://java.sun.com/xml/ns/javaee"
 2   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
 4                       http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
 5   version="3.0">
 6 
 7  <servlet>
 8     <description>This is the description of my J2EE component</description>
 9     <display-name>This is the display name of my J2EE component</display-name>
10         <servlet-name>HW</servlet-name>
11         <servlet-class>com.ysw.servlet.HelloWorldServlet2</servlet-class>
12     </servlet>
13     <servlet-mapping>
14         <servlet-name>HW</servlet-name>
15         <url-pattern>/abc</url-pattern>
16     </servlet-mapping>
17    <session-config>
18    <session-timeout>20</session-timeout>
19    </session-config>
20 </web-app>

在我們的WEB-INF目錄下有一個web.xml文件,我們在其中添加如下內容:每一個標簽代表啥意思大家自己查一下,學習的過程是痛並快樂着;

我還是說一下吧:<servlet-name>是給我們的servlet起一個名字,可以是任意的;<servlet-class>指向我們要注冊的servlet的類地址,這里一定要注意:如果你的程序使用了包,比如我的程序中的包名是com.ysw.servlet

<servlet-mapping>中的servlet-name與我們上面定義的<servlet>中的那個<servelt-name>一定要一致;<url-pattern>意思是我們在瀏覽器中輸入/abc這種形式就能訪問到Tomcat上相應的資源

第四步:修改Project下的.class文件

在我的電腦上是這樣的:

編輯.classpath文件,將<classpathentry kind="output" path="build/classes"/>這一項中的path改成我們前面已經說過的WEB-INF/classes目錄,即:<classpathentry kind="output" path="WEB-INF/classes"/>保存退出;

【重要的一步】:右鍵工程(TestServlet2)->Build Project,eclipse一般默認都是自動編譯代碼,只要你的代碼修改后保存,eclipse是會自動編譯成class文件的。但如果你修改過配置,eclipse不是自動編譯方式,那么就要點擊這個build project選項手動把代碼編譯成class文件了。

第五步:在Tomcat上運行我們的servlet

點擊以后出現下面的界面:選擇我們先前配置的相應版本的Tomcat7.0.69,你的機器因人而異

點擊->next,會讓我們選擇要運行的servlet,將要運行的servley移動到右面區域,點擊->finashed這是就可以從控制台開到Tomcat的啟動,

你看到的是這樣的情況:

【沒有消息就是最好的消息】:最下面切換到console這一視圖,刷新一下我們上圖的那個瀏覽器,我們可以看到:

可以看到我們的打印輸出信息;

第六步:將我們的web應用部署到Tomcat服務器

在Tomcat的webapps目錄下新建一個名稱為myWebSite的文件夾,這個文件夾就是我們web應用的根目錄。在myWebSite內新建一個名稱叫做WEB-INF(這個名稱是固定的,不能用其他名稱),然后在WEB-INF文件夾內新建一個名稱為classes的文件夾,用於存放我們編譯好的.class文件,在WEB-INF文件夾內還有一個文件,就是我們前面提到的web.xml文件,直接放在這個位置就可以了.

在class文件夾下放我們編譯好的class文件,其實只要把我們在的工程TestServlet2下的WEB-INF下的class文件夾拷貝過來就行(這個時候我們在前面的操作:<classpathentry kind="output" path="WEB-INF/classes"/>),

在這里就方便我們的應用發布了,因為我程序中用到了包com.ysw.servlet,因此class文件下也包括了各級目錄;

接下來就是要用瀏覽器訪問我們的servlet:首先要關閉掉Eclipse中我們之前一直運行的TomCat服務,否則我們在cmd下無法啟動TomCat;

啟動服務以后可以清楚的看到我們的應用得到了配置和部署:

在瀏覽器下我們輸入:http://localhost:8080/myWebSite/abc

可以看到:doGet得以輸出,至此我的第一個Servlet完成!

cookie,session,application的區別:這部分轉載自:http://blog.csdn.net/u010214269/article/details/44801567

Cookie: 

  ①存在於客戶端(可被阻止)

  ②只能是文本文檔 
  ③如果設置了期限值,則寫入客戶端的文件; 
  如果沒有,它只對本窗口或其子窗口有效,其它窗口不能訪問該Cookie 
  ④在Servlet/JSP中設置的Cookie可以被同路徑下或其子路徑的Servlet/JSP訪問,父路徑不可以 
  ○注:這里的路徑是指URL,而不是Web文件的目錄 
Session: 

  ①存在於服務器端

  ②每個Session對應一個窗口,用SessionID標識,這個Session為該窗口及其子窗口共享 
  ③有兩種實現方式:a.使用Cookie(在Cookie可用時)b.URL重寫(在Cookie被禁用時) 
  ④沒有訪問路徑的問題。同一個WebApplication下的Servlet/JSP設置的Session可以被互相訪問 
  前提是:同一個瀏覽器窗口或其子窗口 
Application:

  與一個Web應用程序相對應,該應用程序下所有的Servlet/JSP共用該Application中的信息(ServletContext)



1、session保存在服務器,客戶端不知道其中的信息;cookie保存在客戶端,服務器能夠知道其中的信息。  
    
2、session中保存的是對象,cookie中保存的是字符串。  
    
3、session不能區分路徑,同一個用戶在訪問一個網站期間,所有的session在任何一個地方都可以訪問到。而cookie中如果設置了路徑參數,
那么同一個網站中不同路徑下的cookie互相是訪問不到的。  
    
4、session需要借助cookie才能正常工作。如果客戶端完全禁止cookie,session將失效。 但是如果服務器端啟用了url編碼,也就是用  
URLEncoder.encode()把所有的url編碼了,則會在url后面出現如下類似的東西  
index.jsp:jsessionid=fdsaffjdlks;jaf;lkdjsf  

服務器通過這個進行session的判斷  


5 session在用戶會話結束后就會關閉了,但cookie因為保存在客戶端,可以長期保存  


Cookie存儲的信息是放到客戶端的,用戶在訪問服務器端頁面時,必然在客戶端和服務器端之間頻繁交換信息,影響了程序的性能。而Session由於存儲在服務器內存中,因此不存在這個問題。不過,Session存儲的信息是臨時的,用戶一旦關閉瀏覽器,狀態即失去。而Cookie則相反。COOKIE 是本地文件,是 40 大盜在阿里巴巴家做的記號,或者是送牛奶的人在你家門口釘的箱子。  


Application狀態為應用程序提供了一個全局的狀態。所有客戶都可以使用該狀態。從設計的角度來說,我們通常用Application來存儲一些標准的數據。同時,我們在使用它時要注意避免性能的降低,存儲的數據盡可能提供給客戶只讀的功能。 APPLICATION 是公共浴池。在這里能看見所有人,包括 ppmm 哦:)。  


Session和客戶端的Cookie是有關的,當客戶關掉Cookie時,Session就失效了,SESSION 是服務器端內存,是你洗澡時浴池發給你的鑰匙。自己專用,可以開自己的好多箱子。

Application:

application是應用級別的,同一個應用中的所有用戶將共享此對象。因此,我們利用application對象來存儲一些壞境信息。

Request:

      Request也可以像Session那樣使用,但是它第二次請求服務器頁面時就失去存儲功能了

     request的范圍只在一jsp頁發出請求到另一頁之間,隨后這個屬性失效;
     session范圍是用戶和服務器連接的那段時間,用戶與服務器斷開屬性就失效;
     application作用范圍最大,慎用,在服務器一開始執行服務到服務器關閉為止。可能造成服務器負載過重。  

Servlet的生命周期
  * API中的生命周期:一個servlet只有一個對象(實例)
  * 1.加載(classLoader)將類加載進來
  * 2.實例化,new一個對象
  * 3.初始化:調用init(ServletConfig)方法
  * 4.處理請求:service doGet  doPost(http協議)
  * 5.退出服務:destory()
  * init():只執行一次
  * destory():
  * doGet():
  * service():

驗證servlet的生命周期的代碼:

 1 package com.ysw.servlet;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletConfig;
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 /**
12  * 
13  * @author Administrator
14  *
15  */
16 public class TestLifeCycleServlet extends HttpServlet {
17     
18     /**
19      * API中的生命周期:一個servlet只有一個對象(實例)
20      * 1.加載(classLoader)將類加載進來
21      * 2.實例化,new一個對象
22      * 3.初始化:調用init(ServletConfig)方法
23      * 4.處理請求:service doGet  doPost(http協議)
24      * 5.退出服務:destory()
25      * init():只執行一次
26      * destory():
27      * doGet():
28      * service():
29      */
30     private static final long serialVersionUID = 1L;
31     @Override
32     public void destroy() {
33         
34         System.out.println("destory");
35     }
36 
37 
38     @Override
39     protected void doGet(HttpServletRequest request, HttpServletResponse response)
40             throws ServletException, IOException {
41         
42         System.out.println("doGet");
43     }
44 
45     @Override
46     public void init(ServletConfig config) throws ServletException {
47         
48         System.out.println("init");
49     }
50 
51 
52     public TestLifeCycleServlet() {
53         System.out.println("constructor!");
54     }
55     
56 
57 }

 


免責聲明!

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



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