JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Servlet/JSP 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 load-on-startup 及 servlet init() 的問題
weberhwang





發文: 41
積分: 0
於 2019-01-03 13:35 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
作業環境
Windows 10 pro 繁體中文版
Tomcat v8.5.37
Servlet 3.1

大家好
關於servlet的init()方法,我查了不少文章都是說 在 container 第一次載入 servlet 時,才會執行一次。
之後都不會再被執行。
但我自己實驗,卻總覺得每次「重新整理頁面」都被執行。
提供我的web.xml 及 servlet 程式碼如下 (另提供完整的.war檔 https://drive.google.com/file/d/18Ec-g_Mign4nbIQMvTiX6bhxcuRof5ud/view?usp=sharing)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
【web.xml】
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
  id="WebApp_ID" version="3.1">
 
  <display-name>myWebSite</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>MyCounter</servlet-name>
    <servlet-class>test.MyCounter</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>MyCounter</servlet-name>
    <url-pattern>/MyCounter</url-pattern>
  </servlet-mapping>  
</web-app>
 
【MyCounter.java】
package test;
 
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class MyCounter extends HttpServlet {
private static final long serialVersionUID = 1;
  int count = 0;
  public void init() throws ServletException{
    ++count;
    System.out.println("Test from init...");
  }
 
public void doGet(HttpServletRequest req, HttpServletResponse res) 
  throws ServletException, IOException {
  
  res.setContentType("text/html; charset=UTF-8");
  PrintWriter out = res.getWriter();
  out.println("<HTML>");
  out.println("<HEAD><TITLE>Hello World</TITLE></HEAD>");
  out.println("<BODY>");
  out.println("Hello World , 未執行++count前,count = " + count);
  out.println("<br>");
  ++count;
  out.println("Hello World , 執行 ++count後,count =" + count);
  out.println("</BODY></HTML>");
 
  }
}


我自己測試的結果
第一次執行時
Hello World , 未執行++count前,count = 1
Hello World , 執行 ++count後,count =2

重新整理頁面,變成
Hello World , 未執行++count前,count = 4
Hello World , 執行 ++count後,count =5

再重新整理頁面,變成
Hello World , 未執行++count前,count = 7
Hello World , 執行 ++count後,count =8

感覺中間每次都被多加了2,
原本預期
第1次的最後答案變是2(←這個有符合)
重新整理變後最後答案變3(←不符合預期,結果變5)
再重新整理後最後答案變4(←不符合預期,結果變8)

自己是有點懷疑會不會是tomcat什麼地方的設定會去影響到?還是我對init()的執行時機認知有誤?


reply to postreply to post
作者 Re:load-on-startup 及 servlet init() 的問題 [Re:weberhwang]
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2019-01-07 05:56 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
程式本身沒問題,感覺是瀏覽器發出了兩次請求,檢查看看有沒有裝什麼奇怪的外掛,或換個瀏覽器試試…

reply to postreply to post
良葛格學習筆記
作者 Re:load-on-startup 及 servlet init() 的問題 [Re:caterpillar]
weberhwang





發文: 41
積分: 0
於 2019-01-08 01:36 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
感謝大大指點 我再朝瀏覽器方面去試試。

reply to postreply to post
作者 Re:load-on-startup 及 servlet init() 的問題 [Re:weberhwang]
alin





發文: 223
積分: 3
於 2019-01-08 05:53 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
++count; 有兩處


reply to postreply to post
作者 Re:load-on-startup 及 servlet init() 的問題 [Re:alin]
weberhwang





發文: 41
積分: 0
於 2019-01-10 09:06 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
兩處是正常的,第一處只會在初始化時執行一次,第二次則是每次reload都會執行。
後來測試應該是如 良葛格 大大所說的 跟瀏覽器有關,已正常。


reply to postreply to post
» JWorld@TW »  Servlet/JSP 討論區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8