一、Servlet : 用java語言編寫的動態資源開發技術。
二、Servlet 特色:
1)普通的java類,繼承HttpServlet類,覆蓋doGet、doPost等方法。
2)Servlet類只能交給tomcat服務器運行。
三、怎樣使用Eclipse開發Servlet?
1)編寫一個servlet類,繼承HttpServlet
public class Servlet extends HttpServlet{br/>@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("This is Servlet!");
resp.getWriter().write("This is Servlet!");
}
}
2)配置web.xml文件
<servlet>
<servlet-name>Servlet</servlet-name>
<servlet-class>zzuli.edu.cn.Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet</servlet-name>
<url-pattern>/Servlet</url-pattern>
</servlet-mapping>
3)訪問 http://localhost:8080/FirstServlet/Servlet
四、在web.xml中配置 <servlet>和<servlet-mapping>的做用?
servlet容器對url的匹配過程:
當一個請求發送到servlet容器的時候,容器先會將請求的url減去當前應用上下文的路徑做爲servlet的映射url,好比我訪問的是http://localhost:8080/FirstServlet/Servlet,個人應用上下文是FirstServlet,容器會將http://localhost:8080/FirstServlet去掉,剩下的/Servlet部分拿來作servlet的映射匹配。
映射匹配步驟:
1)首先在web.xml文件中查找是否有匹配的url-pattern的內容(/Servlet)
2)若是找到匹配的url-pattern,則使用當前servlet-name的名稱到web.xml文件中查詢是否相同名稱的servlet配置
3)若是找到相同名稱的servlet配置,則取出對應的servlet配置信息中的servlet-class內容(zzuli.edu.cn.Servlet),而後經過servlet-class裏的內容,反射構造Servlet的對象,調用Servlet對象裏面的方法。
五、 Myeclipse和Eclipse中的Tomcat怎樣部署項目?
1)Myeclipse默認將項目部署到tomcat安裝目錄下的webapps中
2)eclipse並不像MyEclipse默認將項目部署到tomcat安裝目錄下的webapps中,而是默認部署到工做目錄(workspace)下的.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps中
六、Servlet 註解br/>Servlet3.0以上可使用註解@WebServlet自動映射,不用在web.xml中配置<servlet>和<servlet-mapping>
使用方法:編寫一個servlet類,繼承HttpServlet,而後在servlet上面加上@webServlet便可。br/>@WebServlet("/FirstServlet2")
public class FirstServlet2 extends HttpServlet{br/>@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("This is Servlet2!");
resp.getWriter().write("This is Servlet2!");br/>}
}
注意點:@WebServlet註解括號裏面必須加映射路徑
七、Sevlet的生命週期(重點)
Servlet重要的四個生命週期方法:
1)構造方法:建立servlet對象的時候調用。默認狀況下,第一次訪問servlet的時候建立servlet對象。只調用1次,證實servlet對象在tomcat是單實例的。
2)init方法:建立完servlet對象的時候調用,只調用1次。
3)service方法:每次發出請求時調用,調用n次。
4)destroy方法:銷燬servlet對象的時候調用。中止服務器或者從新部署web應用時銷燬servlet對象。只調用1次。
八、僞代碼演示servlet的生命週期
Tomtcat內部代碼運行:
一、經過URL映射找到到servlet-class的內容(zzuli.edu.cn.FirstServlet)
二、經過反射構造FirstServlet對象
2.1 獲得字節碼對象
Class clazz = class.forName("zzuli.edu.cn.FirstServlet");
2.2 調用無參數的構造方法來構造對象
Object obj = clazz.newInstance(); ---1.servlet的構造方法被調用
三、建立ServletConfig對象,經過反射調用init方法
3.1 獲得方法對象
Method m = clazz.getDeclareMethod("init",ServletConfig.class);
3.2 調用方法
m.invoke(obj,config); --2.servlet的init方法被調用
四、建立request,response對象,經過反射調用service方法
4.1 獲得方法對象
Methodm m=clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServlet Response.class);
4.2 調用方法
m.invoke(obj,request,response); --3.servlet的service方法被調用
五、當tomcat服務器中止或web應用從新部署,經過反射調用destroy方法
5.1 獲得方法對象
Method m = clazz.getDeclareMethod("destroy",null);
5.2 調用方法
m.invoke(obj,null); --4.servlet的destroy方法被調用
九、怎樣證實Servlet是單例的?
經過構造函數來證實,當屢次請求(訪問)servlet時,若是構造函數只被執行一次,說明servlet是單例的。
Servlet默認是單例的,是在第一次請求被執行時建立的(懶漢式)。
十、Servlet的自動加載
默認狀況下,servlet對象是在第一次請求被執行時建立的。若是servlet的構造方法或init方法中執行了比較多的邏輯代碼,那麼致使用戶第一次訪問sevrlet的時候比較慢。
怎樣解決這種問題呢?
改變servlet建立對象的時機:提早到加載web應用的時候建立!
方法:只須要在servlet的配置信息中,加上一個<load-on-startup>便可!
<servlet>
<servlet-name>ServletDemo</servlet-name>
<servlet-class>zzuli.edu.cn.ServletDemo</servlet-class>
<!-- 讓servlet對象在啓動時自動加載 -->
<load-on-startup>1</load-on-startup> 注意: 整數值越大,建立優先級越低!!
</servlet>
十一、Servlet的多線程併發問題(重點)
注意: servlet對象在tomcat服務器中是單實例多線程的。
由於servlet是多線程的,因此當多個servlet的線程同時訪問了servlet的共享數據,如成員變量,可能會引起線程安全問題。
解決線程不安全問題辦法:
1)把使用到共享數據的代碼塊進行同步(使用synchronized關鍵字進行同步)
2)在servlet類中儘可能不要使用XM返傭www.kaifx.cn/broker/xm.html成員變量。若是確實要使用成員,必須同步,並且儘可能縮小同步代碼塊的範圍(哪裏使用到了成員變量,就同步哪裏!!),以免由於同步而致使併發效率下降。
3)只要在servlet類中不使用共享數據,就不影響servlet的正常使用。
線程不安全代碼演示:
/**html