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(這裏有兩種訪問方式,一種是使用[]來進行訪問,另外一種是使用"."來進行訪問,兩種訪問效果是一樣的。)

  1. ${param["name"] } myname   
  2. ${param.name} myname   
  3. ${param["alies"] } now.net.cn   
  4. ${param.alies} now.net.cn  

----------------------------

訪問應用程序數據需要進行以下幾個步驟:

1.編寫public類的static public 方法,只有static public的方法才能被標記表達試訪問。

----------------------------

JSP2.0中定義和使用函數

表達式語言允許你定義可在表達式中調用的函數。函數必須作爲public類中的public static方法編寫。同時要將文件映射到TLD標誌庫文件中。

爲了說明函數的使用,我們舉一個簡單的例子,把兩個數相加。首先要編寫求兩數之和的Java方法代碼,如代碼示例所示,這裏定義了一個靜態方法,它接收兩個字符串參數,把它們解析成整數並返回它們的和。

示例文件:Compute.java

  1. package jsp2.examples.el;   
  2. import java.util.*;   
  3. public class Compute {   
  4. public static int add(String x, String y) {   
  5. int a = 0;   
  6. int b = 0;   
  7. try {   
  8. a = Integer.parseInt(x);   
  9. b = Integer.parseInt(y);   
  10. }catch(Exception e) {}   
  11. return a + b;   
  12. }   
  13. }  

用javac把這段代碼編譯成功後,下一步就要把函數的簽名映射到標籤庫。

----------------------------

2.將方法映射到TLD表中

----------------------------

配置標記庫描述文件 函數描述符

  1. < function>   
  2. < description>add x and y< /description>   
  3. < name>add< /name>   
  4. < function-class>jsp2.examples.el.Compute   
  5. < /function-class>   
  6. < function-signature>int   
  7. add(java.lang.String,java.lang.String)   
  8. < /function-signature>   
  9. < /function>  

現在我們就可以編寫一個JSP頁面來使用這個函數。代碼示例5是包含兩個字段的一個表單,用戶輸入兩個數字並按下“求和”按鈕,就會調用上面的函數並把兩個數相加,結果在同一個頁面中顯示出來。

----------------------------

3.在JSP頁面中調用要引用的Taglib標記,然後就可以在jsp頁面中訪問了。

----------------------------

代碼示例5: math.jsp

  1. < %@ taglib prefix="my"   
  2. uri="http://jakarta.apache.org/tomcat/jsp2-example-taglib %>   
  3. < HEAD>   
  4. < TITLE>Functions< /TITLE>   
  5. < /HEAD>   
  6. < BODY>   
  7. < H3>Add Numbers< /H3>   
  8. < P>   
  9. < FORM action="math.jsp" method="GET">   
  10. X = < input type="text" name="x" value="${param["x"]}">   
  11. < BR>   
  12. Y = < input type="text" name="y" value="${param["y"]}">   
  13. < input type="submit" value="Add Numbers">   
  14. < /FORM>   
  15. < P>   
  16. The sum is: ${my:add(param["x"],param["y"])}   
  17. < /BODY>   
  18. < /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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章