servlet文件和java文件有什么區別?
Servlet是Server Applet的簡稱,是Java編寫的服務器端程序,主要功能在于交互式地瀏覽和生成數據,生成動態Web內容。
這么說吧:
Servlet是Java實現的 具有特定格式的 一個接口/類;
Servlet文件是Java文件中的一種。
servlet是一個供其他java程序調用的java類。他不能獨立運行,她的運行完全由servlet引擎控制和調度
針對客戶端的多次servlet請求,通常情況下,服務器只會創建一servlet實力對象,也就是說servlet一擔創建,他就會駐留在內存之中,為后續的其他請求服務,直至web容器推出,servlet實力對象才會被銷毀。
在servlet的整個生命周期內,servlet的init方法只會被調用一次,而對一個Servlet的每次訪問都導致引擎調用一次servlet的service方法。對于每次訪問請求,servlet引擎都會創建有哥httpservletRequest請求對象和一個httpservletReponse響應對象,然后將這兩個對象作為參數傳遞給servlet的service()方法。servlet方法再根據請求方式分別調用doXXX方法。
servlet的線程安全問題
當多個客戶端兵法訪問一個servlet時,web服務器會為每一個客戶端的訪問請求創建一個線程,并在這個線程調用servlet的service方法,因此service方法內如果放同一個資源的話,就有可能引發線程安全問題,
針對servlet線程安全問題,Sun公司是提供有解決方案的:讓Servlet去實現一個SingleThreadModel接口,如果某個Servlet實現了SingleThreadModel接口,那么Servlet引擎將以但線程模式來調用期Service方法
查看Sevlet的API可以看到,SingleThreadModel接口中沒有定義任何方法和常量,在Java中,把沒有定義任何方法和常量的接口稱之為標記接口,經常看到的一個最典型的標記接口就是"Serializable",這個接口也是沒有定義任何方法和常量的,標記接口在Java中有什么用呢?主要作用就是給某個對象打上一個標志,告訴JVM,這個對象可以做什么,比如實現了"Serializable"接口的類的對象就可以被序列化,還有一個"Cloneable"接口,這個也是一個標記接口,在默認情況下,Java中的對象是不允許被克隆的,就像現實生活中的人一樣,不允許克隆,但是只要實現了"Cloneable"接口,那么對象就可以被克隆了。
讓Servlet實現了SingleThreadModel接口,只要在Servlet類的定義中增加實現SingleThreadModel接口的聲明即可。
對于實現了SingleThreadModel接口的Servlet,Servlet引擎仍然支持對該Servlet的多線程并發訪問,其采用的方式是產生多個Servlet實例對象,并發的每個線程分別調用一個獨立的Servlet實例對象。
實現SingleThreadModel接口并不能真正解決Servlet的線程安全問題,因為Servlet引擎會創建多個Servlet實例對象,而真正意義上解決多線程安全問題是指一個Servlet實例對象被多個線程同時調用的問題。事實上,在Servlet API 2.4中,已經將SingleThreadModel標記為Deprecated(過時的)。