中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣修改JSP文件的實時生效

發布時間:2021-12-13 18:58:36 來源:億速云 閱讀:433 作者:柒染 欄目:大數據

這篇文章將為大家詳細講解有關怎樣修改JSP文件的實時生效,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

那JSP文件是怎么樣做到改動實時生效的呢

在JSP處理過程中,會判斷文件是否生成,是否過期,根據此來決定是否重新編譯JSP文件生成Servlet類。這個一般是通過JspServletWrapper的service方法開始調用的。

在該方法中有如下代碼:

if (options.getDevelopment() || firstTime ) {//重點看這里
   synchronized (this) {
       firstTime = false;
       // The following sets reload to true, if necessary
       ctxt.compile();
   }}

默認的情況下,這個options的development屬性為true,所以都會進到這個代碼塊中。

對應的compile方法,有如下代碼段:

public void compile() {
   createCompiler();
   if (jspCompiler.isOutDated()) {//此處判斷文件是否過期
       if (isRemoved()) {
           throw new FileNotFoundException(jspUri);
       }
       try {
           jspCompiler.removeGeneratedFiles();
           jspLoader = null; //注意這里
           jspCompiler.compile();
           jsw.setReload(true); //這里會設置reload標識
           jsw.setCompilationException(null);
       }

判斷過期的代碼比較多,這里不全部羅列了,大致包含以下幾個點:

  •  檢查jsp文件生成的Servlet類對應的class文件,如果不存在,則認為過期

  •  如果class文件修改時間和jsp的修改時間不一致,則認為過期

  •  對于jsp中include的一些資源,如果有更新操作的,也會認為過期

從上面的代碼看到,在判斷文件過期之后,會執行這樣幾個操作:

  • 刪除舊文件,

  • 編譯并生成新文件,

  • 設置reload屬性為true

  • 設置jspLoader為null

操作的最后兩點,是jsp文件能夠修改立即生效的秘密所在。

我們看在jsp所對應的Wrapper的service方法中,判斷并執行compile操作之后,第二步就是獲取具體的servlet類,這個方法的一些主要代碼如下:

public Servlet getServlet() throws ServletException {
   if (reload) {
       synchronized (this) {
           if (reload) {
               destroy();
               final Servlet servlet;
               try {
                   InstanceManager instanceManager = InstanceManagerFactory.getInstanceManager(config);
                   servlet = (Servlet) instanceManager.newInstance(ctxt.getFQCN(), ctxt.getJspLoader());
               } catch (Exception e) {}
               theServlet = servlet;
               reload = false;
           }}}
   return theServlet;
}

我們看,上面首先根據reload標識來判斷是否要重新加載Servlet類。而每次的jsp修改,都會導致compile時將此標識設置為true,自然每次的修改都是要加載的。那這個和上面的jspLoader有什么關系呢?

我們注意到instanceManager的newInstance方法,會從JspCompilationContext
這個類取Jsp的ClassLoader,這個取classLoader的過程如下:
public ClassLoader getJspLoader() {
   if( jspLoader == null ) {//看這里
       jspLoader = new JasperLoader
               (new URL[] {baseUrl}, //這里的baseUrl,就是應用的file:/D:/xxx/work/Catalina/localhost/test/
                       getClassLoader(),
                       rctxt.getPermissionCollection());
   }
   return jspLoader;
}

在獲取jspLoader的,如果這個對象為null,就會新創建一個。這個get到的

jspLoader會被用來執行loadClass的操作,即jsp對應的Servlet類是會被其進行加載的。

假設在請求應用的index.jsp頁面,那初次請求時, instanceManager對應的classLoader是一個,當修改jsp文件后再次請求時,又是使用的另一個classLoader,所以新的內容修改被成功加載,而原來舊的內容,已經在compile階段被清除了。

關于怎樣修改JSP文件的實時生效就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

jsp
AI

天等县| 开原市| 阜阳市| 桓台县| 平陆县| 沐川县| 碌曲县| 贵溪市| 都昌县| 泾川县| 德昌县| 石屏县| 仙游县| 盘山县| 会宁县| 西贡区| 遂溪县| 宁国市| 大渡口区| 巧家县| 乐清市| 满洲里市| 阿克陶县| 元阳县| 海安县| 晋中市| 黄梅县| 岢岚县| 长兴县| 临高县| 突泉县| 荆州市| 广南县| 策勒县| 柏乡县| 曲水县| 温泉县| 张北县| 克什克腾旗| 睢宁县| 定兴县|