一、Servlet 與 JSP
Servlet 通常使用字符串拼接的方式動態(tài)生成 html,大量的 html 內(nèi)容使代碼難以維護、可讀性差。
感受一下,簡單地加一個 table 得醬寫:
都快看不出來是 Java 代碼了。
后來,大佬們想,既然能在 Java 中寫 html,能不能在 html 中寫 Java 呢?
于是 JSP(JavaServer Pages) 誕生了。
JSP 是基于 Servlet API 的,所以擁有 Servlet 擁有的一系列好處,可以實現(xiàn)各種功能,同時可以很方便地編寫或修改網(wǎng)頁,不用面對大量的 println 語句,但是,什么事情都要把握一個度,在 html 中混入大量、復(fù)雜的業(yè)務(wù)邏輯也是不可取的。
一種雙劍合璧、揚長避短的方法是把 Servlet 當成 Controller 層,用于處理瀏覽器請求,并調(diào)用核心業(yè)務(wù)邏輯(Model)。而 JSP 則用作 View 層,負責(zé)動態(tài)地把處理結(jié)果輸出到 html 中去。
Model、View、Controller,沒錯,這就是我們所說的 MVC 模式啦!這里先不贅述,以后會有一篇文章專門介紹 MVC 。
二、JSP 簡介
JSP 是如何實現(xiàn)這種功能的呢?
通過分析源碼,我們發(fā)現(xiàn),JSP 被服務(wù)器 “轉(zhuǎn)譯” 成了 Servlet。
我們知道,在服務(wù)器中部署 Servlet,需要先把 Servlet 編譯成 .class 文件,所以添加或修改 Servlet 需要重啟服務(wù)器才能生效。而 JSP 的轉(zhuǎn)譯與編譯均由服務(wù)完成,服務(wù)器如果設(shè)置了 JSP 監(jiān)視,則不需重啟就可以應(yīng)用新增或修改的 JSP。
下面動手來個實踐。
本部分內(nèi)容來自 How2J 的 JSP 教程
test.jsp
在 web 目錄下新建一個文件 test.jsp
(Tomcat 的 web 根目錄為 /webapps/ROOT)
<%@page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
hello,jsp
<br>
<%=new Date().toLocaleString()%>
訪問 localhost/test.jsp,可以看到運行結(jié)果

1 代碼分析
Page 指令
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%>
<%@page ... %> 是 JSP 的 Page 指令,為瀏覽器提供當前頁面的使用說明,與 html 的頭對應(yīng)。等價的 XML 格式為
<jsp:directive.page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"/>
JSP 表達式
JSP 表達式的語法格式為:<%= 表達式 %>,JSP表達式會先被轉(zhuǎn)化為 String,然后插入到表達式出現(xiàn)的地方。
<%=new Date().toLocaleString()%>
本行代碼輸出當前的時間。
表達式可以出現(xiàn)在文本行中,而不一定是 html 標簽??梢允褂萌魏畏?Java 語言規(guī)范的表達式。
JSP 執(zhí)行過程
test.jsp 的執(zhí)行過程為:
- test.jsp 被轉(zhuǎn)譯為 test_jsp.java(該類繼承自 HttpJspBase,而 HttpJspBase 繼承自 HttpServlet)
- test_jsp.java 被編譯成 hello_jsp.class
- 執(zhí)行 hello_jsp.class,生成 html
- 通過 HTTP 協(xié)議把 html 響應(yīng)返回給瀏覽器
2 頁面元素
除了上面提到的指令和表達式,JSP 還有以下幾種頁面元素:
靜態(tài)內(nèi)容
即 html/css/javascript 等內(nèi)容
Scriptlet
在 <% %> 之間,可以寫任何 Java 代碼
聲明
在 <% ! %> 之間可以聲明字段或方法,但是不建議這么做。
動作
<jsp:include page="Filename"> 在 JSP 頁面中包含另一個頁面。
注釋
<%-- jsp代碼 --%>
3 其它細節(jié)
其它細節(jié)方面的內(nèi)容感興趣的小伙伴可以自行去了解,還是那句話,編程最重要的是動手去做,不擼個幾百萬行代碼怎么好意思說自己室程序員呢?
Servlet 和 JSP 實際上是各有千秋,我們應(yīng)該如何揚長避短呢?且聽下回分解——