您好,登錄后才能下訂單哦!
1、Servlet : 用java語言編寫的動態(tài)資源開發(fā)技術。
2、Servlet 特點:
1)普通的java類,繼承HttpServlet類,覆蓋doGet、doPost等方法。
2)Servlet類只能交給tomcat服務器運行。
3、怎樣使用Eclipse開發(fā)Servlet?
1)編寫一個servlet類,繼承HttpServlet
public class Servlet extends HttpServlet{@Override
br/>@Override
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
4、在web.xml中配置 <servlet>和<servlet-mapping>的作用?
servlet容器對url的匹配過程:
當一個請求發(fā)送到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對象里面的方法。
5、 Myeclipse和Eclipse中的Tomcat怎樣部署項目?
1)Myeclipse默認將項目部署到tomcat安裝目錄下的webapps中
2)eclipse并不像MyEclipse默認將項目部署到tomcat安裝目錄下的webapps中,而是默認部署到工作目錄(workspace)下的.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps中
6、Servlet 注解Servlet3.0以上可以使用注解@WebServlet自動映射,不用在web.xml中配置<servlet>和<servlet-mapping>
br/>Servlet3.0以上可以使用注解@WebServlet自動映射,不用在web.xml中配置<servlet>和<servlet-mapping>
br/>@WebServlet("/FirstServlet2")
br/>@Override
System.out.println("This is Servlet2!");
resp.getWriter().write("This is Servlet2!");}
}
注意點:@WebServlet注解括號里面必須加映射路徑
br/>}
}
注意點:@WebServlet注解括號里面必須加映射路徑
Servlet重要的四個生命周期方法:
1)構造方法:創(chuàng)建servlet對象的時候調用。默認情況下,第一次訪問servlet的時候創(chuàng)建servlet對象。只調用1次,證明servlet對象在tomcat是單實例的。
2)init方法:創(chuàng)建完servlet對象的時候調用,只調用1次。
3)service方法:每次發(fā)出請求時調用,調用n次。
4)destroy方法:銷毀servlet對象的時候調用。停止服務器或者重新部署web應用時銷毀servlet對象。只調用1次。
8、偽代碼演示servlet的生命周期
Tomtcat內部代碼運行:
1、通過URL映射找到到servlet-class的內容(zzuli.edu.cn.FirstServlet)
2、通過反射構造FirstServlet對象
??? ?2.1 得到字節(jié)碼對象
? ? ? ? ? ?Class clazz = class.forName("zzuli.edu.cn.FirstServlet");
??? ?2.2 調用無參數的構造方法來構造對象
? ? ? ? ? Object obj = clazz.newInstance(); ?---1.servlet的構造方法被調用
3、創(chuàng)建ServletConfig對象,通過反射調用init方法
??? ?3.1 得到方法對象
? ? ? ? ? ?Method m = clazz.getDeclareMethod("init",ServletConfig.class);
??? ??3.2 調用方法
??? ???? ? ?m.invoke(obj,config);?????--2.servlet的init方法被調用
4、創(chuàng)建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方法被調用
5、當tomcat服務器停止或web應用重新部署,通過反射調用destroy方法
??? ??5.1 得到方法對象
? ? ? ? ? ? Method m = clazz.getDeclareMethod("destroy",null);
??? ?5.2 調用方法
??? ??? ???m.invoke(obj,null);????--4.servlet的destroy方法被調用
9、怎樣證明Servlet是單例的?
通過構造函數來證明,當多次請求(訪問)servlet時,如果構造函數只被執(zhí)行一次,說明servlet是單例的。
Servlet默認是單例的,是在第一次請求被執(zhí)行時創(chuàng)建的(懶漢式)。
10、Servlet的自動加載
默認情況下,servlet對象是在第一次請求被執(zhí)行時創(chuàng)建的。如果servlet的構造方法或init方法中執(zhí)行了比較多的邏輯代碼,那么導致用戶第一次訪問sevrlet的時候比較慢。
怎樣解決這種問題呢?
改變servlet創(chuàng)建對象的時機:提前到加載web應用的時候創(chuàng)建!
方法:只需要在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> 注意: 整數值越大,創(chuàng)建優(yōu)先級越低!!
</servlet>
11、Servlet的多線程并發(fā)問題(重點)
注意: servlet對象在tomcat服務器中是單實例多線程的。
因為servlet是多線程的,所以當多個servlet的線程同時訪問了servlet的共享數據,如成員變量,可能會引發(fā)線程安全問題。
解決線程不安全問題辦法:
????1)把使用到共享數據的代碼塊進行同步(使用synchronized關鍵字進行同步)
? ? 2)在servlet類中盡量不要使用XM返傭www.kaifx.cn/broker/xm.html成員變量。如果確實要使用成員,必須同步,而且盡量縮小同步代碼塊的范圍(哪里使用到了成員變量,就同步哪里?。。?,以避免因為同步而導致并發(fā)效率降低。
? ? 3)只要在servlet類中不使用共享數據,就不影響servlet的正常使用。
線程不安全代碼演示:
/**
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。