From Gossip@caterpillar

JSP/Servlet: 使用 EL 存取屬性

 

 


在JSP網頁中,您可以設定屬性或JavaBean的作用範圍為page、request、session、 application等,之後就可以藉由屬性或JavaBean的參考名稱,並指定作用範圍來存取屬性或JavaBean,您可以使用 getAttribute()方法來取得屬性,這必須在Scriptlet中使用,而使用存取JavaBean的標籤<jsp: getProperty>可以避免使用Scriptlet,然而其限制是只能取得簡單的資料,而不能取得如陣列之內的元素資料。

可以使用EL指定屬性或JavaBean的參考名稱來取得屬性或JavaBean的值,先舉一個簡單的例子,首先撰寫一個只有Scriptlet的JSP網頁:

  • attribute.jsp
<% 
request.setAttribute("username", "Justin");
pageContext.forward("elTest.jsp");
%>

如果您連至上面的網頁,它會在request中設定"username"屬性,然後馬上forward至elTest.jsp,而elTest.jsp中只使用HTML標籤與EL,如下所示:
  • elTest.jsp
<html> 
<body>
Hello, <b>${ username }!!
</body>
</html>

所得到的結果網頁如下:
<html>
<body>
    Hello, <b>Justin!!
</body>
</html>
 

在這個例子中,您也大致看到Model 1的一個例子,您可以讓某些JSP網頁實現程式邏輯,而在某些JSP網頁中使用EL、JavaBean或是標籤等,實現程式邏輯與視圖分開的機制。

在EL中,可以指定屬性或JavaBean的作用範圍來存取它們,這必須使用到EL隱含物件,這將在之後介紹,如果不指定作用範圍的話,預設是page、 request、session、application的順序來尋找EL中所指定的屬性。

如果存入的屬性物件具有getXXX()之類的方法,則可以使用下面的方式來取得相對應名稱的屬性:
Hello, ${ user.name } !! Your id is ${ user.id }.
 

例如我們先撰寫一個UserBean類別:

  • UserBean.java
package onlyfun.caterpillar; 

public class UserBean {
private String name;
private String id;

public void setName(String name) {
this.name = name;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public String getId() {
return id;
}
}

使用下面這個JSP網頁來測試它:
  • elTest.jsp
<jsp:useBean id="userBean" 
class="onlyfun.caterpillar.UserBean"/>
<jsp:setProperty name="userBean"
property="name"
value="Justin"/>
<jsp:setProperty name="userBean"
property="Id"
value="B83503124"/>

Hello, ${ userBean.name }!! Your id is ${ userBean.ID }.

當然,就上面這個例子而言,也可以簡單的使用<jsp:getProperty>來取得JavaBean的屬性值,然而如果JavaBean 返回的是一個陣列,該如何取得陣列當中的某個元素值呢?使用EL的話,您可以藉由[]運算子來指定所要存取的對象,例如根據索引值來取得返回陣列的某個元 素,為了測試,先簡單的撰寫下面這個測試用的類別:
  • ArrayTestBean.java
package onlyfun.caterpillar; 

public class ArrayTestBean {
public String[] getTestArray() {
String[] test = {"Justin", "momor", "Beckyday"};
return test;
}
}

可以藉由下面這個JSP網頁來進行測試:
  • elTest.jsp
<jsp:useBean id="arrayTestBean"
class="onlyfun.caterpillar.ArrayTestBean"/>

test[0] = ${ arrayTestBean.testArray[0] }
test[1] = ${ arrayTestBean.testArray[1] }
test[2] = ${ arrayTestBean.testArray[2] }

最後傳回的結果是:
test[0] = Justin
test[1] = momor
test[2] = Beckyday