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:
①存在於客戶端(可被阻止)
②只能是文本文檔
③若是設置了期限值,則寫入客戶端的文件;
若是沒有,它只對本窗口或其子窗口有效,其它窗口不能訪問該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 }