Eclipse中JSP生成的class文件去了哪里?


 

大家都知道,JSP在請求的時候,會先轉化成Servlet(其實就是個java類),然后生成class文件,再提供服務。

那么生成的java、class文件在哪呢?Eclipse中根本找不到呀!

  首先應該了解的是Tomcat在Eclipse的映射關系,參考前一篇博文所述:Tomcat的服務器目錄配置

  可以了解到,Tomcat在Eclipse中提供了三種位置配置選項:

  1 Use workspace metadata

  2 Use Tomcat installation

  3 Use custom location

  分別對應三種情況說一下,注意要把Server中發布的目錄全部刪除,然后clean后才能修改該配置項。

  如果你在Eclipse中雙擊Server配置選項,在Server Location中分別選了如下的選項:

  如果Server Locations選擇了第一項Use workspace metadata

  選了上面這項,你的服務器目錄和發布目錄將會如下:

  服務器目錄,即生成的字節碼和java文件所在的目錄。它在你的eclipse的工作目錄中,比如我的工作目錄是在F://workspace,那么在該目錄下就可以看到這個.metadata目錄了。

  參考上面的配置目錄F:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0

  這就是Tomcat映射的目錄,在這個目錄中有一個work目錄和一個wtpwebapps目錄

  work目錄中順着:work\Catalina\localhost\項目名字\org\apache\jsp 就可以找到你的項目對應的java文件和class文件(注意要訪問jsp后才會出現!)

  wtpwebapps目錄則存放對應的部署資源文件

  如果選擇的是第二項,Use Tomcat installation

  如果勾選的use tomcat installation,那么你的tomcat目錄將被選定為tomcat所安裝的目錄。

  還是推薦選擇這個吧,畢竟好找一點。

  如果勾選第三項,Use custom location

  目錄的結構與上面的類似,上面這兩個都是不可以修改的,要么是workspace所在的目錄,要么是tomcat的目錄。

  選擇該項,可以自定義生成的空間。

  另外說一點,JSP的生命周期

  這是老生常談的問題了,用戶把工程部署到tomcat中,然后啟動tomcat!此時就可以訪問jsp了、

  1 第一次訪問JSP,會驗證一下是否第一次訪問,然后把JSP轉化成java(Servlet),再編譯成class文件

  2 生成的class文件中會自動生成幾個方法:jspInit()、jspDestroy()、jspService().Tomcat僅僅在第一次請求時,調用jspInit方法,然后調用jspService進行處理。

  3 之后的每個請求,都會分配一個線程調用jspService方法。

  4 如果頁面被銷毀或者關閉,都會調用jspDestroy

  由於該文件是常駐內存的,又是多線程調用,所以訪問的效率和速度都會很快。

  按照前面所述的方法,就可以看到生成的文件結構了。

  為了展示,這里給出一個樣例的JSP

<%@ page language="java" import="java.util.*,java.io.*" contentType="text/html; charset=utf-8"%>
    <%-- 
    language 腳本使用的語言
    import 加載類文件
    contentType 編碼方式
     --%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
    <h1>JSP</h1>
    
    <!-- 客戶端可見 -->
    <%-- 客戶端不可見 --%>
    <%!
        String s = "xingoo";//聲明變量
        int add(int a,int b){//聲明函數
            return a+b;
        }
    %>
    s=<%=s %><br> <%--表達式不以分號結束 --%>
    1+2=<%=add(1,2) %><br>
    <%
        //單行注釋 ————————————————快捷鍵ctrl+/
        /* 多行注釋 ____________快捷鍵ctrl+shift+/ */ 
        out.println("s="+s+"<br>");
    %>
</body>
</html>
View Code

  里面含有一些注釋,變量聲明和打印輸出等等。

  在生成.java文件中,可以看到生成的java文件:

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
import java.io.*;

public final class test1_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {


        String s = "xingoo";//聲明變量
        int add(int a,int b){//聲明函數
            return a+b;
        }
    
  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

  private static java.util.List _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.AnnotationProcessor _jsp_annotationprocessor;

  public Object getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
  }

  public void _jspDestroy() {
  }

  public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {

    PageContext pageContext = null;
    HttpSession session = null;
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html; charset=utf-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                  null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write('\r');
      out.write('\n');
      out.write('    ');
      out.write("\r\n");
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("\t<h1>JSP</h1>\r\n");
      out.write("\t\r\n");
      out.write("\t<!-- 客戶端可見 -->\r\n");
      out.write("\t");
      out.write('\r');
      out.write('\n');
      out.write('    ');
      out.write("\r\n");
      out.write("\ts=");
      out.print(s );
      out.write("<br> ");
      out.write("\r\n");
      out.write("\t1+2=");
      out.print(add(1,2) );
      out.write("<br>\r\n");
      out.write("\t");

        //單行注釋 ————————————————快捷鍵ctrl+/
        /* 多行注釋 ____________快捷鍵ctrl+shift+/ */ 
        out.println("s="+s+"<br>");
    
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else log(t.getMessage(), t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}
View Code

  聲明注釋,都可以很詳細的看到。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM