首先先介紹一下JSP是什么,JSP全稱java server pages(java服務(wù)器頁面)。它是一種動(dòng)態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn),說簡(jiǎn)單點(diǎn)就是服務(wù)器用來動(dòng)態(tài)生成HTML頁面的。聽著是不是很熟悉?沒錯(cuò),還有另一門語言專門從事動(dòng)態(tài)生成HTML頁面,這門語言叫PHP。
沒有JSP的時(shí)代
在SUN公司剛開始做java web方面的設(shè)計(jì)的時(shí)候,他們?cè)O(shè)計(jì)了servlet來作為服務(wù)器應(yīng)用處理請(qǐng)求和響應(yīng),通過動(dòng)態(tài)輸出HTML代碼的方式來向用戶范圍HTML頁面,如下圖所示:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
// Hello
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>W3Cschool618有課程優(yōu)惠啦快來看看吧</h1>");
out.println("</body></html>");
}
但是這種方法并不合理。首先,做過前端開發(fā)的小伙伴都知道,一個(gè)前端頁面動(dòng)輒幾百行代碼,如果像上圖一樣進(jìn)行輸出,后端程序員就得一直復(fù)制黏貼這些前端代碼,一個(gè)?doGet()
? 方法里面將會(huì)有很多這樣的代碼,影響代碼的整潔,容易擾亂程序員的邏輯,而且有些符號(hào)會(huì)被java編譯器錯(cuò)誤識(shí)別,這樣的錯(cuò)誤需要花費(fèi)時(shí)間去調(diào)教(比如HTML文本中有雙引號(hào)會(huì)導(dǎo)致字符串輸出提前結(jié)束,后面的代碼編譯器編譯不了,會(huì)拋出一堆錯(cuò)誤)。這種在java代碼里寫html代碼的方式飽受程序員詬病,恰逢P(guān)HP和ASP.Net的出現(xiàn),他們使用更簡(jiǎn)單的方式來輸出HTML代碼(在HTML代碼中嵌入響應(yīng)語言來引入動(dòng)態(tài)數(shù)據(jù)),很多程序員因此轉(zhuǎn)而使用這兩種語言,java也因此流失了一部分程序員。
JSP誕生
SUN公司在看到了PHP等語言的成功經(jīng)歷后也搞了一個(gè)類似的技術(shù),就是接下來要介紹的JSP。JSP的設(shè)計(jì)理念與servlet截然相反,servlet是在java代碼中輸出HTML頁面,而JSP則是在HTML代碼中嵌入java代碼。使用JSP之后web開發(fā)者就不用將HTML頁面復(fù)制到servlet了,這樣既減少了servlet的代碼量,使代碼更加簡(jiǎn)潔易懂,而且也不用擔(dān)心html中的符號(hào)被Java編譯器錯(cuò)誤識(shí)別了(下方代碼應(yīng)為?.jsp
?后綴)。
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP - Hello World</title>
</head>
<body>
<h1> <% out.println("Hello World!");%>
</h1>
<br/>
<h2>學(xué)習(xí)jsp,就到j(luò)ava編程獅</h2>
</body>
</html>
相比于PHP而言,JSP可謂是背靠java這種大山,因?yàn)镴SP在編譯時(shí)會(huì)被編譯成servlet,所以本質(zhì)上它也是servlet,是解決了servlet的HTML輸出的servlet。因?yàn)槭莝ervlet,所以在性能上比PHP這種動(dòng)態(tài)類型語言更加優(yōu)秀,也具有更高的易用性。
JSP的衰落
隨著Ajax的提出,使用Ajax來進(jìn)行靜態(tài)頁面的動(dòng)態(tài)數(shù)據(jù)渲染逐漸成為主流。因?yàn)椴还苁荘HP還是servlet,他們生成頁面的速度永遠(yuǎn)沒有靜態(tài)的Apache服務(wù)器派發(fā)靜態(tài)頁面的速度快,而一個(gè)頁面往往需要渲染的數(shù)據(jù)只有一小部分,這時(shí)候聰明的開發(fā)者提出了一種新想法:先讓Apache服務(wù)器派發(fā)一個(gè)靜態(tài)的頁面,然后這個(gè)靜態(tài)頁面通過Ajax請(qǐng)求向服務(wù)器獲取這部分需要渲染的數(shù)據(jù),然后在瀏覽器進(jìn)行渲染。以往服務(wù)器要生成一整個(gè)HTML頁面,現(xiàn)在只需要生成這部分?jǐn)?shù)據(jù)并以指定格式返回即可,大大減小了服務(wù)器的壓力。然后很多小伙伴們會(huì)發(fā)現(xiàn),返回指定格式的數(shù)據(jù)用servlet就能輕易做到,而HTML靜態(tài)頁面直接用html文件存放在靜態(tài)的Apache服務(wù)器上,JSP需要做的工作,沒有了。沒錯(cuò),這種操作促進(jìn)了前后端的分離,也導(dǎo)致了JSP的衰落。
小結(jié)
所以呢,學(xué)JSP有用嗎?在沒有前后端分離的年代里,學(xué)JSP可以降低你的代碼量,讓你的項(xiàng)目有更好的結(jié)構(gòu),但是現(xiàn)在JSP已經(jīng)被淘汰了,所以可以不學(xué)JSP,不過作為后端的一種技術(shù),了解一下JSP也是有好處的。
點(diǎn)擊這里前往JSP學(xué)習(xí)手冊(cè)