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,只是表現形式不同。