Servlet是對應客戶端(瀏覽器)的窗口
上一章為了簡單測試專案的基本框架是否架好,我們直接用網址拜訪了jsp網頁。
不過在實際的網站中,這種拜訪有安全問題。
正確的方式是用網址訪問Servlet,再由Servlet指派合適的網頁給使用者。
也就是客戶只能跟窗口接洽,不能隨意聯絡其他內部員工,不然會壞了規矩。
試著幫空殼網站弄個窗口出來吧!
在Java Sources->src裡面新增一個包(package),命名為com.aaa.action
src是放置各種JAVA檔案的地方,可以在裡面開發各種具有功能的JAVA檔案。
這些檔案寫好了之後,透過掛載(新增專案時)或Publish(修改內容時)到Tomcat伺服器,會自動被轉換成可執行檔。
在src下面,為了開發方便會使用資料夾來區分各類檔案,也就是包(package)。
包的名稱全都是小寫,用"."作為分隔符。
com表示使用範圍是國際,aaa表示公司名稱,action則是表示專門放置servlet(窗口)的資料夾。
如果公司名下有許多專案,可以在公司名後面多加一節專案名稱。例如:
com.aaa.firstproject.action
首先先把各種包建立起來,如果以餐廳來比喻一個網站的話,以下是各個包應放置的人員。
com.aaa.action (餐廳經理)
com.aaa.biz (廚師,依照業務邏輯"料理"各種資料)
com.aaa.dao (跑腿小弟,被廚師呼喚時就要去冰箱(資料庫)拿菜)
在com.aaa.action包下建立HelloSvl,這是負責hello world頁面的經理。
使用servlet的預設模板可以省點工,如下:
new->servlet
它會預設繼承HttpServlet類,相當於是接受過基本的經理培訓,具有經理所需的基本技能。
傳統的Servlet需要在WEB-INF的web.xml(類似員工名簿)裡面登記才能發揮功用。
不過假如一間公司裡面幾百個員工,有任何變動都要寫名簿的話就很麻煩。現在可以直接使用掃描的方式。
剛剛新建的HelloSvl檔案裡,在class定義的前面有一行@WebServlet("/HelloSvl")
這個就是供掃描用的識別標籤,伺服器會自動掃描所有具有特定標籤的檔案並登錄。
弄好了經理之後,再弄個廚師手下給他。
在com.aaa.biz包下new->class
package com.aaa.biz;
public class HelloBiz {
public String say(String name) {
}
}
剛剛的經理只有空殼,再追加一下呼叫廚師的方法。改寫doGet方法如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//新建一個廚師的實例,建好後IDE會提示你找不到這個類,需要import,點選import即可。
HelloBiz biz = new HelloBiz();
//把從客人來的資訊傳遞給廚師,讓他處理後回傳。
String msg = biz.say("Tom");
//request是個好用小提包,可以在網頁和後台之間傳遞資料。裡面的屬性名稱可以自訂。
request.setAttribute("clientName", msg);
//把從廚師那拿到的菜傳給指定的服務生(jsp頁面)上菜。
request.getRequestDispatcher("/main/hello.jsp").forward(request, response);
}
回到Hello.jsp檔案,把剛才寫死的文字改為後台傳來的資料。
從"Hello world"改為 ${clientName}
※ ${}是EL表達式,可以叫出request裡面的屬性。
萬事俱備後,在server上點右鍵選publish,把剛剛寫好的後台程式們更新到伺服器上,然後打開推進器..
http://localhost:8080/Hello/HelloSvl
如果不用EL表達式,也可以直接在JSP頁面使用JAVA語法取得資料如下:
<%=request.getAttribute("clientName") %>
※ <%%>表示JAVA程式碼
※ 修改JSP頁面不需要重啟伺服器或publish之類的,只要重刷頁面就可以。
到此為止簡單的網站已經可以運作了,整理一下重點:
所有JAVA檔案都放在java resources->src下面。
它是個source folder,意思是當專案被掛載到Tomcat上時,這個資料夾裡的檔案會被編譯然後放在WebContent裡的WEB-INF資料夾裡。
要反映修改後的檔案時,使用伺服器的Publish功能進行更新。
WebContent就是放置整個網站內容的資料夾。
除了預設的META-INF和WEB-INF拿來放設定檔和寫好的程式以外,其他在WebContent的內容都可以被直接訪問。
裡面可以放一些圖片、文字等靜態資料,或是JSP頁面之類的,透過url網址訪問。例如:
http://localhost:8080/Hello/main/hello.jsp
http://localhost:8080/Hello/pic/pictureA.jpg
http://localhost:8080/Hello/memo.txt
這些資源由於不需要被編譯,因此如果有修改也不須重啟伺服器和Publish。
只要重新整理頁面,伺服器就會重新讀取它們(※jsp頁面的修正不用重啟伺服器)。