[置頂] 【一步一個腳印】Tomcat+MySQL為自己的APP打造服務器(2-1)Servlet的使用
來源:程序員人生 發布時間:2016-06-29 10:26:57 閱讀次數:4520次
最近工作上效力比較低,各種需求更改耗費了大量的時間本錢(不吐槽,你懂的,已無力),高的身心俱疲。... ... 每次空話都比較多,我也是服了自己了,就當我是來湊字數的吧
!不空話了,開始正題:
翻了1下上1篇文章,發現沒有裝開發環境,這里補上——在【1步1個腳印】Tomcat+MySQL為自己的APP打造服務器(1)服務器環境搭建中已配好了JDK,這次直接找1個JavaEE版本的Eclipse解壓到我們想安裝的目錄下便可,用過
Eclipse+ADT 開發 Android 的同學都知道 Eclipse 是免安裝的,在 /eclipse 下直接打開 eclipse.exe 便可。
到此我們只是簡單安裝了1個服務器的運行環境,現在我們開始寫自己的服務器程序。 不管你是學Java的,還是 Android 的,肯定都學過 Core-Java 課程,那末你肯定學過 Servlet ,也許你忘了,但這無所謂,我們重新開始。
1、Servlet簡介
摘自書上的1小段解釋——“Java Servlet 是運行在 Web 服務器或利用服務器上的程序,它是作為來自 Web 閱讀器或其他 HTTP 客戶真個要求和 HTTP 服務器上的數據庫或利用程序之間的中間層。使用 Servlet,您可以搜集來自網頁表單的用戶輸入,顯現來自數據庫或其他源的記錄,還可以動態創建網頁”。Servlet 是 sun 公司提供的1門用于開發動態
web 資源的技術。其實,"Servlet"本來是指 Java語言實現的1個接口(狹義的Servlet),但更多的也更普遍的情況是:我們把任何實現了 Servlet 接口的類都叫作 "Servlet"。Servlet 的作用主要是對 Request 的要求數據進行解析、依照業務邏輯處理并將結果封裝成 Response 返回我的理解就是“讀-計算-寫”,像數學計算器1樣,輸入操作數、操作符按"等于"就顯示出結果;也像人的腦神經元1樣“接受刺激-信號處理-作出響應”。為了便于理解,我們來漸漸拆解:
2、Servlet在服務器中的位置
在普通用戶看來,我們平時使用互聯網就像下圖這樣:

