posted @ 2007-05-13 20:00 ZelluX 閱讀(149) | 評論 (0) | 編輯 收藏
1. Filter 簡介
這方面的內容以前看的幾本書里都找不到,想到了Sun J2EE的Tutorial,果然里面有比較詳細的解釋。
Filter是一個傳輸請求或者響應的報頭和內容的對象,通常的作用是:
a) 根據不同情況處理請求。
b) 阻止請求-響應的過遠傳送。(Block the request-and-response pair from passing any further.)
c) 通過自定義新的請求版本,修改請求報頭和數據。
d) 通過自定義新的響應版本,修改響應報頭和數據。
e) 和外部資源交互。
2. Filter 編程
filtering API由javax.servlet包中的Filter, FilterChain和FilterConfig接口定義。
其中最重要的方法是doFilter。它可以用來:
a) 檢查請求報頭。
b) 自定義請求對象。
c) 自定義響應對象。
d) 調用過濾鏈(filter chain)中的下一個實體(entity)。如果當前過濾器已經是鏈中最后一個過濾器了,下一個實體就是鏈尾的資源;否則它就是在WAR中設置的下一個過濾器。當然也可以在此時通過不調用下一個實體來中斷請求、
e) 在響應報頭調用下一個過濾器后檢查。
f) 拋出反應處理錯誤的異常。
3. 一個 Duke's Bookstore 的例子
HitCounterFilter在servlet被訪問時計數。
public final class HitCounterFilter implements Filter {
private FilterConfig filterConfig = null;
public void init(FilterConfig filterConfig)
throws ServletException {
this.filterConfig = filterConfig;
}
public void destroy() {
this.filterConfig = null;
}
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (filterConfig == null)
return;
StringWriter sw = new StringWriter();
PrintWriter writer = new PrintWriter(sw);
Counter counter = (Counter)filterConfig.
getServletContext().
getAttribute("hitCounter");
writer.println();
writer.println("===============");
writer.println("The number of hits is: " +
counter.incCounter());
writer.println("===============");
// Log the resulting string
writer.flush();
System.out.println(sw.getBuffer().toString());
...
chain.doFilter(request, wrapper);
...
}
}
4. 設置過濾器映射
部署描述符文件的2.3版本引入了兩個用于過濾器的元素,分別是:filter和filter-mapping。filter元素向系統注冊一個過濾對象,filter-mapping元素指定該過濾對象所應用的URL。
1.filter元素
filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六個可能的子元素:
icon 這是一個可選的元素,它聲明IDE能夠使用的一個圖象文件。
filter-name 這是一個必需的元素,它給過濾器分配一個選定的名字。
display-name 這是一個可選的元素,它給出IDE使用的短名稱。
description 這也是一個可選的元素,它給出IDE的信息,提供文本文檔。
filter-class 這是一個必需的元素,它指定過濾器實現類的完全限定名。
init-param 這是一個可選的元素,它定義可利用FilterConfig的getInitParameter方法讀取的初始化參數。單個過濾器元素可包含多個init-param元素。
filter-mapping元素
filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三個可能的子元素::
l filter-name 這個必需的元素必須與用filter元素聲明時給予過濾器的名稱相匹配。
l url-pattern 此元素聲明一個以斜杠(/)開始的模式,它指定過濾器應用的URL。所有filter-mapping元素中必須提供url-pattern或servlet-name。但不能對單個filter-mapping元素提供多個url-pattern元素項。如果希望過濾器適用于多個模式,可重復整個filter-mapping元素。
l servlet-name 此元素給出一個名稱,此名稱必須與利用servlet元素給予servlet或JSP頁面的名稱相匹配。不能給單個filter-mapping元素提供多個servlet-name元素項。如果希望過濾器適合于多個servlet名,可重復這個filter-mapping元素。
posted @ 2007-05-13 17:12 ZelluX 閱讀(548) | 評論 (0) | 編輯 收藏
1. 使用DisplayTag時一直報錯,檢查了出錯信息后發現是common-lang的某個類出錯。
估計是MyEclipse自動添加Struts相關庫文件時使用的commons包比較早的緣故,于是把那些包都替換成了最新的版本,問題解決。
2. HQL查詢中的屬性名應當是beans的屬性名
數據庫的Book表中有inner_id這一字段
對應于Hibernate逆向工程生成的Book類的innerId屬性
查詢id為bookId的書時應該使用
session.createQuery("from Book b where b.innerId='" + bookId + "'")
.list()
.get(0);
3. DisplayTag分頁顯示功能中,使用的List變量必須是Session及以上級別的。
4. iframe的使用,設置iframe的name屬性,然后就能通過<a target"iframename" href="#">控制iframe的瀏覽對象了。
posted @ 2007-05-12 21:57 ZelluX 閱讀(177) | 評論 (0) | 編輯 收藏
感覺比去年那個簡單點。不少地方都簡化了,比如圖書分類,使用了enum類型,而不像去年的需要多表查詢才能獲得分類。
使用了Struts + Hibernate,準備先把基本功能做出來,然后再加上Ajax。
1. html:select 的列表框選擇
在csdn上看到的兩種方法:
1)
<html:select property="personnelId">
<html:option value="">請選擇</html:option>
<html:options collection="personList" property="personId" labelProperty="personName"/>
</html:select>
html:options自動幫你迭代personList中的內容,前提是personList是Collection類型的,而且封裝的是一個包含personId,personName屬性的對象
property顯示的是value,labelProperty顯示的是頁面看到的內容
2)
<html:select>
<html:option value="">請選擇***</html:option>
<logic:notEmpty>
<logic:iterate>
<option value='11'>11</option>
</logic:iterate>
</logic:notEmpty>
</html:select>
2. jsp頁面中用戶權限判斷的問題
BBS上問了下,一般是采用Filter類的。具體方法明天再看吧。
posted @ 2007-05-11 22:32 ZelluX 閱讀(242) | 評論 (0) | 編輯 收藏
1. Dictionary 類型
1) 類似于Java中的Hashtable類,Dictionary定義了鍵和值的一對一的關系。
2) 定義:{key:value}
d = {"server":"Tomcat", "database":"MySQL"}
3) key對大小寫敏感。
4) 可混用各種數據類型。
5) 刪除元素 del d["server"]
6) 清除所有元素 d.clear()
2. List 類型
1) 定義:
li = ["a", "b", 1]
2) 下標從0開始。
3) 負數索引從list的尾部向前計數來存取元素,即
li[-n] == li[len(li) - n]
4) 分片(slice)
>>> li = ['a', 'b', 'mpilgrim', 'z', 'example']
>>> li[1:3] //從第2個元素到第3個元素
['b', 'mpilgrim']
>>> li[1:-1] //從第2個元素到倒數第2個元素
['b', 'mpilgrim', 'z']
>>> li[:3]
['a', 'b', 'mpilgrim']
>>> li[3:]
['z', 'example']
>>> li[:]
['a', 'b', 'mpilgrim', 'z', 'example']
5) 增加元素
a) append 末尾追加單個元素
b) insert 將單個元素插入某個位置
>>> li
['a', 'b', 'mpilgrim', 'z', 'example', 'new']
>>> li.insert(2, "new")
>>> li
['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new']
c) extend 合并另一個List
6) 搜索
a) index 查找一個值的首次出現并返回索引值,如果沒有找到則引發異常,與Java不同
b) in 操作符測試一個值是否在list內
7) 刪除元素
a) remove 刪除某個元素,如不存在則引發異常
b) pop 彈出棧頂元素,即刪除最后一個值并返回該值
8) List運算符 真方便啊 -,=
>>> li = ['a', 'b', 'mpilgrim']
>>> li = li + ['example', 'new']
>>> li
['a', 'b', 'mpilgrim', 'example', 'new']
>>> li += ['two']
>>> li
['a', 'b', 'mpilgrim', 'example', 'new', 'two']
>>> li = [1, 2] * 3
>>> li
[1, 2, 1, 2, 1, 2]
posted @ 2007-05-11 16:22 ZelluX 閱讀(251) | 評論 (0) | 編輯 收藏
a) Object masquerading























