曾經(jīng)風(fēng)光無(wú)限的 JSP,為什么現(xiàn)在很少有人使用了?(曾經(jīng)風(fēng)光無(wú)限的 jsp,為什么現(xiàn)在很少有人使用了呢)
來(lái)源 | 愚公要移山(ID:fdd_sxu_nwpu)
jsp技術(shù)作為曾經(jīng)一度火爆的技術(shù),在最近幾年確實(shí)使用率越來(lái)越低了,這篇文章帶你一塊探究一下jsp的從生到死。
jsp技術(shù)的誕生
在很久很久以前,那時(shí)候我們的開(kāi)發(fā)都是通過(guò)servlet來(lái)完成的,這個(gè)servlet是什么呢?我們先來(lái)認(rèn)識(shí)一下:
servlet用Java語(yǔ)言編寫(xiě)的服務(wù)器端程序。主要功能是和瀏覽器進(jìn)行交互,生成頁(yè)面展示。
長(zhǎng)下面這個(gè)樣子:
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletrequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter;
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
}
}
我們可以看到前端所展示的頁(yè)面,需要我們servlet去一個(gè)標(biāo)簽一個(gè)標(biāo)簽去生成,如果一個(gè)頁(yè)面超級(jí)復(fù)雜,動(dòng)不動(dòng)幾千行代碼,那這個(gè)servlet效率也就太低了。而且整個(gè)servlet代碼也會(huì)十分臃腫而且可讀性非常差。
這時(shí)候怎么辦呢?sun公司很早就意識(shí)到了這個(gè)問(wèn)題,于是便倡導(dǎo)很多公司一塊來(lái)創(chuàng)建了一種能夠動(dòng)態(tài)生成html的新技術(shù),不久之后jsp便誕生了。有效率的解決了上面servlet所出現(xiàn)的問(wèn)題。
jsp的發(fā)展
既然jsp技術(shù)能夠解決剛剛servlet代碼里面所出現(xiàn)的技術(shù),我們來(lái)看一下是如何解決的:在這里我們舉一個(gè)小例子,就是前端jsp向服務(wù)器servlet發(fā)送請(qǐng)求圖書(shū)頁(yè)面的功能。
首先我們看一下servlet:
public class List_book extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//聲明一個(gè)ArrayList.用來(lái)存放Book類中的數(shù)據(jù)
ArrayList<Book> list = new ArrayList<Book>;
for(int i=0;i<10;i ){
Book book = new Book;
book.setName(res.getString("name" i));
book.setAuthor(res.getString("author" i));
list.add(book);
}
//將list數(shù)據(jù)發(fā)送到.jap文件中
request.getRequestDispatcher("ListBook.jsp").forward(request, response);
}
}
我們會(huì)發(fā)現(xiàn),現(xiàn)在的servlet沒(méi)有一點(diǎn)html代碼了。我們只需要把數(shù)據(jù)交給jsp。此時(shí)我們的頁(yè)面展示就交給jsp來(lái)做了。現(xiàn)在我們來(lái)看一下jsp長(zhǎng)什么樣子:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%String path = request.getContextPath;%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="description" content="This is my page">
<script></script>
</head>
<body>
<% ArrayList list = (ArrayList) request.getAttribute("list"); %>
<h2 align = "center">圖書(shū)列表</h2>
<table border = 1px align = "center">
<tr><th>圖書(shū)名稱</th><th>圖書(shū)作者</th></tr>
<!-- 繼續(xù)使用jsp語(yǔ)句 循環(huán)放入存放于list中的Book實(shí)體類中的數(shù)據(jù) -->
<%
for(int i = 0;i<list.size;i ){
Book book =(Book)
list.get(i);%>
<tr><th><%=book.getName %></th><th><%=book.getAuthor%></th><tr>
}
%>
</table>
</body>
</html>
這就是jsp,我們可以在html頁(yè)面中寫(xiě)一些java代碼。對(duì)于我們程序員來(lái)說(shuō),在開(kāi)發(fā)當(dāng)中靜態(tài)的頁(yè)面我們只需要用html和css寫(xiě)一些標(biāo)簽來(lái)展示即可,對(duì)于那些動(dòng)態(tài)的部分我們就可以使用java代碼。
那么jsp和servlet是不是就是這種協(xié)作的關(guān)系,本質(zhì)上有什么區(qū)別呢?
其實(shí)jsp只是servlet的一種特殊形式,每一個(gè)jsp頁(yè)面就是一個(gè)servlet實(shí)例,通俗一點(diǎn)的話來(lái)說(shuō):jsp就是servlet,只不過(guò)servlet把一些業(yè)務(wù)功能剝離開(kāi)來(lái)交給了或者是形成了jsp。明白了吧。在我們的項(xiàng)目編譯的時(shí)候就是把jsp編譯成了servlet。
你們會(huì)發(fā)現(xiàn),這樣做其實(shí)挺好的,市場(chǎng)也驗(yàn)證了一切,很快jsp技術(shù)流行開(kāi)來(lái),可是隨著時(shí)間的流逝,業(yè)務(wù)越來(lái)越復(fù)雜,jsp也開(kāi)始跟不上時(shí)代了。
jsp的危機(jī)
我們先看一個(gè)對(duì)話場(chǎng)景:
java程序員:終于寫(xiě)完了功能,是時(shí)候在界面上展示了。
前端程序員:你功能寫(xiě)完了,我沒(méi)有數(shù)據(jù),在頁(yè)面什么沒(méi)法展示呀
java程序員:數(shù)據(jù)我寫(xiě)好了,你在jsp中調(diào)用XX方法就能獲取了,
前端程序員:我已經(jīng)在jsp中寫(xiě)好了這個(gè)方法,你為什么自己寫(xiě)了?
于是乎,無(wú)窮無(wú)盡的爭(zhēng)吵還在繼續(xù)當(dāng)中。
這就是jsp的弊端,為什么呢?我們可以來(lái)總結(jié)一下:
(1)動(dòng)態(tài)和靜態(tài)資源放在一起,一旦服務(wù)器出現(xiàn)狀況,前后臺(tái)一起玩完,用戶體驗(yàn)極差。
(2)一旦jsp出現(xiàn)了問(wèn)題,就需要前端后端發(fā)開(kāi)人員一塊來(lái)分析解決,效率低。
(3)jsp無(wú)法使用nginx等。
(4)jsp頁(yè)面復(fù)雜,難以修改。
(5)第一次加載jsp需要編譯成servlet,時(shí)間久,而且業(yè)務(wù)量大的時(shí)候,jsp負(fù)擔(dān)太大。
(6)jsp對(duì)于開(kāi)發(fā)人員簡(jiǎn)直就是一個(gè)揮之不去的痛,太難了?。?!
鑒于以上缺點(diǎn),于是另外一套機(jī)制橫空出世了,這就是前后端分離。什么是前后端分離呢?
前后端分離其實(shí)就是后端工程師只關(guān)注于后端頁(yè)面的開(kāi)發(fā),不再處理前端問(wèn)題。前端工程師只關(guān)注于自己的頁(yè)面開(kāi)發(fā)。需要數(shù)據(jù)交互的時(shí)候,兩者會(huì)有一份接口文檔。
就這樣這種思想架構(gòu)很快的流行開(kāi)來(lái),這也就是為什么jsp落寞的真正原因。從此java從jsp轉(zhuǎn)向了restful結(jié)構(gòu),springMCV也開(kāi)始流行開(kāi)來(lái),并逐漸占領(lǐng)了市場(chǎng)。前后端分離有什么優(yōu)點(diǎn)呢?我們來(lái)總結(jié)一下:
(1)動(dòng)態(tài)和靜態(tài)資源分開(kāi)存儲(chǔ)。
(2)出現(xiàn)bug能很快定位是前端還是后端。
(3)支持nginx。在高并發(fā)狀態(tài)下極其優(yōu)秀。
(4)直接請(qǐng)求頁(yè)面,不用編譯,速度效率都提上來(lái)了。
(5)從此前端和后端是相親相愛(ài)的一家人了?。。?!
jsp的落幕
又隨著時(shí)間的推移,jsp的時(shí)代基本上一去不復(fù)返了,因?yàn)槲覀冇肿呷肓艘苿?dòng)互聯(lián)時(shí)代,這時(shí)候的客戶端可不是前端頁(yè)面了,還包括手機(jī)、汽車、電視等等各種設(shè)備,這種情況下,前后端必須要分離了。jsp基本上徹底告別了它的舞臺(tái)。