當前位置:編程學習大全網 - 編程語言 - servlet編程需要註意哪些問題

servlet編程需要註意哪些問題

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關閉了。

引用:網頁鏈接

  • 上一篇:在HTML裏用JS做個簡易計算機
  • 下一篇:三菱空調多聯機6607故障分析(如何解決三菱空調6607故障問題)
  • copyright 2024編程學習大全網