另外,Object masquerading還支持多重繼承,方法類似。
b) 使用call()方法
感覺這個方法類似于Java反射機制中的invoke方法,第一個參數是個調用的對象主體,后面是被調用方法的參數。











c) 使用apply()方法
和call()方法很相似,不同的是apply方法只有兩個參數,一個是調用對象主體,一個是參數數組。
因此只要被上例的call語句改成ClassA.apply(this, new Array(sColor));即可
d) prototype鏈















ClassB新的屬性要在prototype被賦值后再添加,否則就會被刪除。
這種方法的好處在于,使用instanceof判斷子類對象和父類的關系的結果是true,和面向對象的思想一致。
e) 混合
Object masquerading的缺點在于性能不好,而prototype鏈又只能用無參構造器。因此要把兩者結合起來。






















f) 動態創建的類的繼承


















2. zInherit庫
簡略的看了下,基本功能Prototype框架都提供。
3.xbObjects
同樣是個庫,略
posted @ 2007-05-05 18:57 ZelluX 閱讀(300) | 評論 (0) | 編輯 收藏
更新內容沒什么,不過發現一個不錯的腳本插件Firebug lite,適用于其他瀏覽器。
http://www.getfirebug.com/releases/firebuglite1.0-b1.zip
http://www.aygfsteel.com/Files/zellux/firebug.rar
使用方法很簡單,解壓到要測試的網頁目錄下(包括目錄)
在html中加入
<script language="javascript" type="text/javascript" src="/firebug/firebug.js"></script>
然后在html標簽中聲明
<html debug="true">
就可以在網頁中使用Ctrl+Shift+F12打開Firebug的控制欄進行調試了。
posted @ 2007-05-05 12:26 ZelluX 閱讀(1472) | 評論 (6) | 編輯 收藏
posted @ 2007-05-04 23:06 ZelluX 閱讀(457) | 評論 (0) | 編輯 收藏
越來越發現JavaScript其實是一門很強大、很精深的語言,要好好學習下。
以下例子都摘自于Professional JavaScript for Web Developers
1. JavaScript中函數不能重載。
2. 每個函數有一個對應的arguments[]數組,包含所有的參數,且數量不需固定。





