瞭解JavaWeb,一篇就夠

来源:http://www.cnblogs.com/mesopotamia/archive/2016/06/02/5552508.html
-Advertisement-
Play Games

JavaWeb不能吃。本文將帶你在JavaWeb的世界里走馬看花,踏雪尋梅,讓你明白,JavaWeb究竟是個啥。 ...


JavaWeb不能吃。本文將帶你在JavaWeb的世界里走馬看花,踏雪尋梅,讓你明白,JavaWeb究竟是個啥。

JavaWeb中,客戶端(比如瀏覽器頁面,用戶能夠看到的一端)和伺服器端(後臺伺服器要有程式來處理客戶端發過來的信息)的交互主要用到了Servlet容器。即:網頁前端應用HTML(JSP等),而伺服器響應使用的是Servlet(Java程式)。

比如,下麵是一個Servlet的Demo,它一般繼承HttpServlet,覆蓋doGet和doPost方法。doPost有倆入參,req是客戶端發送過來的請求信息(如:用戶名,密碼等),而resp就是該Servlet即將發回客戶端的響應信息。該例子將發回客戶端界面一段HTML代碼,客戶將可以看到相關的展示信息。

 

Servlet的重要對象:

HttpServletResponse類
a)客戶端請求伺服器後,伺服器就會將返回信息封裝到類HttpServletResponse里進行響應。相應時會攜帶相應狀態碼:
i.100-199:服務端成功接收請求,但要求客戶端繼續提交下一次請求才能完成全部處理過程。
ii.200-299:服務端已經成功接收請求,並完成全部處理過程。
iii.300-399:客戶端請求的資源已經移交到了別的位置,並向客戶端提供了一個新的地址(由HTTP相應消息頭的Location欄位指定)。
iv.400-499:客戶端的請求有錯誤。(使用setError方法設置)
v.500-599:伺服器端出現錯誤。
vi.使用setStatus設置各種狀態響應碼。
vii.HttpServletResponse提供了一個sendRedirect方法設置響應碼302,實現客戶端重定向到URL。
b)添加和設置響應消息頭:addHeader、setHeader。

HttpServletRequest類
a)在客戶端請求某一個Servlet時,Servlet引擎為這個Servlet創建了一個HttpServletRequest對象來存儲客戶端的請求信息,併在調用service方法時將HttpServletRequest對象作為參數傳給service方法。 b)HttpServletRequest介面中定義了若幹方法來獲取請求行中各部分的消息,比如: i.getMethod,獲取請求行中的請求方法(GET、POST等)。 ii.getRequestURL,返回資源部分。 iii.getQueryString,返回參數部分。 iv.等等。 c)HttpServletRequest介面中還定義了用於獲得客戶端和伺服器端與網路連接有關的信息的方法。 i.getRemoteAttr,返回客戶機用於發送請求的IP地址。 ii.getRemotePort,返回客戶機所使用的網路介面的埠號。 iii.getLocalAddr,返回Web伺服器上接收請求的網路介面使用的IP地址。 iv.還有客戶機名稱、服務端埠、服務端名稱等等。 d)介面中還定義了獲取請求消息的請求頭等等。

