一牢裳、Servlet 與 JSP
Servlet 通常使用字符串拼接的方式動態(tài)生成 html术瓮,大量的 html 內容使代碼難以維護、可讀性差贰健。
感受一下胞四,簡單地加一個 table 得醬寫:
都快看不出來是 Java 代碼了。
后來伶椿,大佬們想辜伟,既然能在 Java 中寫 html,能不能在 html 中寫 Java 呢脊另?
于是 JSP(JavaServer Pages) 誕生了导狡。
JSP 是基于 Servlet API 的,所以擁有 Servlet 擁有的一系列好處偎痛,可以實現各種功能旱捧,同時可以很方便地編寫或修改網頁,不用面對大量的 println 語句踩麦,但是枚赡,什么事情都要把握一個度,在 html 中混入大量谓谦、復雜的業(yè)務邏輯也是不可取的贫橙。
一種雙劍合璧、揚長避短的方法是把 Servlet 當成 Controller 層反粥,用于處理瀏覽器請求卢肃,并調用核心業(yè)務邏輯(Model)。而 JSP 則用作 View 層才顿,負責動態(tài)地把處理結果輸出到 html 中去莫湘。
Model、View郑气、Controller幅垮,沒錯,這就是我們所說的 MVC 模式啦竣贪!這里先不贅述军洼,以后會有一篇文章專門介紹 MVC 。
二演怎、JSP 簡介
JSP 是如何實現這種功能的呢匕争?
通過分析源碼,我們發(fā)現爷耀,JSP 被服務器 “轉譯” 成了 Servlet甘桑。
我們知道,在服務器中部署 Servlet,需要先把 Servlet 編譯成 .class 文件跑杭,所以添加或修改 Servlet 需要重啟服務器才能生效铆帽。而 JSP 的轉譯與編譯均由服務完成,服務器如果設置了 JSP 監(jiān)視德谅,則不需重啟就可以應用新增或修改的 JSP爹橱。
下面動手來個實踐。
本部分內容來自 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窄做,可以看到運行結果
1 代碼分析
Page 指令
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%>
<%@page ... %>
是 JSP 的 Page 指令愧驱,為瀏覽器提供當前頁面的使用說明,與 html 的頭對應椭盏。等價的 XML 格式為
<jsp:directive.page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"/>
JSP 表達式
JSP 表達式的語法格式為:<%= 表達式 %>
组砚,JSP表達式會先被轉化為 String,然后插入到表達式出現的地方掏颊。
<%=new Date().toLocaleString()%>
本行代碼輸出當前的時間糟红。
表達式可以出現在文本行中,而不一定是 html 標簽乌叶∨璩ィ可以使用任何符合 Java 語言規(guī)范的表達式。
JSP 執(zhí)行過程
test.jsp 的執(zhí)行過程為:
- test.jsp 被轉譯為 test_jsp.java(該類繼承自 HttpJspBase枉昏,而 HttpJspBase 繼承自 HttpServlet)
- test_jsp.java 被編譯成 hello_jsp.class
- 執(zhí)行 hello_jsp.class陈肛,生成 html
- 通過 HTTP 協(xié)議把 html 響應返回給瀏覽器
2 頁面元素
除了上面提到的指令和表達式,JSP 還有以下幾種頁面元素:
靜態(tài)內容
即 html/css/javascript 等內容
Scriptlet
在 <% %>
之間兄裂,可以寫任何 Java 代碼
聲明
在 <% ! %>
之間可以聲明字段或方法,但是不建議這么做阳藻。
動作
<jsp:include page="Filename">
在 JSP 頁面中包含另一個頁面晰奖。
注釋
<%-- jsp代碼 --%>
3 其它細節(jié)
其它細節(jié)方面的內容感興趣的小伙伴可以自行去了解,還是那句話腥泥,編程最重要的是動手去做匾南,不擼個幾百萬行代碼怎么好意思說自己室程序員呢?
Servlet 和 JSP 實際上是各有千秋蛔外,我們應該如何揚長避短呢蛆楞?且聽下回分解——