要在 JSP 裡插入固定頁面有兩種方式
1. JSP 指令
<%@ include file=”Header.jsp”%>
2. JSP 標準動作
<jsp:include page=”Header.jsp” />
很多時候這兩種方式的結果是完全相同的,但是內部 Container 的處理方式是有點不一樣的。
「指令」處理 include 頁面的時機是第一次被讀取到的時候(Translation Time)
「標準動作」處理 include 頁面的時機是每次被讀取到的時候(Run Time)
此外,被 include 之 JSP 檔案中必須注意不可有 <html> 或 <body>,否則會造成母頁面重覆出現 <html> 及 <body> 導致網頁讀取不正確。
2011年10月30日 星期日
2011年10月24日 星期一
EL 隱含物件
對應各種作用域屬性之 Map
對應於屬性請球參數之 Map
對應於請求標頭 Map
cookie 請求
Context 之初始參數 Map
指向 pageContext 之實際參考
pageScope
requestScope
sessionScope
applicationScope
對應於屬性請球參數之 Map
param
paramValues (參數有多個值時可利用陣列方式存取)
${paramValues.food[0]}
${paramValues.food[1]}
${paramValues.food[0]}
${paramValues.food[1]}
對應於請求標頭 Map
header
headerValues (參數有多個值時可利用陣列方式存取)
cookie 請求
cookie
Context 之初始參數 Map
initParam
指向 pageContext 之實際參考
pageContext
2011年10月23日 星期日
當 Form 之 action 指向 JSP 而不是 Servlet
<html>
<body>
<form action="Test.jsp">
name: <input type="text" name="userName">
ID#: <input type="text" name="userID">
<input type="submit">
</form>
</body>
</html>
Test.jsp 以標準動作接收之方式為:
<jsp:useBean name="person" type="foo.Person" class="foo.Employee">
<jsp:setProperty name="person" property="name" param="userName" />
</jsp:useBean>
此外,若 html 指定之 name 與 bean 之屬性同名,則可以不用指定 param 參數
<jsp:useBean name="person" type="foo.Person" class="foo.Employee">
<jsp:setProperty name="person" property="name" />
</jsp:useBean>
若所有的特性皆與 bean 之屬性相同,則可用 * 代替
<jsp:useBean name="person" type="foo.Person" class="foo.Employee">
<jsp:setProperty name="person" property="*"/>
</jsp:useBean>
若要展示的屬性不是基本資料型別或 String 時,如 Pearson 中的 Dog 屬性之 name 屬性,假設
不使用標準動作 : (可正常運作)
<%= ((foo.Person) request.getAttribute("person")).getDog().getName%>
使用標準動作 : (會印出dog類別之toString()回傳值)
<jsp:useBean id="person" class="foo.Person" scope="request" />
Dog name is : <jsp:getProperty name="person" property="dog" />
但若要符合不使用 scripting 原則又要能正確印出結果,可利用 EL 完成 :
Dog name is : ${person.dog.name}
若要展示的屬性不是基本資料型別或 String 時,如 Pearson 中的 Dog 屬性之 name 屬性,假設
Person class 具有 String 型態之 "name" attribute
Person class 具有 Dog 型態之 "dog" attribute
Dog class 具有 String 型態之 "name" attribute
不使用標準動作 : (可正常運作)
<%= ((foo.Person) request.getAttribute("person")).getDog().getName%>
使用標準動作 : (會印出dog類別之toString()回傳值)
<jsp:useBean id="person" class="foo.Person" scope="request" />
Dog name is : <jsp:getProperty name="person" property="dog" />
但若要符合不使用 scripting 原則又要能正確印出結果,可利用 EL 完成 :
Dog name is : ${person.dog.name}
2011年10月18日 星期二
EL & Scripting 評算整理表格
EL 表示式評算
DD組態 <el-ignored> |
page指令 isELIgnored |
評算 | 忽略 |
未指定 | 未指定 | ◎ | |
false | 未指定 | ◎ | |
true | 未指定 | ◎ | |
false | false | ◎ | |
false | true | ◎ | |
true | false | ◎ |
Scripting 元素評算
DD組態 <scripting-invalid> |
評算 | 錯誤 |
未指定 | ◎ | |
true | ◎ | |
false | ◎ |
JSP 元素種類
1. Scriptlet : <% .... %>
<% 與 %> 之間可以插入一般的 Java 程式碼
例如
<%
int a = 100; // 區域變數
for (int i = 0; i < a; i++) {
.........
}
%>
2. Directive : <%@ ... %>
共分為三種
● <%@ page ....%>
例如
<%@ page import = "foo.*" %>
● <%@ taglib ....%>
定義 JSP 使用的標籤函式庫
例如
<%@ taglib tagdir="/WEB-INF/rags/cool" prefix="cool" %>
● <%@ include ....%>
● <%@ taglib ....%>
定義 JSP 使用的標籤函式庫
例如
<%@ taglib tagdir="/WEB-INF/rags/cool" prefix="cool" %>
● <%@ include ....%>
可在 JSP 頁面固定載入一段文字或程式碼,建立一個可重複使用的區塊
例如
<%@ include file="xxxxxx.html" %>
例如
<%@ include file="xxxxxx.html" %>
3. Expression : <%= ... %>
一般運算式,結尾不加分號
例如
<%=Math.random()%>
<%=count%>
<%= 27 %>
<%= "27"%>
與 scriptlet 中宣告的區域變數不同。
例如
<%!
int a = 0; //類別變數
%>
<!%
int test(int a) {
int b = a + 1;
return b;
}
%>
<jsp:include page="test.jsp" />
<jsp:useBean id="person" class="foo.Employee" scope="request"/>
<jsp:getProperty name="person" property="name">
<jsp:setProperty name="person" property="name" value="Fred">
● Others
<c:set var="rate" value="32" />
4. Declaration : <%! ... %>
宣告 JSP 轉換出來的 Servlet 類別中的成員,成員即包括變數及方法。與 scriptlet 中宣告的區域變數不同。
例如
<%!
int a = 0; //類別變數
%>
<!%
int test(int a) {
int b = a + 1;
return b;
}
%>
5. Action : <xxx: ... >
● Standard Action<jsp:include page="test.jsp" />
<jsp:useBean id="person" class="foo.Employee" scope="request"/>
<jsp:getProperty name="person" property="name">
<jsp:setProperty name="person" property="name" value="Fred">
● Others
<c:set var="rate" value="32" />
JSP : 利用 PageContext 存取其他作用域屬性
類別圖
JspContext
|
getAttribute(String name) getAttribute(String name, int scope) getAttributeNamesInScope(int scope) findAttribute(String name) //更多方法 |
PageContext
|
APPLICATION_SCOPE PAGE_SCOPE REQUEST_SCOPE SESSION_SCOPE //更多欄位 |
getRequest() getServletConfig() getServletContext() getSession() //更多方法 |
屬性存取範例
● Page 作用域
<% pageContext.setAttribute("foo", one); %>
<% pageContext.getAttribute("foo"); %>
● Session 作用域
<% pageContext.setAttribute("foo", one, PageContext.SESSION_SCOPE); %>
<% pageContext.getAttribute("foo", PageContext.SESSION_SCOPE); %>
(等同於<% session.getAttribute("foo"); %>)
(等同於<% session.getAttribute("foo"); %>)
<% pageContext.setAttribute("foo", one, PageContext.APPLICATION_SCOPE); %>
<% pageContext.getAttribute("foo", PageContext.APPLICATION_SCOPE); %>
(等同於<% application.getAttribute("foo"); %>)
搜尋順序為 Request → Session → Application。先找到先贏。
(等同於<% application.getAttribute("foo"); %>)
不知道屬性所屬作用域,可利用 pageContext
<% pageContext.findAttribute("foo") %>搜尋順序為 Request → Session → Application。先找到先贏。
2011年10月17日 星期一
JSP 註解及作用域
1. 註解
<!-- HTML 註解 -->
<%-- JSP 註解 --%>
HTML 註解可在網頁原始碼中看到,JSP 註解不行
2. 作用域
ApplicationgetServletContext().setAttribute("value", value); //Servlet
application.setAttribute("value", value); //JSP
Request
request.setAttribute("value", value); //Servlet & JSP 相同
Session
request.getSission().setAttribute("value", value); //Servlet
session.setAttribute("value", value); //JSP
Page (Servlet 無此作用域)
pageContext.setAttribute("value", value); //JSP
2011年10月13日 星期四
Session 相關之 Listener
有需要就實作下列 Listener 並針對對應 Listener 之 method 進行實作,當事件發生時容器就會自動找到對應的 method 執行
1. HttpSessionListener (Interface)
● 使用時機
追蹤目前線上正在活動的 session。
● 實作方法
sessionCreated(HttpSessionEvent se)
sessionDestroyed(HttpSessionEvent se)
2. HttpSessionActivationListener (Interface)
● 使用時機
追蹤 session 何時由一個 VM 轉換到另一個 VM。
● 實作方法
sessionDidActivate(HttpSessionEvent se)
sessionWillPassivate(HttpSessionEvent se)
這裡必須注意的是這兩個方法接受的 event 型態為 HttpSessionEvent
而不是 HttpSessionActivationEvent(沒有這種 event)
3. HttpSessionBindingListener (Interface)
● 使用時機
追蹤是否有 attribute 被繫結到 session 中。
● 實作方法
valueBound(HttpSessionBindingEvent event)
valueUnbound(HttpSessionBindingEvent event)
4. HttpSessionAttributeListener (Interface)
● 使用時機
追蹤 session 中何時有 attribute 被新增、移除及置換。
● 實作方法
attributeAdded(HttpSessionBindingEvent se)
attributeRemoved(HttpSessionBindingEvent se)
attributeReplaced(HttpSessionBindingEvent se)
與 HttpSessionActivationListener 類似
這裡必須注意的是這兩個方法接受的 event 型態為 HttpSessionBindingEvent
而不是 HttpSessionAttributeEvent(沒有這種 event)
1. HttpSessionListener (Interface)
● 使用時機
追蹤目前線上正在活動的 session。
● 實作方法
sessionCreated(HttpSessionEvent se)
sessionDestroyed(HttpSessionEvent se)
2. HttpSessionActivationListener (Interface)
● 使用時機
追蹤 session 何時由一個 VM 轉換到另一個 VM。
● 實作方法
sessionDidActivate(HttpSessionEvent se)
sessionWillPassivate(HttpSessionEvent se)
這裡必須注意的是這兩個方法接受的 event 型態為 HttpSessionEvent
而不是 HttpSessionActivationEvent(沒有這種 event)
3. HttpSessionBindingListener (Interface)
● 使用時機
追蹤是否有 attribute 被繫結到 session 中。
● 實作方法
valueBound(HttpSessionBindingEvent event)
valueUnbound(HttpSessionBindingEvent event)
4. HttpSessionAttributeListener (Interface)
● 使用時機
追蹤 session 中何時有 attribute 被新增、移除及置換。
● 實作方法
attributeAdded(HttpSessionBindingEvent se)
attributeRemoved(HttpSessionBindingEvent se)
attributeReplaced(HttpSessionBindingEvent se)
與 HttpSessionActivationListener 類似
這裡必須注意的是這兩個方法接受的 event 型態為 HttpSessionBindingEvent
而不是 HttpSessionAttributeEvent(沒有這種 event)
2011年10月12日 星期三
Session & Cookie 控制
Session 建立 :
HttpSession session = request.getSession();
//回傳已存在的 session,不存在時回傳 null
HttpSession session = request.getSession(false);
//與 session.getSession() 相同
//若存在就回傳已存在的 session,若不存在時就建立一個新的
//若存在就回傳已存在的 session,若不存在時就建立一個新的
HttpSession session = request.getSession(true);
Session 是否為新建立 :
session.isNew();
Session 失效 :
1.web.xml中設定(單位為分鐘)
<session-config>
<session-timeout>30</session-timeout>
</session-config>
2.呼叫 invalidate() 方法
session.invalidate();
3.程式中設定(單位為秒)
session.setMaxInactiveInterval(20*60);
Cookie 控制 :
1. 建立新的 Cookie
Cookie cookie = new Cookie("userName", name);
2. 設定 Cookie 存活時間
cookie.setMaxAge(30*60);
3. 在 response 回傳 Cookie 給 client
response.addCookie(cookie);
4. 取得 client 之 Cookie
Cookie[] cookieArray = request.getCookies();
if (cookieArray != null) {
for (int i = 0; i < cookieArray.length; i++) {
Cookie cookieEl = cookieArray[i];
if (cookieEl.getName().equals("userName")) {
String userName = cookieEl.getValue();
out.print("Hello, " + userName);
break;
}
}
}
2011年10月10日 星期一
近期想做的事
這幾天深深覺得自己很廢,意志消沉,覺得自己一事無成
苦思振作,讓我想起三個傻瓜裡面的一句話
「追求卓越,則成功就會不期然降臨」
勉勵自己近期要完成以下的事
● 考取證照 (SCWCD)
再不準備就沒時間準備了,真的要好好加油
考完試,我想我心裡的壓力就會自然減輕了
● 買車
雖然上班都騎車,返鄉都搭台鐵或客運
沒有那種非買車不可的理由
因為這幾年南北奔波,突然覺得
1. 大包小包趕火車
2. 如果再遇上下雨,大包小包還得騎車到火車站
是一件很累的事,因此心裡不禁想.......
若是我有車就好了....
趕快存錢吧! 希望我能買台自己喜歡的車!
(老闆送了一台中古車,這樣應該算完成......吧)
● 把買來的英文單字書背完
我一直覺得,可以和外國人溝通無礙的人超屌
因此我希望我也能成為這樣的人
我會的單字數量很少,就從背單字開始吧!
● 全破太空戰士6
從我17歲時就在說我要全破太空戰士6,沒破就不玩之後的幾代
結果我一直都沒破,所以之後的幾代也都沒有玩
真是莫名其妙的堅持,但事實就是如此
這個堅持把我困住了,我要突破這個困境
朝 7, 8, 9 代邁進
苦思振作,讓我想起三個傻瓜裡面的一句話
「追求卓越,則成功就會不期然降臨」
勉勵自己近期要完成以下的事
● 考取證照 (SCWCD)
再不準備就沒時間準備了,真的要好好加油
考完試,我想我心裡的壓力就會自然減輕了
● 買車
雖然上班都騎車,返鄉都搭台鐵或客運
沒有那種非買車不可的理由
因為這幾年南北奔波,突然覺得
1. 大包小包趕火車
2. 如果再遇上下雨,大包小包還得騎車到火車站
是一件很累的事,因此心裡不禁想.......
若是我有車就好了....
趕快存錢吧! 希望我能買台自己喜歡的車!
(老闆送了一台中古車,這樣應該算完成......吧)
● 把買來的英文單字書背完
我一直覺得,可以和外國人溝通無礙的人超屌
因此我希望我也能成為這樣的人
我會的單字數量很少,就從背單字開始吧!
● 全破太空戰士6
從我17歲時就在說我要全破太空戰士6,沒破就不玩之後的幾代
結果我一直都沒破,所以之後的幾代也都沒有玩
真是莫名其妙的堅持,但事實就是如此
這個堅持把我困住了,我要突破這個困境
朝 7, 8, 9 代邁進
2011年10月8日 星期六
部落格開張
因為我的記性真的不太好,因此開張的目的,就是替自己多個備忘錄,把學過的東西都記錄下來,以免日後需要用到時有個地方可以找到資料,回復一下記憶。
另外,也希望部落格可以幫助提醒我,趕快動起來去完成我的夢想。
另外,也希望部落格可以幫助提醒我,趕快動起來去完成我的夢想。
訂閱:
文章 (Atom)