Web三大元件之 —— servlet
阿新 • • 發佈:2019-01-26
本文純屬於個人觀點,如果有不對的地方,還請各位看官多加批評指正,完善我的知識體系。
應用程式:包括 Web 應用程式 和 非 Web 應用程式。
- Web應用程式:是一種部署在伺服器上,可以通過Web(瀏覽器)訪問的應用程式。程式的最大好處是使用者很容易訪問應用程式,不需要再安裝其他軟體,客戶端零維護。 又稱 B/S 架構(browser / service)
- 非 Web 應用程式:是一種安裝在電腦端的應用程式,客戶端需要安裝專用的客戶端軟體。又稱 C/S 架構(Client/Server)。
今天著重說下 JavaWeb 應用程式。
Eclipse 分別建立兩個應用程式:普通的 Java Project 和 Web Project
選擇 Run on Server 程式啟動報錯。
- 瀏覽器位址列有一個新的訪問地址;
- 頁面報 HTTP404;
帶著這樣的疑問進行接下來的學習。
首先介紹一個概念:Servlet
Java Servlet 是執行在 Web 伺服器或應用伺服器上的程式,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 伺服器上的資料庫或應用程式之間的中間層。
Servlet 架構 |
其次介紹:web.xml
每個 JavaEE 專案都包含了 一個 web.xml 檔案,但 web.xml 不是 JavaEE 專案必須依賴的檔案。
web.xml 的作用:用來初始化配置資訊:比如初始頁面、servlet、servlet-mapping、filter、listener、啟動載入級別等。
所以把工程的程式碼補完整
專案類程式碼 實現 Servlet 繼承
package cn.hcg.test; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class J2EETest implements Servlet{ @Override public void init(ServletConfig config) throws ServletException { System.out.println("hello init"); } @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("hello service"); } @Override public void destroy() { System.out.println("goodbye servlet"); } @Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { return null; } }
因為 Web 服務一般用的都是 Http 請求 也可以直接 實現 HttpServlet,重寫 service 方法。以避免後期 request 和 response 轉換
public class HttpServletDemo extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) {
}
}
web.xml 註冊
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>J2EETest</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!--註冊自己要使用的(servlet)類 -->
<servlet>
<servlet-name>J2EETest</servlet-name>
<servlet-class>cn.hcg.test.J2EETest</servlet-class>
</servlet>
<!-- 向瀏覽器公佈自己的 servlet 的訪問路徑 -->
<servlet-mapping>
<servlet-name>J2EETest</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
注意:
一:其中 servlet-name 是 mapping 中的 name 必須相同,且都是自定義的。
二:<url-pattern>
1.完全匹配路徑:必須 ‘ / ’ 開頭
例如:/hello 、/a/b/c/hello
訪問路徑和 web.xml配置路徑一致,servlet將被呼叫。
2.不完全匹配(萬用字元匹配)' / '開頭,以*結尾
例如:/* 、 /a/b/*
/a/b/* ,a目錄下的b目錄下的所有內容
/* 當前專案下所有內容
3.副檔名匹配 *開頭
例如:*.do 、*.action 、 *.jsp
只處理某一類檔案
4. 預設路徑 /
以上都沒有匹配,將執行預設
優先順序:1 > 2 > 3 > 4
預設servlet:如果一個servlet的對外訪問路徑被設定為/,則該servlet就是一個預設servlet,其他servlet不處理的請求都由它來處理
~在conf/web.xml中配置了預設servlet,對靜態資源的訪問和錯誤頁面的輸出就是由這個預設servlet來處理的。
如果我們自己寫一個預設servlet把web.xml中的預設servlet覆蓋的話,會導致靜態web資源無法訪問。所以不推薦配置。
注意:錯誤寫法 /*.jsp
1. 啟動WEB專案的時候,容器首先會去它的配置檔案web.xml讀取兩個節點: <listener></listener>和<context-param></context-param>。
2. 緊接著,容器建立一個ServletContext(application),這個WEB專案所有部分都將共享這個上下文。
3. 容器以<context-param></context-param>的name作為鍵,value作為值,將其轉化為鍵值對,存入ServletContext。
4. 容器建立<listener></listener>中的類例項,根據配置的class類路徑<listener-class>來建立監聽,在監聽中會有contextInitialized(ServletContextEvent args)初始化方法,啟動Web應用時,系統呼叫Listener的該方法,在這個方法中獲得:
ServletContext application = ServletContextEvent.getServletContext();
context-param的值 = application.getInitParameter("context-param的鍵"); 得到這個context-param的值之後,你就可以做一些操作了。