普通用戶只關心自己作為1個客戶端,是和1個叫服務器的東西在進行數據交互,具體服務器在哪里、做甚么、怎樣實現、數據庫用哪一種... ...這些都不重要。
而作為開發者的我們,用戶不關心的問題我們卻應當視如家珍(這是我們吃飯的家伙?。覀儗?a href="http://www.vxbq.cn/server/" target="_blank">服務器部份放大,從1個入門級的服務器開發者的角度來看看服務器的構造(這里僅以 Servlet 為例):

服務器接收來自不同用戶的不同的要求(固然是以該服務器作為要求目標的那些要求),分析不同的要求,控制模塊將各自的要求分送至對應的 Servlet (如登陸要求,則將登陸數據送至LoginServlet),然后 Servlet 根據要求內容處理業務邏輯(如登陸要求則解析用戶名密碼,并和數據庫中保存的用戶名密碼進行對照,得出是不是是合法用戶的結論),完成響應數據的封裝返回給控制模塊,控制模塊再將該響應返回給對應的要求用戶,這樣即完成1次網絡交互。
3、從小白開始使用Servlet
下面,我們來1步1步開始使用 Servlet 創建1個利用服務器:
在 JavaEE 版的 Eclipse 中創建 Dynamic Web Project (我們這里以1個全新的 workspace 為例,為何用1個新的workspace?后邊會觸及到):
接下來的步驟都默許,Next 直到下圖:
到此,工程創建成功,我們來簡單了解1下目錄結構:
這里需要說明1下:在創建工程時我們的 Dynamic web module version 選項默許選擇的3.0,就會出現后面要勾選 Generate web.xml deployment descriptor 才能創建 web.xml 文件的情況,若是3.0之前的版本是沒有這個勾選選項的,而web.xml文件是默許創建的。這是由于Servlet3.0
的新注解機制的結果。
新建 Servlet 類:
不知道是甚么就先Add1下,待會看看是甚么。
URL mappings,我更改成 /Home/FirstServlet:
NEXT:
看1看都重寫了哪些方法,最后 finish,我們第1個Servlet就創建好了。
打開剛創建的 FirstServlet.java 看看——Oh!Shit!你會驚訝的發現“祖國江山1片紅”,各種類未定義、各種包找不見!不要驚訝,這就是剛開始我們以1個全新的 WorkSpace 為例的緣由。
發現問題解決問題,我們是天不怕地不怕的程序猿
!
還記得我在創建 Servlet 時指定名字的下1個選項嗎?就是這個:
,可以看到Servlet的父類是 java.servlet.http.HttpServlet,而在這里找不到,說明還缺東西,不是
.jar 就是環境。——這就是問題所在。
問題本源找到就容易解決了——還記得我們1開始創建 Dynamic Web Project 的時候并沒有指定 Target runtime 嗎?這就是指定運行時環境,就是我們比較外行的說法-環境問題。沒關系,現在我們再來做這件事:
在 Project Explorer 空白區域 > 右鍵 > New > Other > 選擇Server:
NEXT > 選擇Tomcat Server(由于我的 Tomcat 裝的是8.0.32,我在【1步1個腳印】Tomcat+MySQL為自己的APP打造服務器(1)服務器環境搭建中給的也是這個版本,所以這里選
v8.0,各位要根據自己的 Tomcat 選擇相應的版本):
NEXT > 設置 Tomcat 安裝路徑(JRE可以workspace默許的JRE,也能夠選擇1個特定的JRE,如JRE1.7),以后 finish完成:
(也能夠Next > 將之前創建的 工程Add到服務器中,再finish,這1步是可選的):
發現之前各種毛病1片紅還是沒有解決?不要著急,再1步就弄定了——
剛剛創建的工程"右鍵" > properties > Targeted Runtimes,勾選剛創建好的Server,OK,看看工程,正常了吧?固然,這些創建或選擇 Target Runtime 也能夠在創建工程的時候就做,只是我這里單獨拿出來走1遍而已,讓我們都印象深入1點。好了,這個問題解決了。繼續回到我們的主線。
我們再來看之前留下的那個問題——Initialization parameters、URL mappings 是甚么,字面意思就是初始化參數、URL 映照。結合上下文,我們是在創建 Servlet 的時候編輯的這些內容,所以初始化參數肯定是這個 Servlet 的參數,URL 映照也肯定是這個 Servlet 的路徑映照。
為了比較,我們再創建1個 PreferenceServlet ,在創建進程中可以不填的選項都不填,對照1下代碼,會發現不同的地只有有以下:
FirstServlet中有:
@WebServlet(description = "學習Servlet創建的", urlPatterns = { "/Home/FirstServlet" }, initParams = {
@WebInitParam(name = "userName", value = "abc", description = "用戶姓名") })
PreferenceServlet中為:@WebServlet("/Home/PreferenceServlet")
可以發現,之前添加的這些選項都是以注解的方式出現的1些說明、初始化參數。為了理解這1點,我找出了Servlet3.0之前版本的 web.xml文件中對Servlet的配置文件內容進行說明: <servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>servlet.FirstServlet</servlet-class>
<init-param>
<param-name>userName</param-name>
<param-value>abc</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/Home/FirstServlet</url-pattern>
</servlet-mapping>
這兩種寫法的功能是1樣的,只是Servlet3.0以后支持注解的方式進行配置更方便、更高效而已。<servlet>標簽和<servlet-mapping>標簽相互對應,servlet-name
必須1致(可以有多個mapping對應1個Servlet,即多個地址對應1個目標),當1個要求到達后,
服務器先在<servlet-mapping>中尋覓匹配的地址,然后用對應的 servlet-name 在<servlet>標簽中匹配該要求 Servlet 對應的Java類,然后將要求發送至該類;初始化參數可用 getInitParameter("parameterName") 來獲得。
用事實說話,在上邊我們創建的 FirstServlet中的 doget 方法中以下: protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().append("\n初始化參數userName = " + getInitParameter("userName"));
}
然后工程上右鍵>Run As:
Server選擇之前創建的,Add該工程到服務器配置,finish。出現
即說明運行成功了!
在閱讀器地址欄輸入http://localhost:8080/ServletTest/Home/FirstServlet
回車,會看到:
好了,初步成功了。如果你是個新手,肯定還有很多地方不知道為何,比如要求地址為何這樣寫?Servlet 的響應怎樣返回的?為何顯示的中文成了亂碼?沒關系,萬事都不是一揮而就的,我們就像標題1樣,1步1個腳印,仔仔細細來。限于篇幅,本以為1篇就可以說完,沒想到還是留下了很多的內容,我們下篇繼續。
由于本人水平有限,如有問題請不吝賜教。若對我的文章比較滿意,請靜待下1篇的到來,_程序猿大人_在此謝過。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