Servlet開發中註意的細節問題
客戶端訪問服務器的時候是通過URL訪問的,所以我們要想用瀏覽器訪問我們的Servlet的時候,我們就需要將我們的Servlet映射到壹個URL上(通過我們的web.xml文件中的<servler-mapping>中的兩個子標簽<servlet-name>和<url-pattern>兩個標簽實現URL的配置,<Servlet>標簽是註冊了壹個Servlet,只有註冊了我們才能進行映射,而且註冊壹個可以映射多個,所以壹個註冊的Servlet會被多次映射,也就是可以被瀏覽器的多個url訪問,而且我們的加壹個後綴名也可以訪問)
/*、/news/*、/*.do?這三種方式的映射分別實現了不同的作用
/*:任何的路徑都可以訪問
/news/*:特定文件夾下的所有路徑
/*.do:特定擴展名的所有路徑
誰先被被匹配到?
誰的匹配度高就匹配誰,誰最像就匹配誰。*.do的優先級最低,兩個原則。
Servlet的單例問題:Servlet是壹個供其他java程序調用的類,它不能獨立運行,針對客戶端的多次請求,通常狀況下,Servlet只會創建壹個Servlet實例對象,壹旦創建它就會駐留在內存中,為後續的請求提供服務,直至退出web應用為止,也就是當我們關閉了瀏覽器之後我們的Servlet就終止了。
當Servlet第壹次訪問的時候,就被加載到內存中,以後該實例對各個請求服務,沒次情況會調用壹次service方法。
這樣會出現什麽問題:因為Servlet是單例的,所以會出現線程安全問題:
例如:售票系統(如果壹個變量被多個用戶***享,我們就需要實現同步機制,如果壹個變量不需要***享直接在doGet或者doPost中定義,這樣不會存在線程安全問題)
解決方法1:用這個對象將其synchronized(this){}包住,實現同步機制。
解決方法2
servlet中配置<load-on-startup>配置的說明:
需求:當我們的網站啟動的時候,可能會要求初始化壹些數據(比如像創建壹些臨時的表),再比如我們的網站會有壹些要定時完成的任務(定時寫日誌,定時發送郵件)
解決方法:可以使用配置這個標簽然後結合壹些線程相關的知識解決問題。
先說明<load-on-startup>:通過配置該標簽,可以指定該Servlet自動創建。
實例1:初始化壹些東西
實現:1、在Servlet標簽中配置<load-on-startup>標簽。2、在init函數中寫要初始化的東西。
實例2:每隔1分鐘發送壹份電子郵件
實現:1、新建壹個線程 2、調用線程,配置<load-on-startup>標簽
public?void?init()?throws?ServletException?{//?Put?your?code?here
System.out.println("我們的線程啟動了");
SendEmail?send=new?SendEmail();
send.sendmail();
}package?com.lyw.servlet;
public?class?SendEmail?extends?Thread?{
public?void?sendmail(){
int?i=0;
while(true){
i++;
try?{
Thread.sleep(10*1000);
}?catch?(InterruptedException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}
System.out.println("發送第"+i+"份郵件");
}
}
}<load-on-startup>2</load-on-startup>
我們的<load-on-startup>標簽中夾的數字是什麽意思?有什麽作用
這代表我們啟動是順序,因為在實際開發中我們肯定要初始化多個對象,所以我們在這裏要用數字表明啟動的順序。
5、ServletConfig對象
該對象主要是用於讀取Servlet的壹些配置信息,
<init-param><param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>package?com.lyw.servlet;
import?java.io.IOException;
import?java.io.PrintWriter;
import?javax.servlet.ServletException;
import?javax.servlet.http.HttpServlet;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;
public?class?FirstServlet?extends?HttpServlet?{
public?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
response.setContentType("text/html");
String?encoding=this.getServletConfig().getInitParameter("encoding");
response.setCharacterEncoding(encoding);
PrintWriter?out=response.getWriter();
out.print("編碼是:"+encoding);
}
public?void?doPost(HttpServletRequest?request,?HttpServletResponse?response)
throws?ServletException,?IOException?{
doGet(request,?response);
}
/**
*?Initialization?of?the?servlet.?<br> * *?@throws?ServletException?if?an?error?occurs */public?void?init()?throws?ServletException?{
//?Put?your?code?here
System.out.println("我們的線程啟動了");
SendEmail?send=new?SendEmail();
send.sendmail();
}
}
讀取配置信息,該配置信息只能由該Servlet讀取。但是,如果希望讓所有的Servlet讀取某個參數,應該這樣配置:<contex-param>標簽下配置的可以被任何Servlet讀取。
6、如何去修改Servlet的文件
在myeclipse的plugin目錄下輸入wizards進行搜索找到相應的jar包,用壓縮包打開之後進行修改,改成自己想要的樣子,然後保存即可,修改的時候要把myeclipse關閉了。
引用:網頁鏈接