Cookie
a)Cookie是一種在客戶端保存信息的技術。是在瀏覽器訪問某個Web資源時,由Web伺服器在HTTP相應消息頭中通過Set-Cookie欄位發送給瀏覽器的一組信息。 b)瀏覽器會根據Set-Cookie欄位中的Cookie數據決定是否保存這些Cookie。當瀏覽器下一次訪問這個Web資源時,會自動讀取這些被保存的Cookie,並加到HTTP請求消息頭的Cookie欄位中,Web伺服器會根據Cookie欄位的內容作出相應的處理。 c)Web伺服器可以給一個Web瀏覽器發送多個Cookie,但每個Cookie的大小一般被限製為4KB。 d)java.servlet.http.Cookie類來封裝一個Cookie消息, e)用HttpServletResponse的addCookie方法向瀏覽器發送Cookie。 f)用HttpServletRequest的getCookies方法來讀取瀏覽器傳遞過來的Cookie信息 h)在Cookie中只能保存ISO-8859-1編碼支持的字元,如果要在Cookie中保存更複雜的數據,以Base64格式進行編碼。
Session a)Cookie適宜保存數據量小,結構簡單的數據。 b)將大量數據保存在服務端並使用SessionID對這些數據進行跟蹤,這就是Session技術。 c)在Servlet中使用HttpSession類來描述Session,一個HttpSession對象就是一個Session。 d)使用HttpSservletRequest的getSession方法獲取HttpSession對象。 e)HttpSession中封裝有各種操作Session信息的方法,如: i.getId:返回當前SessionID. ii.setMaxInactiveInterval,getMaxInactiveInterval:設置、獲取session可空閑的最長時間。當某個HttpSession對象在超過這個最長時間後仍然沒有被訪問時,該HttpSession對象就會失效,整個會話過程結束。 iii.getServletContext:返回當前session所屬的Web應用程式的ServletContext對象。 iv.等等。 f)ServletRequest對象存儲的對象只能被當前請求的Servlet訪問。 g)HttpSession存儲的對象可以被當前會話中所有的Servlet訪問, h)ServletContext對象存儲的對象可以被所有的Servlet訪問和共用。 i)一個請求只能屬於一個Session,但是一個Session可以擁有多個請求。 j)通過SessionID尋找HttpSession對象的過程也叫做Session跟蹤。 k)第一次訪問URL時,在生成響應消息頭時將SessionID作為一個臨時Cookie放到了消息頭的Set-Cookie欄位中,所以可以通過Cookie追蹤Session。 l)通過重寫URL跟蹤Session i.如果客戶端瀏覽器不支持Cookie或者將Cookie功能關閉,那麼就無法使用Cookie來保存和傳遞SessionID。 ii.在Cookie無法工作的情況下使用URL參數傳遞SessionID。 iii.要想通過URL發送SessionID,必須要重寫URL。 1.encodeURL方法:對所有內嵌在Servlet中的URL進行重寫。 2.encodeRedirectURL:對sendRedirect方法所使用的URL進行重寫。

 

 

HTML是啥?

HTML是超文本標簽語言,你看到的一般靜態網頁就是HTML。給一個Demo大概瞭解它的結構:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <title> 歡迎來到煎餅果子不放蔥 </title>
 5     </head>
 6     <body>
 7         <p>這是我的第一個網頁,在這裡
 8             <a href="http://www.cnblogs.com/mesopotamia/">
 9                 盡情學習HTML
10             </a>吧!
11         </p>
12     </body>
13 </html>

附:HTML的常用標簽:

 

1)HTML基本結構組成,<HTML><HEAD><BODY>等。
2)段落格式設置標簽,<p><br><div><span>等。
3)超級鏈接標簽<a href..>。
4)圖像標簽<img>、表格標簽<table><tr><td><th>等。
5)框架標簽<frame><frameset>等。
6)表單標簽<input><select>等。
7)等等。

 

 

 

 

有些網頁很漂亮,誰裝飾了HTML的窗子,誰點綴了HTML的夢?

對於HTML,在外觀、方位等佈局上需要裝飾,這就用到CSS。一段文字的顏色、大小,一個按鈕的位置,背景圖案,甚至動畫效果,都是CSS的功勞。例如:

 

上圖中,公告、置頂隨筆等文字,博客園、首頁等選項,各個標題、內容等,這都是HTML。那“漢謨拉比”的字體顏色是灰色的,“置頂隨筆”的字體顏色是藍色的,“6個月”、“45”等是有下劃線的,背景引入了美好的圖片,這些,都可以通過CSS來輔助實現。我打開瀏覽器的調試器狀態來看:

左邊是界面效果,中間是HTML,右邊是CSS樣式。

1)CSS是Cascading Style Sheet(層疊樣式化表單)的簡稱,用於給網頁元素定義樣式(顏色、字體、大小、位置等等)。
2)CSS格式分為選擇器和樣式規則。
3)在HTML元素的style屬性中定義樣式。
4)在HTML中定義樣式代碼。
5)在外部文件中定義樣式。

 

操作HTML的工具是啥?

那麼客戶端需要對HTML進行便捷的操作,我想要輕鬆訪問HTML的各個節點併為我們服務,我想要獲取瀏覽器的相關屬性信息,以便更好的優化客戶端體驗,我想要編寫一系列方法來操作和控制HTML,那麼我們需要使用的是JavaScript。比如:

用getElementById()來取出HTML元素。再比如:navigator.appVersion可以獲取瀏覽器的版本信息。

