---
# System prepended metadata

title: 點我呀

---

# 點我呀
有點東西囉 HEHE

[TOC]

**會前準備:**
>1. 之前到現在的專案是否有"Servlet"關鍵字出現? 
   (HttpServletRequest和HttpServletResponse大家都看過所以略  哈哈)
>2. 簡述SpringBoot和SpringMVC差異
>
> [**可先clone此實作專案**](https://github.com/Star530123/ServletIntro)

---

# Servlet是什麼
- 是API
- 是可運行在Web Container且可產出動態網頁的程式


# 核心祖宗三代
## Servlet 
- javax.servlet.Servlet
- Interface
- 總共有5個method
    ![](https://i.imgur.com/3UGntRs.png)

## GenericServlet
- javax.servlet.GenericServlet
- Abstract class，實作Servlet
- 為通用的Servlet類別，若要使用其他的協議則繼承此類別

## HttpServlet
- javax.servlet.http.HttpServlet
- Abstract class，繼承GenericServlet
- 廣義的Servlet就是此類別，要接收HTTP的Request和送出Response就要透過繼承此類別
- 透過web.xml或是@WebServlet配置

# Servlet Life Cycle
![image](https://static.javatpoint.com/images/servletlife.jpg)
- 主要實作就是在service方法中
- destroy幾乎是用不到，Web container會在結束時調用此方法銷毀Servlet

# 部署至Tomcat
Project右鍵 -> Export -> WAR file
## 目錄架構
![image](https://static.javatpoint.com/images/directory.JPG)
* WEB-INF : 用戶端不可直接存取裡面的項目，但可以在程式中調用裡面的資源
    -> 外層放置用戶端可調用的資源 
    
    
![image](https://i.imgur.com/wOzhpQB.png)

# 請求轉發
## RequestDispatcher

## sendRedirect

# 阿這兩個怎麼分 ServletConfig、ServletContext
## ServletConfig

- 傳遞初始化Servlet時的資訊
- 每個Servlet都會被web container創造一個ServletConfig
- 可以在web.xml調整配置
- 透過 &lt;init-param&gt;設置初始值
- 從Servlet可取得
    -> 沒有用Servlet，就不會用到這個

## ServletContext

- 在Servlet間傳遞共同資訊
- 在部署的時候就會被創建 (每個web application只有一個)
- 可以在web.xml調整配置
- 透過&lt;context-param&gt;設置參數
- 從GenericServlet、ServletConfig或**ServletRequest**可取得
    -> 即使沒有使用Servlet也可從ServletRequest和HttpServletRequest取得!

使用例子 : servletContext取得SessionCookieConfig後，可設置HttpOnly

### 比較

|          | 描述 | 數量(在一個網路應用程式中) | 如何取得 | 從哪裡取得|
| -------- | -------- | -------- |--------|--------|
| ServletConfig | Servlet的初始參數     | 多個(調用Servlet時創建)    |`getServletConfig() `|Servlet|
| ServletContext | Servlet運行的環境狀態、參數     | 一個(部署時創建)     |`getServletContext()`|GenericServlet ServletConfig ServletRequest|


# Filter
- 做Request的前置(preprocessing) 或後置(postprocessing)處理
- 可用來做資料驗證、log紀錄、加/解密...等等
- 透過web.xml或@WebFilter配置

# Event and Listener
## Event
- 一個物件的狀態改變就是一個事件(event)

## Listener
- 監聽特定事件是否發生並做出相應處置
- 透過web.xml或@WebListener配置
- 例子 : ServletRequestListener 監聽 ServletRequestEvent
當收到Request時，實作requestInitialized方法
當釋出Request時，實作requestDestroyed方法


# 資料來源
[Servlets | Servlet Tutorial](https://www.javatpoint.com/servlet-tutorial)
[何謂容器](https://openhome.cc/Gossip/ServletJSP/Container.html)
[HttpOnly - HTTP Headers 的資安議題](https://devco.re/blog/2014/06/11/setcookie-httponly-security-issues-of-http-headers-3/)
[目錄架構](https://openhome.cc/Gossip/ServletJSP/DirectoryStructure.html)

