java自學之路-----Servlet_基礎

Servlet基礎{

定義:是sun公司提供的一門用於開發動態web資源的技術

步驟:1.編寫一個java類 2.把開發好的java類部署到web服務器中

調用流程:

Servlet程序是由web服務器調用的,web服務器接收到了客戶端的Servlet訪問請求後:

1.web服務器先判斷是否裝載並創建了Servlet實例對象,如果是執行第4步,否執行第二步

2.裝載並創建了該Servlet的一個實例對象

3.調用Servlet實例對象的init的方法

4.創建request和response,調用Servlet的service方法,請求和響應作爲參數傳入

5.WEB應用程序被停止或者重新啓動之前,Servlet先調用destroy方法,Servlet引擎再卸載Servlet對象,



兩個實現類(不需要覆蓋全部方法){

GenericServlet:Servlet的默認實現類

HttpServlet:

1.指能夠處理Http請求的servlet,在原有的Servlet接口上添加了一些與HTTP協議處理方法,比Servlet接口的功能更強大

2.該實現類覆寫了service方法,該方法體內的代碼會自動判斷用戶是以什麼方式提交的請求。如果是GET提交就調用doget方法,POST請求就調用dopost方法,開發人員通常只需要覆蓋doGet和doPost方法即可

}

web.xml{

由於客戶端是通過URL地址訪問服務器的資源的,所以Servlet程序想要被外界訪問到就需要映射到一個URL地址上,這個工作就在web.xml文件中完成

  <servlet>
    <servlet-name>LoginServlet</servlet-name><!-- 設置Servlet的註冊名稱 -->
    <servlet-class>cn.halm.web.client.LoginServlet</servlet-class><!-- Servlet的完整類名 -->
  </servlet>
 <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name><!-- Servlet的註冊名稱 -->
    <url-pattern>/client/LoginServlet</url-pattern><!-- Servlet的對外訪問路徑 -->
  </servlet-mapping>

注意:

1.同一個Servlet可以被映射到多個URL地址上,即多個<servlet-mapping>元素的<servlet-name>子元素的設置值可以是同一個Servlet的註冊名

2.如果在<Servlet>元素中配置了<load-on-startup>元素,那麼WEB服務器在啓動時,就會裝載並創建Servlet的實例對象,以及調用init方法

3.在Servlet的映射地址中可以使用通配符*,有兩種固定格式:1. "*.擴展名 " 2. " /*"

4.如果某個Servlet的映射路徑爲正斜槓(/),表示這個Servlet爲當前Web應用的程序的缺省Servlet(WEB服務器有定義一個缺省的Servlet)

5.凡是在web.xml找不到的匹配的URL時,他們的訪問請求都會交給缺省Servlet。當訪問靜態文件時,實際上就是先訪問缺省的Servlet,再由這個Servlet找靜態文件

6.Servlet是一個供其他java程序(servlet引擎即web服務器)調用的java類,它不可以獨立運行,它完全由Servlet引擎來控制和調度

7.對於客戶端的多次Servlet請求,通常服務器只會創建一個Servlet實例對象,也就是Servlet實例對象一旦被創建就會駐留在內存中,供其他請求服務,直到web容器退出,Servlet實例對象才被摧毀

8.在Servlet的生命週期內,Servlet對象的的init方法只會被調用一次。而對於每次訪問請求都會導致Servlet引擎調用一次Servlet的service方法。對於每次請求Servlet引擎都會創建一個新的HttpServletRequest對象和HttpServletResponse對象,作爲參數傳入service方法,然後再根據請求方式調用doXXX方法。

9.HttpServletRequest對象和HttpServletResponse對象,他們的生命週期很短,請求結束就會銷燬

線程安全問題:(當有資源共享的時候才需要考慮線程安全問題)

1.當多個客戶端併發訪問同一個Servlet時,web服務器會爲每一個客戶端的訪問請求創建一個新的線程,並在這個線程上調用service方法時,如果有使用到共享資源的話就會引起線程安全問題

2.如果Servlet實現了SingleThreadModel接口,那麼Servlet引擎就會以單線程模式來調用service方法。這個接口是一個標記接口,不需要實現任何方法,只要在定義Servlet類,增加聲明實現接口即可

3.對於實現了SingleThreadModel接口的Servlet,對於客戶端的訪問採用的方式是產生多個Servlet的實例對象,併發的線程每次調用不同的Servlet對象

4.這個接口已經過時,不太適合使用,還是應該使用同步代碼塊方式解決該問題

}

}


ServletConfig{

1.Servlet的配置文件中,通過<init-param>標籤爲Servlet配置一些初始化參數(爲那個Servlet配置就放在哪個Servlet的標籤內)

  <servlet>
    <servlet-name>ServletConfigDemo</servlet-name>
    <servlet-class>ServletConfigDemo</servlet-class>
    <init-param>
    	<param-name>name</param-name>
    	<param-value>halm</param-value>
    </init-param>
  </servlet>

2.配置了這些參數後,當Web服務器創建Servlet實例對象之後就會將這些初始化參數封裝到ServletConfig對象中,並在調用Servlet的init方法時,把這個對象傳遞給Servlet對象。所以程序員就可以獲得當前的Servlet的初始化信息

3.在實際開發中,有些信息不適合直接在程序中寫死,所以可以從配置文件中獲取相應信息

String value1 = this.getServletConfig().getInitParameter("data");//獲取指定配置值
		Enumeration<String> values = this.getServletConfig().getInitParameterNames();//獲取所有配置的值
		while(values.hasMoreElements()){
			String value2 = values.nextElement();
		}

}


ServletContext{

1.WEB服務器在啓動的時候,會爲每個Web應用程序創建一個ServletContext對象,它代表當前的web應用。當web服務器停止,該對象會銷燬

2.在ServletConfig對象中維護了對ServletContext對象的引用,可以通過config.getServletContext()方法獲得該對象

3.由於一個Web應用中的所有Servlet共享一個ServletContext對象,所以可以通過這個對象來實現數據共享,該對象也被稱爲“context域對象”

4.可以設置web應用的初始化參數,供所有Servlet共享

  <context-param>
  	<param-name>name</param-name>
  	<param-value>halm</param-value>
  </context-param>

5.轉發的使用

		//使用轉發對象,將一些數據轉到另一個頁面進行顯示。轉發只有一次請求。重定向有兩次請求
		this.getServletContext().getRequestDispatcher("/1.jsp").forward(request, response);

6.讀取文件信息

//		斜槓代表當前web應用,需要讀取哪些文件,就寫入該文件相對於web應用的相對位置
		this.getServletContext().getResourceAsStream("/......");

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章