1)var定義變數。
2)原始類型:Undefined、Null、Boolean、Number、String等。
3)類型轉換:toString()、parseInt等。
4)函數定義與函數調用,關鍵詞function。
5)類和對象。自定義類的方式,工廠方式、構造函數方式、原型方式等。
6)預定義的類,Object、Array、String、Number等。

 

誰輔佐JavaScript來指點江山?

DOM(文檔對象模型)把HTML的各個元素,組件都封裝成對象的形式,然後JavaScript就可以直接操縱這些對象,從而操縱Html。比如上例中,navigator.appVersion,navigator就是把瀏覽器信息封裝成一個對象,而appVersion是一個屬性。

1)DOM的主要功能是獲得HTML語言中的各個元素(div、form等),使用對象的方法,很容易獲得這些元素的信息,或動態向元素中添加新的元素。
2)獲取HTML元素的三種方法。
a)getElementById。
b)getElementsByName。
c)getElementsByTagName。

 

有時候需要載入頁面的一部分信息,而不想刷新頁面,怎麼辦?

過Servlet進行客戶、伺服器端交互時,有時頁面對伺服器返回的數據載入時不需要重新刷新界面,這就用到AJAX技術。用ajax來創建請求、發送請求信息,然後獲取響應結果後再根據結果修改頁面。用javascript原生ajax技術代碼比較複雜,下麵看一下jQuery對ajax的用法:(jQuery是基於javascript開發的一個輕量框架,用簡潔的指令,統一的規範,讓javascript更方便的服務於我們):

 

url是我們發送請求的鏈接(把請求發給哪個Servlet程式來處理),data是發送的參數。success是發送成功後,接收到響應信息,該怎麼處理。再詳細一點;

如果我想實現這麼一個功能:點擊“蘋果”按鈕,發送請求,後臺程式發現請求內容是“蘋果”時,返回前臺一個“蘋果”圖片的鏈接,然後前臺頁面根據這個鏈接把蘋果圖片展示在界面上。(在這裡,我們點擊“蘋果”,展示圖片,是靜態載入的,我們不希望點擊“蘋果”後,duang~,頁面刷新了一下,這樣很影響用戶體驗。這時,我們用ajax就可以輕鬆解決)

我們為“蘋果”按鈕綁定一個調用ajax代碼的程式,然後在ajax中,"url"填寫處理蘋果請求的鏈接,其他參數不變,"data"寫“蘋果”,然後success後面的回調函數的參數,就是返回的蘋果圖片鏈接,在這個函數內部,我們把鏈接載入到頁面上。

【以無刷新的形式更新HTML內容(幻化於無形)】
1)AJAX是JavaScript、CSS、DOM、XMLHttpRequest的合體。
2)AJAX的核心對象是XMLHttpRequest。
3)AJAX的功能:以同步或非同步的方式發送HTTP請求,並獲得服務端的響應信息。
4)使用XMLHttpRequest獲得Web資源
a)創建XMLHttpRequest。
b)使用open()方法發送HTTP請求信息。
c)使用send()方法向伺服器端發送數據。
d)獲取方式分為同步、非同步。

Servlet與HTML的交互任務多了會很複雜,怎麼簡化?

 

通過Jsp技術可以方便利用Servlet進行HTML與伺服器的交互,JSP封裝了Servlet,更利於開發。也就是說,JSP實際上是一個變相的Servlet,但是它把HTML、CSS、JavaScript、Servlet等柔和在一起,整合成一個頁面,這樣,所有關於前端的處理都在JSP中進行,後臺程式的任務就變得簡單清晰。下麵是JSP代碼示例:

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     
12     <title>My JSP 'demo1.jsp' starting page</title>
13     
14     <meta http-equiv="pragma" content="no-cache">
15     <meta http-equiv="cache-control" content="no-cache">
16     <meta http-equiv="expires" content="0">    
17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18     <meta http-equiv="description" content="This is my page">
19     <!--
20     <link rel="stylesheet" type="text/css" href="styles.css">
21     -->
22 
23   </head>
24   
25   <body>
26     <% 
27         Date date=new Date();
28         out.write(date.toLocaleString());
29     %>
30   </body>
31 </html>

