淺談servlet與jsp的關係

    jsp和servlet都屬於j2ee13規範,servlet是運行在服務端的Java程序,動態生成web內容,但是如果僅僅使用servlet來輸出html則是一句一句地輸出,爲開發和維護帶來了極大的不便。而jsp可以這麼理解,可以在html中添加Java代碼,所以頁面渲染結果可以直接使用Dreamweaver等編輯器直接更改,更簡單快捷,而不用維護Java類中的代碼。實現瞭解耦合。

    而jsp的本質還是servlet,它只不過是利用了另外一套規則寫的servlet,它運行也是需要先編譯成Java代碼,然後進行輸出的,這些操作都是jsp容器完成的,比如一個jsp在tomcat中被編譯,則會生成相應的Java類。

    首先看看jsp是如何調用的:

    在tomcat的web.xml配置中:

<servlet>  
        <servlet-name>jsp</servlet-name>  
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>  
        <init-param>  
            <param-name>fork</param-name>  
            <param-value>false</param-value>  
        </init-param>  
        <init-param>  
            <param-name>xpoweredBy</param-name>  
            <param-value>false</param-value>  
        </init-param>  
        <load-on-startup>3</load-on-startup>  
    </servlet>  
<servlet-mapping>  
       <servlet-name>jsp</servlet-name>  
       <url-pattern>*.jsp</url-pattern>  
   </servlet-mapping>  
    這裏規定了servlet-name是jsp,根據這個規範,也可以認爲jsp實際上就是特殊的servlet。
tomcat啓動會在work目錄下編譯jsp,然後生成相應的Java類:


而編輯這個類:


    可以看出繼承了HttpJspBase類,而這個類又繼承了HttpServlet類,並且覆蓋了service()方法。在HttpServletRequest和HttpServletResponse兩個很重要的類創建之後,不再調用原來的service()方法,進行doGet()或者doPost()分發,因爲_jspService()對其進行了覆蓋,所以直接在_jspService()方法中生成頁面渲染的代碼:


    這和原來直接在servlet中寫html代碼的本質是一樣的,返回到客戶端瀏覽器進行頁面渲染,所以jsp本質就是servlet,只是表現形式不同。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章