1. 程式人生 > >J2EE與中介軟體 學習筆記3 JSP MVC

J2EE與中介軟體 學習筆記3 JSP MVC

本文主要參考自W3Cschool的JSP教程和PPT,以及來自我與一位很強的學長的聊天記錄。

JSP

這部分我是很早就看別的同學用過但是自己一直沒有用過,現在終於開始接觸了。

簡介

什麼是Java Server Pages?

JSP全稱Java Server Pages,是一種動態網頁開發技術。它使用JSP標籤在HTML網頁中插入Java程式碼。標籤通常以<%開頭以%>結束。

JSP是一種Java servlet,主要用於實現Java web應用程式的使用者介面部分。網頁開發者們通過結合HTML程式碼、XHTML程式碼、XML元素以及嵌入JSP操作和命令來編寫JSP。

JSP通過網頁表單獲取使用者輸入資料、訪問資料庫及其他資料來源,然後動態地建立網頁。

JSP標籤有多種功能,比如訪問資料庫、記錄使用者選擇資訊、訪問JavaBeans元件等,還可以在不同的網頁中傳遞控制資訊和共享資訊。

按照我的理解,JSP就是一個能讓你寫動態頁面更方便的東西。

JSP結構

結構

Markdown

JSP處理

  • 就像其他普通的網頁一樣,您的瀏覽器傳送一個HTTP請求給伺服器。
  • Web伺服器識別出這是一個對JSP網頁的請求,並且將該請求傳遞給JSP引擎。通過使用URL或者.jsp檔案來完成。
  • JSP引擎從磁碟中載入JSP檔案,然後將它們轉化為servlet。這種轉化只是簡單地將所有模板文字改用println()語句,並且將所有的JSP元素轉化成Java程式碼。
  • JSP引擎將servlet編譯成可執行類,並且將原始請求傳遞給servlet引擎。
  • Web伺服器的某元件將會呼叫servlet引擎,然後載入並執行servlet類。在執行過程中,servlet產生HTML格式的輸出並將其內嵌於HTTP response中上交給Web伺服器。
  • Web伺服器以靜態HTML網頁的形式將HTTP response返回到您的瀏覽器中。
  • 最終,Web瀏覽器處理HTTP response中動態產生的HTML網頁,就好像在處理靜態網頁一樣。

Markdown

我的理解就是,應該可以不用裸寫Servlet了。目前我還沒有寫過JSP,等實驗之後才知道對不對。

JSP生命週期

  • 編譯階段:

    servlet容器編譯servlet原始檔,生成servlet類

  • 初始化階段:

    載入與JSP對應的servlet類,建立其例項,並呼叫它的初始化方法

  • 執行階段:

    呼叫與JSP對應的servlet例項的服務方法

  • 銷燬階段:

    呼叫與JSP對應的servlet例項的銷燬方法,然後銷燬servlet例項

Markdown

JSP的HelloWorld

<html>
<head>
<title>Hello World</title>
</head>
<body>
    Hello World!
    <br />
    <%
        out.println("Your IP address is " + request.getRemoteAddr());
    %>
</body>
</html>

看了這個示例之後我其實有一點沒看明白的地方,就是為什麼會有out和request兩個變數沒有宣告就可以用了?這說明jsp肯定有一些內建的物件,於是我搜了一下,總共有9個內建物件。隨便貼個連結給大家看一下。

簡單語法

指令碼程式

<% 程式碼片段 %>

宣告

<%! declaration; [ declaration; ]+ ... %>

<%! int i = 0; %> 
<%! int a, b, c; %> 
<%! Circle a = new Circle(2.0); %> 

表示式

<%= 表示式 %>

<html> 
<head>
<title>A Comment Test</title>
</head> 
<body>
<p>   
  Today's date: <%= (new java.util.Date()).toLocaleString()%>
</p>
</body> 
</html> 

其實感覺會了語法就可以開始寫了…但是事情沒有這麼簡單,4-1的作業需要必須要用MVC,所以下面就開始MVC的學習。

MVC

Markdown

關於MVC與分層的區別以及引申開來的內容

其實沒有搞明白MVC,於是找了一位現在在做架構師的學長問了一波問題……將我們的聊天記錄整理了一下。下面用A來表示我,B表示學長。

A: X哥(學長要求匿名),我想問你一個關於MVC的問題。

Markdown

我記得以前軟工課講過的MVC,好像不是這個樣子啊。

B: 奧,我的理解是MVC和分層的層面不一樣,所以沒有可比性。 軟工二上比較MVC和分層的意義不大。一般提到 MV* 就是指展示層的技術。

A: 感覺MVC是不是比分層要微觀一些。

B: 對,MVC我只知道兩個地方可以用,一個是客戶端或者前端,一個是Java系的web框架。前端自己有時候也把架構叫做mvc,又發展出mvp,mvvm啥的,和後臺的mvc是並存的。

A: 後臺為什麼會有v層啊

B: 你之前是怎麼做網頁的

A: 我之前都是寫後端的,不寫網頁。

B: 那你是把資料轉成json傳過去?

A: 嗯是的。

B: 比如jsp吧,他是執行時後臺輸出好一份html程式碼然後返還回去。所以jsp定義的是html的生成規則,輸出的是頁面顯示的內容,所以叫view。model沒有方法。javaWeb版的MVC的 model == VO。

A: 哦那也就是說,C 只能是業務邏輯了?

B: 也不是,c沒有業務邏輯,他是轉發給下一層,但是下一層不是model,已經和mvc沒關係了。

B: 為了簡化先假設前端非常簡單,只是一些靜態html,沒有js。

Markdown

對於第3步,比如你的頁面要顯示你的使用者名稱和頭像

UserVo userVo = new UserVo( username, avatarUrl ); //UserVo就是model

一般都是建立個新物件。

對於第4步,這裡實際上是controller調view,view就像是一個能生成html的子方法一樣。

A: 比如view 有個方法可以傳一個引數UserVo?

B: 對。

B: 第六步嘛,一般有各種方式,可能框架幫你做了,可能要你手動做。像springMVC自動化程度比較高,寫出來確實是

UserVo function() {
   return new UserVo();
}

但不是返回給了view,而是框架幫你做了

String html = view(userVo);
return html;

B: 奧還有一點,後臺web框架的MVC和 前端/客戶端的MVC不是一回事,比如你的前端隊友說我們不用mvc了,用mvvm吧,你要知道這和你關係不大。

A: 那我們之前那種傳json的方法是不是就不屬於MVC啊

B: 是

A: 那那個屬於什麼啊

B: 可以叫API後臺吧

接下來是PPT中的內容

Web Application Control Flow

  1. Client makes a request (Web browser).

  2. Servlet gets the client’s request.

  3. Servlet determines which program elements (JavaBeans, EJBs or otherobjects) are required to carry out the specified request.

  4. JavaBeans or EJBs perform the business logic operations for theservlet, and encapsulate the results.

  5. Servlet selects a presentation template (JSP) for delivering thecontent back to the client.
  6. The JSP generates a specific response by accessing the resultantcontent available through the JavaBeans.

MVC中JSP的注意事項

MVC-JSP頁面不應該建立物件

  • 應該由servlet,而非JSP頁面,建立所有的資料物件。

  • 因此,為了保證JSP頁面不會建立物件,我們應該使用

    <jsp:useBean ... type="package.Class" />

而不是

<jsp:useBean ... class="package.Class" />

JSP頁面也不應該修改已有的物件

因此,應該只使用jsp:getProperty,不使用jsp:setProperty