我們可以看到:<% %>裡面可以嵌入Java代碼;而Java代碼中的request其實是Servlet中的request對象,就是前面講到的HttpSevletRequest對象。JSP封裝了Servlet的相關對象,所以我們可以輕而易舉的在JSP中獲取這些對象。比如,我想獲取請求參數,我不必在後臺利用HttpSevletRequest來獲取,我直接在前臺JSP頁面中用request.getParameter("...")就能獲取,甚至用簡潔的符號${}就能獲取到。

jsp的主要內置對象:

在JSP程式中也需要出現一些常見功能,如向客戶端輸出信息、處理請求信息、響應消息、獲得請求參數、讀取配置文件的信息等。這些功能在Servlet中實現起來簡單,如通過HttpServletRequest獲取請求參數等。在JSP頁面中,這些功能是由JSP的內置對象來完成的。從本質上講,這些內置的對象等同於Servlet中相應的對象。

內置對象out 用於向客戶端輸出文本格式的數據。 實際上是JSPWriter對象,由pageContext對象的getOut方法獲取。
在使用out對象向客戶端輸出數據時,系統首先會將這些數據放到out對象的緩衝區中,直到緩衝區被裝滿或者整個JSP頁面結束,這時緩衝區的內容就會被寫到由Servlet引擎提供的緩衝區中,最後系統將Servlet引擎中的數據輸出到客戶端。 所以,通過out對象向客戶端輸出數據一般需要經過兩個緩衝區(JSPWriter對象提供的緩衝區和Servlet引擎提供的緩衝區)。 內置對象pageContext pageContext封裝了JSP頁面的運行信息。 由於pageContext對象可以獲得其他8個內置對象,因此,當JSP頁面調用普通的JAVA類時,可以只將pageContext作為參數傳入相應的方法。 request、response、session對象 對應PageContext類的getRequest、getResponse、getSession方法返回,與Servlet相應的對象完全一樣。 page對象 表示當前JSP頁面所對應的Servlet類的對象實例。 exception對象 只有page指令的isErrorPage屬性值為true時,才會創建。 config對象 從config對象中可以獲得web.xml文件中與當前JSP頁面相關的配置信息。 application對象 用於獲得和當前Web應用程式相關的信息。 由PageContext類的getServletContext方法返回。 可用於獲得全局的初始化參數、某個Web資源的絕對路徑等。

 

 

 

在請求任務特別多時,JSP也不能滿足需求,這時,出現了MVC(Model、View、Controller)模式,它把誰要展示,誰要處理請求,誰來操作資料庫,封裝對象等,一一分工,有條不紊。而經典的MVC模式就是strutsspring

比如,對於spring來說:

  • Spring MVC通過一套MVC註解,讓POJO變成處理請求的控制器,無需實現任何介面,同時,SpringMVC還支持REST風格的URL請求:註解驅動和REST風格的Spring MVC是Spring 3.0最出彩的功能之一。
  •  Spring MVC框架圍繞 DispatcherServlet這個核心展開,DispatcherServlet是SpringMVC的總導演,它負責截獲請求,並將其分派給相應的處理器處理。
  •  和大多數WEB MVC一樣,Spring MVC通過一個前端Servlet接收所有的請求,並將具體工作委托給其他組件進行處理,DispatcherServlet就是Spring MVC的前端Servlet。

對於struts來說:

 

  • Struts框架首先需要依賴於過濾器StrutsPrepareAndExecuteFilter來截獲Web程式的客戶端請求,然後再做進一步處理。

 

  • 在Struts2中通過直接使用Action封裝HTTP請求參數,Stuts2中提供了一個Action介面,在該介面中有個execute方法,如果要實現Action介面,就要實現execute方法。Struts2中還提供了一個ActionSupport類,這個類是很多Struts2框架中基礎介面的預設實現。Action類通過繼承該類,可以簡化很多開發。
  • 在JavaWeb程式中最常訪問的ServletAPI是HttpServletRequest、HttpSession、ServletContext,這三個類分別與JSP內置對象request、session、application對應。Struts2提供了一個ActionContext類,可以通過這個類來訪問相應的ServletAPI。
  • struts的大量工作都是由攔截器實現的,如:params攔截器可以將HTTP請求中的參數解析出來,並將參數值封裝在Action屬性中。Struts的攔截器機制採用的是嵌套的調用方式。

 

 

 

 

 

 

