java web是什么原理?
網(wǎng)友解答: 如果你是70、80后的程序員,你一定要看一看這篇文章,保證滿滿的回憶。如果你是90后,那你更要看看這篇文章,因?yàn)槟隳苷业絡(luò)ava web發(fā)展的歷史。言歸正傳,Java語言能長
如果你是70、80后的程序員,你一定要看一看這篇文章,保證滿滿的回憶。如果你是90后,那你更要看看這篇文章,因?yàn)槟隳苷业絡(luò)ava web發(fā)展的歷史。
言歸正傳,Java語言能長期霸占語言排行榜一個(gè)重要的原因就是強(qiáng)大的web開發(fā)能力,web開發(fā)是java的基石(在EJB推出的時(shí)候當(dāng)時(shí)的Sun用基石來描述EJB),所以了解java web開發(fā)原理是非常重要的。如果僅僅跟大家聊java web開發(fā)原理未免有點(diǎn)單薄,今天我將把java web開發(fā)包含的主體內(nèi)容跟酷米的讀者一起分享一下(一直計(jì)劃寫關(guān)于java web的文章,一直也沒時(shí)間寫,今天就當(dāng)時(shí)開個(gè)頭吧)。
Web開發(fā)的歷史web開發(fā)的歷史其實(shí)并不久遠(yuǎn),要搞清楚java web開發(fā)的特點(diǎn)(主要是優(yōu)點(diǎn)),首先要了解web開發(fā)的歷史(簡單的回歸一下)。早期的web是非常簡單的結(jié)構(gòu),用戶發(fā)出請求(request),服務(wù)器給出回應(yīng)(response),這個(gè)時(shí)期的web應(yīng)用,我們稱為web site(網(wǎng)站),特點(diǎn)是一些列靜態(tài)內(nèi)容的集合。看一個(gè)圖示:
圖中的服務(wù)器保持了一系列html腳本來響應(yīng)用戶的請求,可以說這個(gè)時(shí)期的web應(yīng)用還是比較簡單的,但是卻確立了兩個(gè)重要的對象:一個(gè)request(代表請求),另一個(gè)是response(代表回應(yīng))。如果把web開發(fā)的歷史比喻成一部美國大片的話,那么request和response絕對是這部大片的那女主角,而且每一部都是不可或缺的主角(簡單的說就是死不了)。
看到這個(gè)圖,不知道第一批從事web開發(fā)的80后是否和我一樣,已經(jīng)有點(diǎn)感觸了,當(dāng)年為了搞清楚這個(gè)結(jié)構(gòu),曾經(jīng)連續(xù)多少個(gè)通宵做實(shí)驗(yàn)(實(shí)驗(yàn)環(huán)境比較惡劣)。沒關(guān)系,這僅僅是個(gè)開始,我想當(dāng)你看完這篇文章的時(shí)候,你會淚流滿面的(相信我)。為了配合一下這張結(jié)構(gòu)圖,我配一張圖片(當(dāng)年的我):
在web發(fā)展過程中,有一個(gè)小插曲,就是在web site向web application發(fā)展的過程中,出現(xiàn)了一個(gè)小“玩意兒”,就是applet,很多人了解java都是從使用java applet開始的(70,80后那一批程序員)。當(dāng)時(shí)風(fēng)靡校園(我當(dāng)時(shí)在讀大一)的網(wǎng)易聊天室,哎呀那個(gè)火?。ù蠹一貞浺幌履阍趯W(xué)校機(jī)房上網(wǎng)時(shí)的興奮),這個(gè)聊天室就是采用了applet構(gòu)建的,當(dāng)時(shí)applet給靜態(tài)頁面一個(gè)動態(tài)交互的可能,著實(shí)火了一段時(shí)間?,F(xiàn)在知道applet的程序員,你已經(jīng)暴露年齡了??匆粡垐D片吧:
我想這個(gè)時(shí)候,淚點(diǎn)低的70、80后已經(jīng)有點(diǎn)濕潤了吧。濕潤的,自覺在這里停留一分鐘,對著屏幕來張合影,發(fā)個(gè)朋友圈。
過了這個(gè)插曲,真正的三層web開發(fā)來了,一個(gè)里程碑式的web處理方式CGI,看一張圖:
CGI的推出,使得web開發(fā)正式進(jìn)入了動態(tài)處理時(shí)代,服務(wù)器能與客戶有真正意義上的交流了,有能存儲數(shù)據(jù)的數(shù)據(jù)庫了,雖然CGI的使用周期并不長,但是一定要紀(jì)念一下它,畢竟它是里程碑式的變革。java web技術(shù)正是踩著CGI的肩膀來到了廣大程序員的面前,java web解決了CGI的性能問題。CGI是以進(jìn)程為單位管理請求的,而java web則是以線程為單位,處理能力更強(qiáng),占用的資源更少,這個(gè)核心的組件就是Servlet??匆唤M資源占用圖,先看CGI的:
再看一下java web中的servlet資源圖:
孰優(yōu)孰劣一目了然,Servlet解決相同數(shù)量的請求,卻占用較少的系統(tǒng)資源,這就是為什么廣大程序員拋棄了CGI轉(zhuǎn)向java web的原因。
另外,開發(fā)一個(gè)Servlet并不復(fù)雜,看一個(gè)Servlet編寫的HelloWorld應(yīng)用:
這個(gè)代碼結(jié)構(gòu)是不是很親切,是不是很有Coding的感覺,其實(shí)Servlet就是個(gè)java 類而已,只不過增加了幾個(gè)限制而已,所以開發(fā)一個(gè)Servlet并不復(fù)雜。然后就是把它部署到web服務(wù)器上(Tomcat這個(gè)老人家現(xiàn)在身體依然硬朗?。缓缶偷却蛻舻恼埱缶涂梢粤恕_@是Servlet的三層部署圖:
java web開發(fā)的技術(shù)體系還包括javabean和jsp,采用MVC結(jié)構(gòu)來組合這三個(gè)技術(shù)是java web開發(fā)的基礎(chǔ)內(nèi)容,先看一下MVC的功能圖:
再看一下組合使用Servlet+javaBean+JSP的Model2開發(fā)結(jié)構(gòu):
這個(gè)結(jié)構(gòu)是標(biāo)準(zhǔn)的Java web開發(fā)結(jié)構(gòu),現(xiàn)在是不是很少能看到這么“干凈”的描述圖了?以上就是標(biāo)準(zhǔn)的java web 開發(fā)的歷史描述,當(dāng)然這并不是說這些內(nèi)容已經(jīng)過時(shí)了,反而它一直是官方的標(biāo)準(zhǔn)解決方案。只不過web發(fā)展迎來了另一個(gè)階段,繁榮的開源架構(gòu)時(shí)代來了。。。
開源框架時(shí)代這個(gè)時(shí)代的典型代表就是Struts、Spring和Hibernate,簡稱SSH。
嚴(yán)格的說,這部分內(nèi)容并不是官方解決方案,但是這些方案卻得到了廣大程序員的擁護(hù),一方面原因是EJB的方案太重了,另一方面開源架構(gòu)使用起來非常方便和靈活,所以從03年以后這些開源框架得到了普通的使用。
下面我簡單描述一下這三個(gè)框架:
Struts基于MVC結(jié)構(gòu)的解決方案,分為struts1(已經(jīng)淘汰了,用過Struts1的程序員已經(jīng)老了)和struts2兩個(gè)版本,和Python一樣,這兩個(gè)版本不兼容,目前Struts2的最新版本是2.5.14.1,簡單的說Struts就是構(gòu)建了現(xiàn)成的MVC框架,程序員往這個(gè)框架里加代碼就可以了,使用起來非常方便。
Hibernate框架完成了面向?qū)ο笈c面向關(guān)系的映射,讓java程序以面向?qū)ο蟮姆绞讲僮髅嫦蜿P(guān)系的數(shù)據(jù)庫。整體結(jié)構(gòu)基于DAO進(jìn)行擴(kuò)展,很多操作只需要配置一下就可以了,極其方便。
Spring提供了javaBean的容器,池化了javabean,提高了性能,而且核心代碼不到2M,小巧且強(qiáng)大。
關(guān)于這三個(gè)框架我在酷米將寫專門的文章介紹,今天就不再進(jìn)行擴(kuò)展了。
今天看到這個(gè)問題,有感而發(fā),原來我們80后真的老了,80后的程序員,看到這篇文章,有沒有所感觸?關(guān)注我吧,我們一起回憶,再一起繼續(xù)奮斗!
網(wǎng)友解答:java web的基礎(chǔ)api是servlet,通過servlet實(shí)現(xiàn)http請求的訪問。更底層的實(shí)現(xiàn)就是servlet容器了。常用的容器有tomcat,jetty, weblogic等。
tomcat有兩大組件,connector和container,每個(gè)connector是一個(gè)http端口連接,接受http請求,封裝成httpservletrequest,然后調(diào)用container處理。由于有海量用戶訪問,因此connector有bio和nio兩種模式。bio模式每個(gè)connector綁定一個(gè)線程池,每個(gè)請求一個(gè)線程處理。nio模式使用java nio api,基于reator模式,實(shí)現(xiàn)io多路復(fù)用。
container是一種層次結(jié)構(gòu),從頂層到底層分為server,service,host,context,context是最基本的容器,我們通常開發(fā)的java web程序就部署為一個(gè)context。java web servlet容器頂層接口servletcontext就代表一個(gè)context。
java web可能用mvc框架,如spring mvc,Struts2等。將所有的請求集中在一個(gè)前端控制器中,如spring mvc中的dispatcher servlet。對對于靜態(tài)頁面的訪問,tomcat提供了基本的servlet支持。每個(gè)servlet容器如tomcat, jetty等都提供了靜態(tài)訪問的默認(rèn)servlet,當(dāng)web.xml中配置的servlet不匹配時(shí)由默認(rèn)servlet處理,返回靜態(tài)頁面。