1. 程式人生 > >Java Web知識梳理

Java Web知識梳理

ont xxx tel 有用 方法 字符 loader 不同的 clas

今天給內部做了個培訓,貌似搞錯了對象,不該對新人講這麽原理性的東西。

anyway,還是放上來吧,不知道有沒有人能理清其中的邏輯 ^ _ ^


問題:為什麽要用tomcat
tomcat: servlet container
servlet + container

web的基礎是什麽?
網絡編程:鏈接、數據
  鏈接:Socket/ServerSocket
  數據:InputStream/OutputStream Stream
數據是什麽?網絡中傳輸的Bits!
但是,Bits不是我們想要的,我們想要的是信息Information!
  Information是什麽?Bits + Context! CSAPP
web編程的Context是什麽?
  TCP、UDP...
但是,這只是最底層面的!
  TCP、UDP等協議本身是為了傳輸數據
怎麽解讀?還是Context!
  HTTP!

所以,java web 網絡編程就是:創建鏈接,然後按照HTTP協議格式來解析那些由用TCP協議傳輸的數據!

務必理解這個。
所以,必須熟悉HTTP協議的格式!

  是<html>...</html>嗎?
  NO!
這只是HTTP協議中的body部分!務必理解這個。

問題來了:每次都要自己負責鏈接,累不累?還得考慮並發負載等優化,需要足夠專業的知識才行。
Java編程的特點是什麽?讓專業的人負責專業的事!
於是JavaEE社區提出了Servlet + Servlet Container的概念。
Servlet負責業務邏輯,而Servlet Container負責資源的申請、釋放,請求的路由等功能!分工明確,可以更專註於自己的部分。

此外,還有Filter、Listener的概念,這是因為容器的特性而出現的!

容器服務器、app server、web server APACHE cgi

ServletContextLoaderListener、RequestAttributeListener

既然容器負責了鏈接、路由等功能,那完全可以在項目加載之前或之後、Servlet加載之前或之後、鏈接創建之後、路由之前或之後等生命周期的不同階段進行不同的處理。這非常有用,可以更簡潔的實現一些需求 - 類似於創建對象時執行的構造方法、靜態代碼塊、動態代碼塊等情況。另外,Spring的bean也有類似的生命周期。

對了,還有JSP,為什麽還需要這個呢?
因為Servlet中要返回什麽頁面是很麻煩的,使用字符串來拼接html語句。
JSP就簡單的多,但實際上,最後它還是被轉成servlet的class文件,不同的是,裏面要輸出的內容都已經由容器幫你轉成了字符串。
就是說,這是一種幫你簡化Servlet返回html內容的技術。


問題又來了:既然有了Servlet、Servlet Container,為什麽還有Struts、Spring MVC等框架?
這是因為Servlet只有最基礎的功能,更深層次的需求就需要用戶自己去實現,包括同步異步處理、編解碼、參數/實體類對象之間的轉換、國際化等功能。

Struts的核心類是什麽?web.xml PreparexxxxFilter Action 多例
Spring MVC的核心類是什麽?web.xml DispatcherServlet url-mapping /** 單例


為什麽要有自己的核心類?
為什麽二者是不同的? - Struts的核心類能否換成類似SpringMVC的?


Java Web知識梳理