[RESTful] Java Servlet API Server ~2 (helloworld)

上一篇文章中, 我們建立了 Servlet 的編譯環境,
接著, 我們就從最簡單的 helloworld 開始, 介紹如何撰寫第一支 Servlet 程式.
以下是編譯環境中的路徑:
  • 網頁根目錄: /var/lib/tomcat8/webapps/ROOT/
  • tomcat8 library 目錄: /usr/share/tomcat8/lib/
  • tomcat8 log 目錄: /var/lib/tomcat8/logs/
首先, 我們要先定義 Servlet API 的入口,
此文件位於: /var/lib/tomcat8/webapps/ROOT/WEB-INF/web.xml
我們將內容填入如下:

<web-app>
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
</web-app>

在文件中, 定義了 API 的路徑 (servlet-mapping) 以及對應的 Servlet 程式 (servlet),
透過這兩個設定, 我們就建立了 Servlet 與 API Server 之間的呼叫關係,
接著, 我們進行 helloworld 的 Servlet 程式撰寫, 以下為範例:

import java.io.*; 
import javax.servlet.ServletException; 
import javax.servlet.http.*; 

public class HelloWorld extends HttpServlet 
    static final long serialVersionUID = 42L; 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws IOException, ServletException { 
        response.setContentType("text/html"); 
        PrintWriter Printer = response.getWriter(); 
        Printer.println("<html>"); 
        Printer.println("<head>"); 
        Printer.println("\t<title>Java Servlet Example</title>"); 
        Printer.println("</head>"); 
        Printer.println("<body>"); 
        Printer.println("<b>Hello World!</b>"); 
        Printer.println("</body>"); 
        Printer.println("</html>"); 
        return; 
    
}

在範例程式中, 必須先宣告使用 Servlet 的架構 (javax.servlet.*),
並複寫在 Servlet 中 doGet 的方法, 此方法就會對應到 RESTful 的 GET 方法,
此份範例程式會產生一份相對應的 HTTP 文件作為 GET 的回應 (response), 
其中, 包含了表頭 (head) 以及網頁內容 (body),

完成以上程式撰寫之後, 我們需要對此 Java 程式進行編譯,
假設已在: /var/lib/tomcat8/webapps/ROOT//WEB-INF 路徑下執行程式開發,
並已先用 mkdir 指令於此路徑下建立 classes 資料夾,
以下為編譯的指令:

sudo javac -classpath %JAVA_HOME%/lib/j2ee.jar:/usr/share/tomcat8/lib/servlet-api.jar HelloWorld.java
cp ./*.class ./classes
systemctl restart tomcat8

第一行為程式的編譯, 記得要引入j2ee.jarservlet-api.jar兩個library,
第二行將編譯好的 class 檔, 放入 Servlet 用以連結的 classes 資料夾中,
第三行則是重新啟動 tomcat8, 這邊必須重新啟動的原因是:
Servlet 只有在第一次呼叫的時候會生成一個 JVM, 之後有新的呼叫會複用此 JVM,
為了確保新編譯的 class 可以被正確呼叫, 我們重啟 tomcat8, 
確保下一次呼叫的目標是新編譯好的程式.
下圖 (右圖) 是該 helloworld Servlet 被成功呼叫產生的 HTTP 回應:


左圖則是目前開發環境的資料結構,
到目前為止, 我們可以建立一個單純的 Servlet API, 並回應一個 HTTP 網頁,
之後的文章, 我們將在 Servlet 架構下進行資料庫查詢, 並以 JSON 格式回報查詢結果.

參考資料:

留言

熱門文章

LTE筆記: RSRP, RSSI and RSRQ

[WiFi] WiFi 網路的識別: BSS, ESS, SSID, ESSID, BSSID

LTE筆記: 波束成型 (beamforming) 和天線陣列