posted @ 2007-05-13 20:00 ZelluX 閱讀(148) | 評論 (0) | 編輯 收藏
1. Filter 簡介
這方面的內(nèi)容以前看的幾本書里都找不到,想到了Sun J2EE的Tutorial,果然里面有比較詳細(xì)的解釋。
Filter是一個傳輸請求或者響應(yīng)的報頭和內(nèi)容的對象,通常的作用是:
a) 根據(jù)不同情況處理請求。
b) 阻止請求-響應(yīng)的過遠(yuǎn)傳送。(Block the request-and-response pair from passing any further.)
c) 通過自定義新的請求版本,修改請求報頭和數(shù)據(jù)。
d) 通過自定義新的響應(yīng)版本,修改響應(yīng)報頭和數(shù)據(jù)。
e) 和外部資源交互。
2. Filter 編程
filtering API由javax.servlet包中的Filter, FilterChain和FilterConfig接口定義。
其中最重要的方法是doFilter。它可以用來:
a) 檢查請求報頭。
b) 自定義請求對象。
c) 自定義響應(yīng)對象。
d) 調(diào)用過濾鏈(filter chain)中的下一個實體(entity)。如果當(dāng)前過濾器已經(jīng)是鏈中最后一個過濾器了,下一個實體就是鏈尾的資源;否則它就是在WAR中設(shè)置的下一個過濾器。當(dāng)然也可以在此時通過不調(diào)用下一個實體來中斷請求、
e) 在響應(yīng)報頭調(diào)用下一個過濾器后檢查。
f) 拋出反應(yīng)處理錯誤的異常。
3. 一個 Duke's Bookstore 的例子
HitCounterFilter在servlet被訪問時計數(shù)。
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. 設(shè)置過濾器映射
部署描述符文件的2.3版本引入了兩個用于過濾器的元素,分別是:filter和filter-mapping。filter元素向系統(tǒng)注冊一個過濾對象,filter-mapping元素指定該過濾對象所應(yīng)用的URL。
1.filter元素
filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六個可能的子元素:
icon 這是一個可選的元素,它聲明IDE能夠使用的一個圖象文件。
filter-name 這是一個必需的元素,它給過濾器分配一個選定的名字。
display-name 這是一個可選的元素,它給出IDE使用的短名稱。
description 這也是一個可選的元素,它給出IDE的信息,提供文本文檔。
filter-class 這是一個必需的元素,它指定過濾器實現(xiàn)類的完全限定名。
init-param 這是一個可選的元素,它定義可利用FilterConfig的getInitParameter方法讀取的初始化參數(shù)。單個過濾器元素可包含多個init-param元素。
filter-mapping元素
filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三個可能的子元素::
l filter-name 這個必需的元素必須與用filter元素聲明時給予過濾器的名稱相匹配。
l url-pattern 此元素聲明一個以斜杠(/)開始的模式,它指定過濾器應(yīng)用的URL。所有filter-mapping元素中必須提供url-pattern或servlet-name。但不能對單個filter-mapping元素提供多個url-pattern元素項。如果希望過濾器適用于多個模式,可重復(fù)整個filter-mapping元素。
l servlet-name 此元素給出一個名稱,此名稱必須與利用servlet元素給予servlet或JSP頁面的名稱相匹配。不能給單個filter-mapping元素提供多個servlet-name元素項。如果希望過濾器適合于多個servlet名,可重復(fù)這個filter-mapping元素。
posted @ 2007-05-13 17:12 ZelluX 閱讀(544) | 評論 (0) | 編輯 收藏
1. 使用DisplayTag時一直報錯,檢查了出錯信息后發(fā)現(xiàn)是common-lang的某個類出錯。
估計是MyEclipse自動添加Struts相關(guān)庫文件時使用的commons包比較早的緣故,于是把那些包都替換成了最新的版本,問題解決。
2. HQL查詢中的屬性名應(yīng)當(dāng)是beans的屬性名
數(shù)據(jù)庫的Book表中有inner_id這一字段
對應(yīng)于Hibernate逆向工程生成的Book類的innerId屬性
查詢id為bookId的書時應(yīng)該使用
session.createQuery("from Book b where b.innerId='" + bookId + "'")
.list()
.get(0);
3. DisplayTag分頁顯示功能中,使用的List變量必須是Session及以上級別的。
4. iframe的使用,設(shè)置iframe的name屬性,然后就能通過<a target"iframename" href="#">控制iframe的瀏覽對象了。
posted @ 2007-05-12 21:57 ZelluX 閱讀(175) | 評論 (0) | 編輯 收藏
感覺比去年那個簡單點。不少地方都簡化了,比如圖書分類,使用了enum類型,而不像去年的需要多表查詢才能獲得分類。
使用了Struts + Hibernate,準(zhǔn)備先把基本功能做出來,然后再加上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中的內(nèi)容,前提是personList是Collection類型的,而且封裝的是一個包含personId,personName屬性的對象
property顯示的是value,labelProperty顯示的是頁面看到的內(nèi)容
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頁面中用戶權(quán)限判斷的問題
BBS上問了下,一般是采用Filter類的。具體方法明天再看吧。
posted @ 2007-05-11 22:32 ZelluX 閱讀(239) | 評論 (0) | 編輯 收藏
1. Dictionary 類型
1) 類似于Java中的Hashtable類,Dictionary定義了鍵和值的一對一的關(guān)系。
2) 定義:{key:value}
d = {"server":"Tomcat", "database":"MySQL"}
3) key對大小寫敏感。
4) 可混用各種數(shù)據(jù)類型。
5) 刪除元素 del d["server"]
6) 清除所有元素 d.clear()
2. List 類型
1) 定義:
li = ["a", "b", 1]
2) 下標(biāo)從0開始。
3) 負(fù)數(shù)索引從list的尾部向前計數(shù)來存取元素,即
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個元素到倒數(shù)第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 查找一個值的首次出現(xiàn)并返回索引值,如果沒有找到則引發(fā)異常,與Java不同
b) in 操作符測試一個值是否在list內(nèi)
7) 刪除元素
a) remove 刪除某個元素,如不存在則引發(fā)異常
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 閱讀(247) | 評論 (0) | 編輯 收藏
a) Object masquerading























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











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















ClassB新的屬性要在prototype被賦值后再添加,否則就會被刪除。
這種方法的好處在于,使用instanceof判斷子類對象和父類的關(guān)系的結(jié)果是true,和面向?qū)ο蟮乃枷胍恢隆?
e) 混合
Object masquerading的缺點在于性能不好,而prototype鏈又只能用無參構(gòu)造器。因此要把兩者結(jié)合起來。






















f) 動態(tài)創(chuàng)建的類的繼承


















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





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




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


















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

















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