1.Servlet
服務器端小應用程序
它運行在Servlet容器中,它是由服務器直接解析運行。
2.怎樣創建一個Servlet
1.通過查看示例,發現Servlet在創建時它會繼承一個HttpServlet類。
2.重寫doGet,doPost等方法。
-------------------------------------------------
3.創建一個servlet步驟:
1.創建一個類,去繼承HttpServlet(實現Servlet接口 或繼承 GenericServlet)
2.重寫方法 doPost doGet (接口中需要將所有方法重寫,但是service方法是處理請求)
3.在web.xml文件中配置
4.servlet生命週期
1.創建servlet,並調用init方法
2.通過service方法來處理請求。
3.通過destroy來銷燬servlet。
當我們創建一個servlet時,第一次訪問,會創建servlet對象,並調用init方法,init方法只調用一次。
開啓一個線程來調用service方法。
當下一次在訪問時,又開啓一個線程來調用service方法。
servlet對象,一般情況只創建一次,它常駐內存。
當服務停止,或servlet對象銷燬時會調用destroy方法。
注意:如果在servlet中創建了成員變量,就可以出現線程安全問題
在開發中,儘量避免在servlet中創建成員變量。
如果創建了,就需要同步。
5.關於Servlet接口中service方法與HttpServlet中的doPost,doGet什麼關係?
一個servlet被訪問時,它默認處理請求的是service方法,這個方法是在Servlet接口中定義的。
根據請求的url,在web.xml文件中查找到具體的servlet,
會默認調用service方法。
對於我們來說,它在HttpServlet中對service方法進行了重寫,執行其內容
在HttpServlet的service方法中,會根據請求方式的不同,分別調用不同的方法。
根據java中的多態,在調用doPost,doGet時,會調用的是我們自己的servlet中的方法。
這裏面涉及到一個java模式:模板方法模式
---------------------------------------------------------
5.模板方法模式:
---------------------------------------------------------
-------------------------------------------------------------------
myeclipse安裝
注意:將myeclipse10目錄放置在d盤根目錄下,破解後就可以使用.
myeclipse與tomcat整合
關於myeclipse下的web project部署到tomcat的目錄結構(重點)
----------------------------------------------------------------------
6.關於servlet自動加載.
我們可以通過設置讓servlet跟隨服務器啓動而創建.
只需要在servlet配置中<servlet>這個標籤中加上 <load-on-startup>2</load-on-startup>
問題1:servlet跟隨tomcat啓動有什麼作用?
就是用來加載資源。
問題2:load-on-startup它的值可以取什麼?
優先級有10個,是從1-10,1已經被佔用了,我們在使用時,一般情況下是從2開始。
數值越小優先級越高。
優先級相同情況下根據配置的順序加載。
----------------------------------------------------------------------
7.關於servlet配置中的url-pattern問題
問題1:一個servlet是否可以被映射到多個路徑?
可以的,一個servlet允許被不同的路徑映射.
問題2:url-pattern它的寫法是什麼樣的?
1.完全匹配 要求必須以 /開始。
以下兩種可以使用通配符. *
2.目錄匹配 必須以/開始,以*結束。
3.擴展名匹配 不能以/開始,以*.xxx結束.
最經典錯誤 /*.do
以上三種配置有優先級: 完全匹配>目錄匹配>擴展名匹配
----------------------------------------------------------------------
複習:
1.servlet是什麼,它的作用.
2.怎樣創建Servlet(三步)
3.Servlet體系
4.關於servlet生命週期
5.關於servlet配置.
----------------------------------------------------------------------------
8.web開發中的路徑問題
問題是:瀏覽器訪問服務器有幾種訪問方式?
1.直接在瀏覽器地址欄上輸入url
2.超鏈接.
3.表單
4.javascript
請求的方式最常用的是post get
除了表單可以post請求,其它的都是get請求。
訪問servlet路徑問題
1.絕對路徑
1.帶協議
<a href="http://localhost:8080/day7_2/demo1">demo1Servlet</a>
這種方式在開發不常用,如果使用這種方式,一般是用於訪問站外資源。
2.不帶協議
在瀏覽器端寫一個"/"相當於是服務器的根路徑.
<a href="/day7_2/demo1">demo1Servlet</a>
對於"/"它相當於是 http://localhost:8080也就是說,我們直接在"/"後面加上我們的工程名,在加上我們的資源名稱就可以。
這種方式在開發中應用比較多,因爲它一般用於訪問站內資源。
2.相對路徑
http://localhost:8080/day7_2/demo1 servlet路徑
http://localhost:8080/day7_2/admin.html html路徑
通過它們的路徑,我們發現它們是一個級別,那麼我們在訪問時,就可以寫成以下效果.
<a href="./demo1">demo1Servlet</a>
這個路徑可以簡化成
<a href="demo1">demo1Servlet</a>
在WebRoot下創建一個jsps目錄,將admin.html放置到其中。那麼在訪問時,絕對路徑不會出問題。
相對路徑失效。怎樣修改它?
http://localhost:8080/day7_2/demo1
http://localhost:8080/day7_2/jsps/admin.html
路徑: <a href="../demo1">demo1Servlet</a>
-----------------------------------------------------------------
結論:在開發中,推薦使用不帶協議絕對路徑。
寫法: /工程名/servlet的url-pattern的值.
------------------------------------------------------------------------------------------
9.關於Servlet接口中的init方法
問題1:在Servlet接口中定義的init方法是有參數的,它的參數類型是ServletConfig,而我們重寫的init方法沒有參數,爲什麼?
原因:父類中已經將init(ServletConfig config)這個方法進行了重寫,而我們在自己的Servlet中就不需要在重寫了,
我們重寫的init()它不是接口中定義的,而是在父類中定義的。
細節:在GenericServlet中對Servlet接口中的init(ServletConfig config)進行了重寫,並且調用了自己定義的一個
init()方法。那麼我們在自己的Servlet類中重寫了init()方法,根據多態就會調用我們自己的init()方法。
問題2:ServletConfig是什麼?它有什麼作用?
在GenricServlet中將ServletConfig對象保存到了GenericServlet中。
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
ServletConfig對象,代表的是Servlet的配置對象。
當去訪問一個servlet時,就會實例化這個servlet對象,並且會創建一個servletConfig對象,將這個對象通過init方法傳遞到servlet中。
那麼我們就可以在自己的servlet中獲取Servlet的配置信息.
獲取ServletConfig對象: this.getServletConfig();
----------------------------------------------------------------
10. ServletConfig對象
功能:
1.可以獲取Servlet的name。
2.可以獲取初始化參數
是我們可以在Servlet的配置中通過<init-param>來進行配置,
對於這些配置,我們可以通過ServletConfig來獲取.
通過初始化參數,我們可以進行預定義信息的加載,這種操作一般情況是在框架中應用。
3.可以獲取ServletContext對象
常用API總結:
public String getServletName();
用於獲取Servlet名稱
public String getInitParameter(String name);
用於獲取init-param中指定名稱的value值.
public Enumeration getInitParameterNames();
用於獲取所有的init-param中的name名稱.
public ServletContext getServletContext();
用於獲取一個ServletContext對象。
ServletConfig要求掌握內容:
1.它是由服務器創建,通過init方法傳遞到我們的Servlet中。
我們在Servlet中通過 this.getServletConfig()獲取ServletConfig對象.
2.ServletConfig對象是用於獲取當前Servlet的配置信息.
1.Servlet的名稱
2.Servlet的初始化參數。
每一個Servlet都具有自己的ServletConfig對象。它們之間是不能共享的。
-------------------------------------------------------------------------------------
11.關於ServletContext對象.
ServletContext它代表的是一個web應用。
怎樣獲取一個ServletContext對象?
可以通過ServletConfig對象獲取.
ServletConfig.getServletContext();
作用:
1.它可以獲取全局初始化參數
String getInitParameter(String name)
Enumeration getInitParameterNames()
在web.xml文件中可以配置我們的全局初始化參數
<!-- 配置全局初始化參數 -->
<context-param>
<param-name>name</param-name>
<param-value>tom</param-value>
</context-param>
它的配置是針對於整個web應用.
2.它可以幫助我們讓servlet實現信息共享.
ServletContext是一個域對象,提到域對象想到兩件事,一個是它相當於是一個Map,另一個它有作用域,對於
ServletContext它的作用域是整個web應用。
示例:統計站點訪問次數
問題:怎樣判斷是第一次訪問
setAttribute(String name,Object value);
getAttribute(String name);
removeAttribute(String name);
3.可以獲取路徑(資源)***********************
在web開發中,如果要想獲取資源,必須使用絕對的磁盤路徑。
怎樣可以得到在服務器上的文件的絕對磁盤路徑?
1.String getRealPath(String s);
ServletContext.getRealPath("/"); 得到當前工程在磁盤上的絕對路徑。
2.URL gerResource(String s);
得到一個URL路徑,它也是指向我們的web工程下的資源。
3.InputStream getResourceAsStream(String s);
得到一個指向資源的輸入流.
擴展:對於classes目錄下的文件,它有其它的方式可以獲取到.
Class.getResource("/").getPath(); 獲取的就是class文件所有的目錄的絕對磁盤路徑。
對於存在於classes目錄下的文件,我們可以通過classpath的方式去獲取其絕對磁盤路徑。
4.其它功能(瞭解)
1.獲取MIME類型
String getMimeType(String file) 文件下載時會用到.
2.分發請求
RequestDispatcher getRequestDispatcher(String path)
在開發中不常使用,如果使用通過request對象來操作。
3.日誌
log方法是用來處理日誌.
--------------------------------------------------------------
自己做:
1.將筆記中所有的問題全都看一遍
2.手動創建servlet,並描述servlet生命週期.
3.關於url-pattern配置
4.關於ServletContext功能描述。
5.關於路徑問題總結.
關於servlet的一些總結
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.