1. 程式人生 > >Web三大元件之 —— servlet

Web三大元件之 —— servlet

本文純屬於個人觀點,如果有不對的地方,還請各位看官多加批評指正,完善我的知識體系。

應用程式:包括 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 架構

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的值之後,你就可以做一些操作了。