為什么現(xiàn)在大多數(shù)網(wǎng)站是html結(jié)尾,很少見以jsp結(jié)尾?
網(wǎng)友解答: 這個問題其實(shí)很好,其實(shí),如果你弄明白了為啥,能幫助你更好的理解web。談為什么之前,我們先簡單說一http工作的原理。當(dāng)你在瀏覽器中輸入網(wǎng)址的時候,實(shí)際上相當(dāng)于輸入了一條命令
這個問題其實(shí)很好,其實(shí),如果你弄明白了為啥,能幫助你更好的理解web。
談為什么之前,我們先簡單說一http工作的原理。當(dāng)你在瀏覽器中輸入網(wǎng)址的時候,實(shí)際上相當(dāng)于輸入了一條命令,格式如下。
協(xié)議://主機(jī)名[:端口] +參數(shù)
這個命令的意思是。用標(biāo)注的協(xié)議所指定的方法,去鏈接主機(jī)的相應(yīng)端口,參數(shù)是參數(shù)。
比如,當(dāng)你輸入http://www.google.com/ 的時候,實(shí)際是告訴瀏覽器用http的get 方法,去訪問www.google.com主機(jī)的80端口,參數(shù)是"/", 也就是 get /
這個時候,在googl的服務(wù)器上,必須有一個程序來隨時監(jiān)聽客戶端發(fā)來的消息,然后給出相應(yīng)的返回值。比如,當(dāng)接受到get /時,應(yīng)該返回什么。
所以,在以前還沒有動態(tài)網(wǎng)站的時候,web服務(wù)程序(比如IIS)會把參數(shù)和指定目錄(網(wǎng)站根目錄)下的文件一一對應(yīng)起來。比如 get / 會直接返回根目錄下的index.php
同理,當(dāng)你訪問/hello.html的時候,實(shí)際上是把字符串"/hello.html"傳送到了服務(wù)器web程序,web程序會根據(jù)提前設(shè)定的網(wǎng)站根目錄去尋找hello.html文件,并把這個文件返回給客戶端。
這樣通過文件夾組織結(jié)構(gòu),就形成了靜態(tài)網(wǎng)站。但是后來我們需要用程序語言來處理復(fù)雜的邏輯怎么辦。最初的解決辦法就是在html文件中插入特殊的標(biāo)簽,并且保存成相應(yīng)的擴(kuò)展名。
比如我在html中插入java語句,并保存成hello.jsp,放在網(wǎng)站根目錄下。
這個時候,當(dāng)你 get /hello.jsp的時候,tomcat程序會自動調(diào)用java來處理< % %中間的語句,并且把整個.jsp轉(zhuǎn)換成html,再返回到客戶端。
這就是.jsp .php .asp這類網(wǎng)站的工作原理。
但是,你一定要明白一個事實(shí),web服務(wù)程序返回相應(yīng)的 .jsp .html .php文件,一定要這樣做嗎。
當(dāng)然不是,我前面說了,返回文件實(shí)際上是人為定義去做的。作為一個程序,你可以return任何東西。
我可以任意設(shè)計(jì)程序,讓程序返回任何我想要的東西。
比如,我可以讓 get "/hello.html" 返回 字符串"hello world",而這個時候我的服務(wù)器上根本不存在hello.html這個文件。
基于這樣的原因,我們實(shí)際上可以用程序任意設(shè)計(jì)url,這個就叫做路由。而告訴程序某一個路由返回什么的過程,就叫路由綁定。
現(xiàn)代的web程序構(gòu)架,你是根本無法直接訪問html文件的,而是必須把路由綁定到某一個視圖上去。因?yàn)檫@樣可以把原來嵌入到html的java代碼分離出來,寫到特定的類中去,而不用混寫。這樣邏輯更清醒,維護(hù)更方便。這樣的就叫做mvc.
以著名的springMVC舉例,我們看一個小程序。
@RequestMapping("/hello"),就是路由綁定,他代表 當(dāng)你訪問/hello 時,會執(zhí)行hello方法,而hello方法的返回值是 字符串"hello",所以客戶端會收到hello這個字符串。
不過,當(dāng)你正確配置springMVC的時候,程序會自動在/WEB-INF/jsp/ 中尋找hello.jsp,然后返回。(注意,這得JSP和前面例子中的jsp有很大不同,詳細(xì)請學(xué)習(xí)springMVC)。
這時你應(yīng)該明白,如何返回完全是我自定義的。我完全可以修改程序@RequestMapping("/hello.jsp"),這樣就像傳統(tǒng)一樣,通過/hello.jsp 來返回hello.jsp,我也可以@RequestMapping("/a.jsp"),當(dāng)你方向/a.jsp時,返回hello.jsp,我甚至可以令/hello.html 返回hello.jsp .
所以,你現(xiàn)在應(yīng)該明白為啥現(xiàn)在基本上看不到.jsp了吧。
第一 現(xiàn)代符合MVC構(gòu)架的網(wǎng)站 ,網(wǎng)址中的/x/xxx.xxx 已經(jīng)不代表真實(shí)目錄和真實(shí)文件了。所以邏輯上沒有必要出現(xiàn).jsp 。
第二 現(xiàn)代MVC構(gòu)架的網(wǎng)站,網(wǎng)址都是自己設(shè)計(jì)的,使用/hello.jsp 和使用 /hello是沒有區(qū)別的,那為什么不用更短的。hello.jsp沒有必要出現(xiàn)。
第三 /hello.jsp僅僅是傳遞的一個字符串參數(shù),實(shí)際上我可以用任何程序來處理。比如我可以很容易用python寫出 結(jié)尾是.jsp的網(wǎng)站。/hello.jsp可以完全是一個python網(wǎng)站。所以網(wǎng)址中的擴(kuò)展名是沒有必要存在的。你看到網(wǎng)站不是.jsp,但是他的后臺可能仍然是java。
現(xiàn)代大多數(shù)網(wǎng)站,不管用什么語言,大多遵循了MVC的結(jié)構(gòu)。所以,你基本上越來越看不到以n.jsp是啊
網(wǎng)友解答:以前,jsp,asp,aspx等很流行,那是因?yàn)楫?dāng)時前端網(wǎng)頁與后端代碼混合開發(fā)。HTML只負(fù)責(zé)靜態(tài)網(wǎng)頁,其他的腳本負(fù)責(zé)實(shí)現(xiàn)動態(tài)網(wǎng)頁。對于動態(tài)網(wǎng)頁,寫幾行HTML,再插幾句ASP、JSP代碼,然后再寫幾行HTML,再寫幾行jsp,里面還打印幾行HTML內(nèi)容……很難閱讀,也很難調(diào)試。寫一個網(wǎng)頁既要懂網(wǎng)頁設(shè)計(jì):字體、顏色、布局、動畫,又要懂代碼編程、數(shù)據(jù)庫、業(yè)務(wù)邏輯。那時開發(fā)網(wǎng)站的,基本都是“全棧工程師”。
現(xiàn)在,有了各種前段框架(JQuery,Ajax,Angular,Vue,Bootstrap,React,……),前后端代碼分開開發(fā)。前端使用HTML和js來完成各種復(fù)雜的動態(tài)效果,重新刷新和加載后端數(shù)據(jù),而不需要向后端索要整個網(wǎng)頁內(nèi)容。前端負(fù)責(zé)html、css、js,主要是美編、設(shè)計(jì)、圖片處理、js程序員進(jìn)行開發(fā)。而后端只負(fù)責(zé)業(yè)務(wù)及數(shù)據(jù)處理,各種語言都能實(shí)現(xiàn),以java、.net、php、python等語言為主。這些后端數(shù)據(jù)URL可以自己定義后綴名,只要后端增加一個路由解析就可以了。所以,呈現(xiàn)在瀏覽器上的URL基本都是HTML后綴的。但是,如果調(diào)試的話就會發(fā)現(xiàn)有很多內(nèi)部數(shù)據(jù)交互的URL并不是HTML后綴的。