IT兄弟連 JavaWeb教程 Servlet中定義的變數的作用域類型
- 2019 年 10 月 5 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/ITXDL123/article/details/90089732
在Java語言中,局部變數和實力變數有著不同的作用於,它們的區別如下:
局部變數在一個方法中定義,每當一個執行緒執行局部變數所在的方法時,在執行緒的堆棧中就會創建這個局部變數,當執行緒執行完該方法,局部變數就會結束生命周期,如果有多個執行緒同時執行該方法,那麼每個執行緒都擁有自己的局部變數。
實例變數在類中定義。類的每一個實例都擁有自己的實例變數,如果一個實例結束生命周期,那麼屬於它的實例變數也就結束生命周期。如果有多個執行緒同時執行一個實例的方法,而這個方法會訪問一個實例變數,那麼這些執行緒訪問的是一個實例變數。
在上面的HelloServlet案例中的username變數代表每個HTTP請求中的用戶名資訊。HTTP請求和執行緒,以及HTTP請求和username變數之間存在以下對應關係:
一個HTTP請求對應一個工作執行緒。
一個HTTP請求對應一個username變數。
由此可以推出,一個工作執行緒也應該對應username變數,所以應該把username變數作為service()方法的局部變數,而不應該作為HelloServlet類的實例變數。
public class HelloServlet2 extends HttpServlet{
public void service(HttpServletRequest request,
HttpServletResponse response)throws ServletException,IOException{
String username = request.getParameter("username");
…
}
}
在web.xml文件中為HelloServlet2映射的URL為"/hello2",通過這兩個瀏覽器同時訪問HelloServlet2,兩個瀏覽器都會得到與當前請求匹配的響應結果。這是因為伺服器端的兩個執行緒在執行同一個HelloServlet2對象的service()方法時,擁有各自的username局部變數,它們分別代表各自的HTTP請求中的用戶名,如圖所示。

HelloServlet類把username變數定為實例變數,一個HelloServlet對象只有一個username實例變數。當伺服器端的工作執行緒並發執行同一個HelloServlet對象的service()方法時,該方法操縱的是同一個username實例變數,由於兩個工作執行緒都操縱同一個username實例變數,第二個工作執行緒會把第一個工作執行緒對username變數所賦的值覆蓋掉了,因此第一個工作執行緒向客戶端返回"您好,小鴨"。