web 前後臺數據互動的方式
做web開發,很重要的一個環節就是前後臺的資料的互動,資料從頁面提交到contoller層,資料從controler層傳送到jsp頁面來顯示。這2個過程中資料具體是如何來傳送的,是本節講解的內容。
首先說一下資料如何從後臺的contorller層傳送到頁面jsp上。
如上圖,在使用struts的情況下上圖就是我們在jsp頁面上能獲取到的物件,我們想將後臺資料傳到jsp必須將這些資料放到這些物件中才行。
那麼我們就有2種方法了,一種是放到request物件裡面作為一個屬性,例如:request.setAtribute(“別名”,物件名);
還有一種方法 就是存放到valueStack裡面去。 我們只需要在外面的action裡面設定一個屬性值,寫上set和get方法,在我們進行業務邏輯處理的時候為該屬性值賦值,那麼stutrts就會自動將我們這個action中的屬性值放到valueStack裡面去,並最終傳送到jsp頁面上。
到了jsp後,我們如何顯示呢?
以前有通過java程式碼來顯示的,但那樣不好,jsp 2.0以後就不允許直接在jsp頁面上寫java 程式碼了,取而代之的是EL,也就是表示式語言。
下面具體聊聊jsp中用於顯示的EL。
jsp 2.0 EL:
jsp 2.0的EL 規定,可以在jsp頁面上通過${屬性名}這樣的語法來訪問傳送到頁面上的物件的屬性值。
並且提供了內建的一些物件方便使用者訪問不同範圍內的屬性值:
•如果在不同的屬性範圍內,儲存了同一個屬性的話,按照page-request-session-application進行優先順序輸出級別最高的那個
例如,url 後面接的引數,在頁面上可以通過${param.*}獲取到。
在後臺通過request.setAttribute("all",all);設定的值,在頁面上可以通過${all[0]}得到(假設all是一個list型別),如果是map則使用
,如果只是一個物件,那麼可以使用
${all.屬性}.
內建的11個隱含物件:
為方便的獲得WEB應用程式的相關資料,EL表示式語言定義了一些隱含物件。隱含物件共有11個物件,(JSP中具有9個隱含物件,EL比JSP中具有更多的隱含物件,這樣EL比JSP更方便的獲取資料) 使用這些物件可以很方便的訪問Web 程式資料。
隱含物件包括Session(獲得當前web程式的Session值),cookie(獲得WEB程式的Cookie值),header,headerValues(獲得使用者的Http資料訪問頭部資訊),Param和ParamValues(獲得使用者提交資料引數)等。
使用${隱含物件名稱["元素"]} 就可以獲得這個值了,例如${header("host")} 可以顯示http頭部中host的值,${param("username")},可以獲得顯示使用者表單提交的使用者. 使用${empty(param("username")} 可以判斷使用者提交表單是否為空等。(這樣比jsp1.2中使用request.getParamter("username") 要簡化和方便很多了)
----------------------------
隱含物件及隱含物件訪問例項
EL 表示式定義了11個隱含物件,使用這11個物件可以很方便的讀取到session,cookie,HttpHeader,使用者提交表單(param)等
隱含物件 內容
applicationScope 應用程式範圍內的scoped變數組成的集合
cookie 所有cookie組成的集合
header HTTP請求頭部,字串
headerValues HTTP請求頭部,字串集合
initParam 全部應用程式引數名組成的集合
pageContext 當前頁面的javax.servlet.jsp.PageContext物件
pageScope 頁面範圍內所有物件的集合
param 所有請求引數字串組成的集合
paramValues 所有作為字串集合的請求引數
requestScope 所有請求範圍的物件的集合
sessionScope 所有會話範圍的物件的集合
下面是獲取HTTP訪問頭部資料和使用者提交資料的示例
EL表示式 運算結果
${header["host"]} 這裡得到HTTP連線頭部的host值
${header["accept"]} 這裡獲得HTTP頭部的accept值
${header["user-agent"]} 這裡獲得HTTP頭部的user-agent值
----------------------------
訪問應用程式資料
除了可以方便的訪問內建的隱含物件外,EL還可以方便的到應用程式資料,訪問應用程式資料使用兩種方式 . (點號運算子)訪問物件的屬性,也可以使用[] 來訪問陣列元素(實際上EL中訪問隱含物件資料也是使用這兩種方式的)
表示式${data}表示名為data的scoped變數。可以使用點號(.)或方括號([])運算子從集合中檢索屬性值:(兩種資料訪問方式演示)
點號運算子用於訪問命名的屬性,比如表示式${customer.name}表示scoped變數customer的name屬性;
方括號運算子可用於檢索命名的屬性,比如在${customer[“name”]}中。也可以通過${customers[0]}的形式來訪問集合customers中的第一項。
EL表示式語言同時還統一了對點號和方括號運算子的處理,因此${customer.name}與${ customer[“name”]}是等價的。
----------------------------
以下可以讀取使用者提交的資訊,假設使用者提交資訊為 ?name=myname&alies=now.net.cn(這裡有兩種訪問方式,一種是使用[]來進行訪問,另外一種是使用"."來進行訪問,兩種訪問效果是一樣的。)
- ${param["name"] } myname
- ${param.name} myname
- ${param["alies"] } now.net.cn
- ${param.alies} now.net.cn
----------------------------
訪問應用程式資料需要進行以下幾個步驟:
1.編寫public類的static public 方法,只有static public的方法才能被標記表達試訪問。
----------------------------
JSP2.0中定義和使用函式
表示式語言允許你定義可在表示式中呼叫的函式。函式必須作為public類中的public static方法編寫。同時要將檔案對映到TLD標誌庫檔案中。
為了說明函式的使用,我們舉一個簡單的例子,把兩個數相加。首先要編寫求兩數之和的Java方法程式碼,如程式碼示例所示,這裡定義了一個靜態方法,它接收兩個字串引數,把它們解析成整數並返回它們的和。
示例檔案:Compute.java
- package jsp2.examples.el;
- import java.util.*;
- publicclass Compute {
- publicstaticint add(String x, String y) {
- int a = 0;
- int b = 0;
- try {
- a = Integer.parseInt(x);
- b = Integer.parseInt(y);
- }catch(Exception e) {}
- return a + b;
- }
- }
用javac把這段程式碼編譯成功後,下一步就要把函式的簽名對映到標籤庫。
----------------------------
2.將方法對映到TLD表中
----------------------------
配置標記庫描述檔案 函式描述符
- <function>
- <description>add x and y< /description>
- <name>add< /name>
- <function-class>jsp2.examples.el.Compute
- < /function-class>
- <function-signature>int
- add(java.lang.String,java.lang.String)
- < /function-signature>
- < /function>
現在我們就可以編寫一個JSP頁面來使用這個函式。程式碼示例5是包含兩個欄位的一個表單,使用者輸入兩個數字並按下“求和”按鈕,就會呼叫上面的函式並把兩個數相加,結果在同一個頁面中顯示出來。
----------------------------
3.在JSP頁面中呼叫要引用的Taglib標記,然後就可以在jsp頁面中訪問了。
----------------------------
程式碼示例5: math.jsp
- < %@ taglib prefix="my"
- uri="http://jakarta.apache.org/tomcat/jsp2-example-taglib %>
- <HEAD>
- <TITLE>Functions< /TITLE>
- < /HEAD>
- <BODY>
- <H3>Add Numbers< /H3>
- <P>
- <FORMaction="math.jsp"method="GET">
- X = <inputtype="text"name="x"value="${param["x"]}">
- <BR>
- Y = <inputtype="text"name="y"value="${param["y"]}">
- <inputtype="submit"value="Add Numbers">
- < /FORM>
- <P>
- The sum is: ${my:add(param["x"],param["y"])}
- < /BODY>
- < /HTML>
上面 說的都是jsp EL,其實它還可以和JSTL 標籤結合起來使用, 也就是說 放在JSTL的value屬性中來使用。
大家需要注意的是,要把Jsp EL和ONGL的表示式區別開來,這2者很類似,但是在一般的jsp頁面中使用的其實都是jsp 的
EL。
下面說說,頁面資料如何提交後臺,頁面的form裡面的資料都是通過request物件 傳送到後臺的,在後臺可以通過 request.getPArameter("a");來得到前臺頁面傳入的值。 在使用struts的情況下,struts 還會將這些放入到request的值取出來,自動對映到action的 同名屬性上去,所以 ,我們也可以直接通過在action裡面設定和頁面form裡面的域同名的屬性來直接使用struts為我們自動填充進去的頁面提交值了,這樣比通過
request.getPArameter("a");要方便很多。
${all[‘id’]}
轉自:http://blog.csdn.net/walkingmanc/article/details/7601970