附:spring的運作原理:

 

要瞭解Spring MVC框架的工作機理,必須回答下麵三個問題:

 

問題一:DispatcherServlet框架如何截獲特定的HTTP請求,交由Spring MVC框架處理?

 

答:在web.xml中配置一個Servlet,並通過<servlet-mapping>指定其處理的url。像下麵這樣:

 

 

那麼,所有帶.html尾碼的http請求都會被DispatcherServlet截獲並處理。

 

問題二:位於Web層的Spring容器(WebApplicationContext)如何與位於業務層的Spring容器(ApplicationContext)相關聯,以使web層的bean可以調用業務層的bean?

 

答:下麵是一個web.xml:

 

 

ContextLoaderListener是一個ServletContextListener,它通過contextConfigLocation參數指定的配置文件(如本例的applicationContext.xml)啟動“業務層”的Spring容器。而由下麵引入的DispatcherServlet啟動Web層的spring容器。Web層的spring容器將作為業務層容器的子容器(即:Web層容器可以引用業務層容器的bean,而業務層容器不可以引用Web層容器的bean。)

 

問題三:如何初始化Spring MVC的各個組件,並將它們裝配到DispatcherServlet中?

 

答:當DispatcherServlet載入後,就會自動掃描上下文的bean,根據名稱或者類型匹配的機制查找自定義的組件,找不到時則使用DispatcherServlet.properties中使用的預設組件。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在上一篇文章中我們主要分析了ASP.NET Core預設依賴註入容器的存儲和解析,這一篇文章主要補充一下上一篇文章忽略的一些細節:有關服務回收的問題,即服務的生命周期問題。有關源碼可以去GitHub上找到。 這次的主角就是ServiceProvider一人,所有有關生命周期的源碼幾乎都集中在Serv ...
  • 相信很多人用過MessageBox.show(),是不是覺得這個消息框有點醜呢,反正我是覺得有點醜的,所以我自己重寫了一個。先不說,上兩幅圖對比先: 當然,也不是很好看,不過比原有的好多了。 不多說了,先上xmal代碼: 1 <Window x:Class="MESBox.MEGBox" 2 xml ...
  • 在Web Form 情況下,每一個 ASPX頁面既是一個文件,又是一個隊請求自包含的響應。而在 MVC 情況下,請求是由控制器類中的動作方法處理的,而且與硬碟上的文件沒有一對一的相互關係。 ASP.NET 平臺為了處理 MVC 的 URL,採用了路由系統,它主要有兩個功能: 考查一個輸入 URL(I ...
  • 從3月開始研究Openfire,其實就是要做一套IM系統,也正是這個原因才瞭解到Openfire。之前還真沒想過有這麼多的開源產品可以做IM,而且也沒想到XMPP這個協議竟然如何強大。看來還是標準為先,好的標準可以推動產業發展啊。 Openfire的搭建與簡單的demo之前寫過篇《技術筆記:XMPP ...
  • for 迴圈用於您預先知道腳本需要運行的次數的情況。 語法 參數: 初始值:主要是初始化一個變數值,用於設置一個計數器(但可以是任何在迴圈的開始被執行一次的代碼)。 條件:迴圈執行的限制條件。如果為 TRUE,則迴圈繼續。如果為 FALSE,則迴圈結束。 增量:主要用於遞增計數器(但可以是任何在迴圈 ...
  • Modal也即是模態窗,通俗的說就是彈窗。是一款bootstrap的js插件,使用效果也是非常好。 為什麼要使用modal就不必多說了,一個網站,在開發過程中你說你沒用過js彈窗我都不信!好的彈窗不僅僅給人以美感,也會讓我們開發效率提高,甚至心情也會舒暢! 我們看看在yii2中如何使用modal。 ...
  • SSH項目出現了 錯誤,仔細檢查後發現,是兩個不同的屬性映射了表中的同一個欄位造成的錯誤。 ...
  • Spring中的新名稱也太多了吧!IOC/DI/MVC/AOP/DAO/ORM... 對於剛剛接觸spring的我來說確實暈了頭!可是一但你完全掌握了一個概念,那麼它就會死心塌地的為你服務了。這可比女人忠誠多了。 在這裡我們來說侃下MVC吧!嗯!MVC設計模型和MVC框架之區別。 一組概念需要先理解 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...