問題
如果JavaWeb項目需要讀取實時更新的本地文件內容,可能遇到必須在更新后手動refresh才能有效的問題。
原因
這是由於項目實際上是運行在Tomcat中,而非本地的工作目錄。eclipse可以設置成將本地工作目錄自動同步到Tomcat相應目錄下,但是這需要一定時間。也就是說寫好本地文件后,過了一會兒才能同步到Tomcat,前端真正讀取的文件目錄才能是更新后的結果。
解決方案一
網上的經典解決辦法是將項目打包成war包,部署到Tomcat上運行(這樣就不存在本地工作目錄和實際運行目錄不一致的情況了)。具體操作百度里很詳細,但實際操作起來,不知是內存不夠還是什么原因,Tomcat運行項目時總是閃退。
解決方案二(問題仍然存在,但有所改善)
問了老師,另一種可供參考解決的辦法是,更新文件時不更新本地工作目錄的文件,而是直接實際目錄下更新。
那么問題來了,如何獲得tomcat中運行的實際目錄呢?
設置tomcat
首先確保tomcat設置如下圖:
雙擊server中的tomcat(或右鍵打開),勾選如圖選項:

代碼查看tomcat路徑
然后在任意jsp中加上如下java代碼:
<%
System.out.println("tomcat絕對路徑:"+request.getServletContext().getRealPath("/"));//獲取到了,剩下就留給你自己思考了
%>
運行該jsp后,在eclipse控制台即可查看tomcat絕對路徑
問題其實仍然存在,但有所改善
結果是,更新所需的速度快了很多,但是頻繁反復進入需要讀寫本地文件的頁面時,仍然有更新不及時現象,甚至如果更改了代碼,會出現報錯。
初步推斷,報錯的原因是,修改了代碼后,eclipse檢測到本地工作目錄有更新,於是自動將本地工作目錄同步到tomcat。我們剛才把文件寫在了tomcat而非本地,如果本地沒有同名文件,則同步時tomcat中的該文件也會被刪除。
但是我們代碼本身就包含在tomcat中寫該文件的步驟呀!結合更新不及時現象,可能是這段代碼尚未完成,頁面已經加載出來了,發現沒有讀到它要讀的文件,於是就報錯了。
如何控制保證頁面加載的過程完全在寫完文件后執行呢,可以把代碼寫在initJsp函數中(在HTML的外面),但是這樣的缺點是jspInit函數中無法使用request。
</html>
<%!
public void jspInit()
{
WriteHomepageJson.allMovies();
WriteHomepageJson.latestComments(5);
WriteHomepageJson.topMovies();
System.out.println("init index.jsp !");
}
%>
可以說目前還沒有找到完美的解決方法吧。是否javaweb中讀取實時更新的本地文件,本身也是不值得提倡的?更好的方式可能是直接傳值,而非用讀寫文件的方式中轉。
