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 }