3. 函數也是一個對象,使用Function類創建函數的方法是:
var function_name = new Function(argument1, argument2,..,argumentN, function_body);
這里所有的參數都必須是字符串。




a) 第二次函數聲明使得doAdd指向了另一個對象,自然不可能實現重載。
b) 函數可以通過句柄很容易的復制。
c) 函數能作為參數傳遞給另一個函數。
d) func.toString()可以得到函數的具體內容。
4. 閉包 Closure
簡單的定義就是使用了函數體之外的引用。


















posted @ 2007-05-04 22:20 ZelluX 閱讀(323) | 評論 (0) | 編輯 收藏
感謝BBS上的outerheaven解答了add(E o)方法的問題。在把add方法寫成拋出異常不是為了防止子類向上轉型時錯誤地調用AbstractCollection的這個方法,而是為了讓不支持add方法的子類繼承,比如EnumSet類,它的元素是在創建時就決定的,不支持add方法。
java.util.AbstractList
1) 包含了
private class Itr implements Iterator<E>
private class ListItr extends Itr implements ListIterator<E>
而ListIterator又是繼承Iterator接口的。
分成兩個類寫是不是為了使代碼清晰呢?
2) 使用了modCount變量檢查并發操作時容易發生的問題。
Iterator中有一個expectedModCount變量,每次通過Iterator操作時,都會調用checkForComodification()方法,檢查expectedModCount是否和AbstractList的modCount相等,如果不同則拋出ConcurrentModificationException。
3) subList方法和SubList類和視圖view有關(是不是Observer模式的應用呢?),先不看了
4) equals方法中最后那個判斷語句有點新穎(或者我土了)

















5) hashCode的生成:
hashCode(e1, e2, ..., en) = Sigma(hashCode(ei) * 32^i)
沒有考慮溢出之類的情況,因為只是個hashCode嘛
posted @ 2007-05-04 13:11 ZelluX 閱讀(935) | 評論 (0) | 編輯 收藏