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

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

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

第一步:建立Dynamic Web Project瀏覽器

Eclipse下->new->other->web->Dynamic Web Project,名稱咱們就叫TestServlet2服務器

TargetRuntime這個選項,若是你是第一次使用Tomcat的話應該尚未配置,選擇右邊的New Runtime會出現下面的頁面:cookie

我選擇的是v7.0,由於我電腦上裝的就是v7.0.69;session

Configuration右面的選項Modify:咱們暫時只須要Dynamic和Java兩項就能夠,把那個JavaScript前面的勾去掉,點擊Ok;app

點擊next:eclipse

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

繼續點擊next:jsp

直接默認就能夠了,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)



一、session保存在服務器,客戶端不知道其中的信息;cookie保存在客戶端,服務器可以知道其中的信息。  
    
二、session中保存的是對象,cookie中保存的是字符串。  
    
三、session不能區分路徑,同一個用戶在訪問一個網站期間,全部的session在任何一個地方均可以訪問到。而cookie中若是設置了路徑參數,
那麼同一個網站中不一樣路徑下的cookie互相是訪問不到的。  
    
四、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 }
相關文章
相關標籤/搜索