??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品亚洲片夜色在线,亚洲免费在线观看,亚洲成aⅴ人片久青草影院按摩http://www.tkk7.com/killvin/zh-cnSun, 11 May 2025 04:43:31 GMTSun, 11 May 2025 04:43:31 GMT60|页制作如何解决Div被Select挡住的问?/title><link>http://www.tkk7.com/killvin/archive/2006/11/23/83143.html</link><dc:creator>killvin</dc:creator><author>killvin</author><pubDate>Thu, 23 Nov 2006 15:47:00 GMT</pubDate><guid>http://www.tkk7.com/killvin/archive/2006/11/23/83143.html</guid><description><![CDATA[http://www.firstui.com/read.php/250.htm <img src ="http://www.tkk7.com/killvin/aggbug/83143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/killvin/" target="_blank">killvin</a> 2006-11-23 23:47 <a href="http://www.tkk7.com/killvin/archive/2006/11/23/83143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从csdnq个菜市U过来了http://www.tkk7.com/killvin/archive/2006/10/29/77905.htmlkillvinkillvinSun, 29 Oct 2006 07:54:00 GMThttp://www.tkk7.com/killvin/archive/2006/10/29/77905.html

killvin 2006-10-29 15:54 发表评论
]]>
Bindows Mozilla Support http://www.tkk7.com/killvin/archive/2006/10/14/75133.htmlkillvinkillvinSat, 14 Oct 2006 08:21:00 GMThttp://www.tkk7.com/killvin/archive/2006/10/14/75133.htmlVersion 1.01 on Bindows enhanced its Mozilla support considerably. At this point, the level of support is such that many complicated applications are available to Mozilla users. For example: now these can use our forum and the registration application.
We are dedicated to make Bindows work at least as well with Mozilla 1.4+ as it does with Internet Explorer 6.0 SP1. The Mozilla support is now integral part of Bindows and we will continue to develop, maintain and support it.
However, some issues are not solved yet and this document details them.


Known Issues
Web Services

We do not yet have a working SOAP web service client working with Mozilla. Mozilla has a built in web service client but it does not yet work with all the major web services platforms. We anticipate this to be resolve in a near future version of Bindows.


Graphs, Charts and Gauges
Graphs, charts and gauges are not supported. For the Bindows charts and gauges we rely on VML to do the drawing. Mozilla does not yet have a way to draw vector graphics at the client side without using a plugin. We consider several alternatives here but there is no time frame for a solution yet.


Miscellaneous
The caret is sometimes not shown in a focused textfield. This is a Mozilla bug and unless this is fixed in Mozilla this issue will remain.
Preferred size is not working consistently. Please report the cases where you are experiencing issues with the preferred size and we will see what can be done in those specific cases.
Icons in menu items works inconsistently between Mozilla versions. This is due to differences in the Mozilla toolkits used by different browsers.
Menu labels do not accept HTML. If you use HTML, the markup will be stripped.
The rendering of the group box is incorrect.
Labels with text align center and icon position set to top or bottom are a bit jumpy, ie. the icon move around depending on the state.
Dragging elements sometimes inconsistent. If an image is dragged an OS level drag and drop is initiated. Also, for some components a dragging will not work when the mouse leaves the browser window or enters a frame.
The upper border for the tab pages are not correctly drawn in Mozilla Firefox using Windows Classic. This is a Mozilla bug.
BiKeyboardEvent keyCode is sometimes incorrect in a keypress event (for special keys). The reason for this bug is that Internet Explorer and Mozilla are handling keyboard events differently.
Resize events are not fired on all BiComponents.
Focus and blur events are inconsistent when using BiRichEdit.



killvin 2006-10-14 16:21 发表评论
]]>
Jsparsehttp://www.tkk7.com/killvin/archive/2006/09/13/69501.htmlkillvinkillvinWed, 13 Sep 2006 15:23:00 GMThttp://www.tkk7.com/killvin/archive/2006/09/13/69501.html Jsparse is a parse to parse the schema file with javascript.
If you are interested in it, you can vist the url
http://code.google.com/p/jsparse/  

get source with svn
svn checkout http://jsparse.googlecode.com/svn/trunk/ jsparse

killvin 2006-09-13 23:23 发表评论
]]>
Double Checked Locking 模式http://www.tkk7.com/killvin/archive/2006/09/13/69499.htmlkillvinkillvinWed, 13 Sep 2006 15:16:00 GMThttp://www.tkk7.com/killvin/archive/2006/09/13/69499.html

ACE中的Double Checked Locking 模式


(作?Douglas C. Schmidt ,by huihoo.org CORBAN Thzhang ?, Allen整理,制作)

意图

无论什么时候当临界Z的代码仅仅需要加锁一ơ,同时当其获取锁的时候必LU程安全的,可以用Double Checked Locking 模式来减竞争和加锁载荷?

动机

1、标准的单例。开发正的有效的ƈ发应用是困难的。程序员必须学习(fn)新的技术(q发控制和防止死锁的法Q和机制Q如多线E和同步APIQ。此外,许多熟?zhn)的设计模式(如单例和q代子)在包含不使用Mq发上下文假讄序E序中可以工作的很好。ؓ(f)了说明这点,考虑一个标准的单例模式在多U程环境下的实现。单例模式保证一个类仅有一个实例同时提供了全局唯一的访问这个实例的入口炏V在c++E序中动态分配单例对象是通用的方式,q是因ؓ(f)c++E序没有很好的定义静态全局对象的初始化ơ序Q因此是不可UL的。而且Q动态分配避免了单例对象在永q没有被使用情况下的初始化开销?


class Singleton
{
public:
static Singleton *instance (void)
{
if (instance_ == 0)
// Critical section.
instance_ = new Singleton;
return instance_;
}
void method (void);
// Other methods and members omitted.
private:
static Singleton *instance_;
};



应用代码在用单例对象提供的操作前,通过调用静态的instanceҎ(gu)来获取单例对象的引用Q如下所C:(x)
Singleton::instance ()->method ();
2、问题:(x)竞争条g。不q的是,上面展示的标准单例模式的实现在抢先多d和真正ƈ行环境下无法正常工作。例如,如果在ƈ行主Zq行的多个线E在单例对象初始化之前同时调用Singleton::instanceҎ(gu)QSingleton的构造函数将被调用多ơ,q是因ؓ(f)多个U程在上面展示的(f)界区中执行new singleton操作。(f)界区是一个必遵守下列定式的指o(h)序列Q当一个线E?q程在(f)界区中运行时Q没有其他Q何线E?q程?x)同时在临界Zq行。在q个例子中,单例的初始化q程是一个(f)界区Q违反(f)界区的原则,在最好的情况下将D内存泄漏Q最坏的情况下,如果初始化过E不是幂{的Qidempotent.Q,导致严重的后果?

3?通常的陷阱和弊端。实C(f)界区的通常Ҏ(gu)是在cM增加一个静态的Mutex对象。这个Mutex保证单例的分配和初始化是原子操作Q如下:(x)


class Singleton
{
public:
static Singleton *instance (void)
{
// Constructor of guard acquires lock_ automatically.
Guard guard (lock_);
// Only one thread in the critical section at a time.
if (instance_ == 0)
instance_ = new Singleton;
return instance_;
// Destructor of guard releases lock_ automatically.
}
private:
static Mutex lock_;
static Singleton *instance_;
};


guardcM用了一个c++的习(fn)惯用法,当这个类的对象实例被创徏Ӟ它用构造函数来自动获取一个资源,当类对象d一个区域时Q用析构器来自动释放这个资源。通过使用guardQ每一个对Singleton::instanceҎ(gu)的访问将自动的获取和释放lock_?
即ɘq个临界区只是被使用了一ơ,但是每个对instanceҎ(gu)的调用都必须获取和释放lock_。虽然现在这个实现是U程安全的,但过多的加锁负蝲是不能被接受的。一个明显(虽然不正)的优化方法是guard攑֜针对instanceq行条g的内部Q?


static Singleton *instance (void)
{
if (instance_ == 0) {
Guard guard (lock_);
// Only come here if instance_ hasn't been initialized yet.
instance_ = new Singleton;
}
return instance_;
}

q将减少加锁负蝲Q但是不能提供线E安全的初始化。在多线E的应用中,仍然存在竞争条gQ将D多次初始化instance_。例如,考虑两个U程同时?instance_ == 0Q都会(x)成功Q一个将通过guard获取lock_另一个将被阻塞。当W一U程初始化Singleton后释放lock_Q被d的线E将获取lock_Q错误的再次初始化Singleton?
4、解决之道,Double Checked Locking优化。解册个问题更好的Ҏ(gu)是用Double Checked Locking。它是一U用于清除不必要加锁q程的优化模式。具有讽刺意味的是,它的实现几乎和前面的Ҏ(gu)一栗通过在另一个条件检中包装对new的调用来避免不必要的加锁Q?


class Singleton
{
public:
static Singleton *instance (void)
{
// First check
if (instance_ == 0)
{
// Ensure serialization (guard constructor acquires lock_).
Guard guard (lock_);
// Double check.
if (instance_ == 0)
instance_ = new Singleton;
}
return instance_;
// guard destructor releases lock_.
}
private:
static Mutex lock_;
static Singleton *instance_;
};


W一个获取lock_的线E将构徏SingletonQƈ指针分配给instance_Q后l调用instanceҎ(gu)的线E将发现instance_ != 0Q于是将跌初始化过E。如果多个线E试囑ƈ发初始化SingletonQ第二个gL竞争条g的发生。在上面的代码中Q这些线E将在lock_上排队,当排队的U程最l获取lock_Ӟ他们发现instance_ != 0于是蟩q初始化q程?

上面Singleton::instance的实C仅在Singleton首次被初始化Ӟ如果有多个线E同时进入instanceҎ(gu)导致加锁负载。在后箋对Singleton::instance的调用因为instance_ != 0而不?x)有加锁和解锁的负蝲?通过增加一个mutex和一个二ơ条件检,标准的单例实现可以是U程安全的,同时不会(x)产生q多的初始化加锁负蝲?

适应?/h3>> 当一个应用具有下列特征时Q可以用Double Checked Locking优化模式Q?
1、应用包含一个或多个需要顺序执行的临界Z码?
2、多个线E可能潜在的试图q发执行临界区?
3、(f)界区仅仅需要被执行一ơ?
4、在每一个对临界区的讉Kq行加锁操作导致过多加锁负载?
5、在一个锁的范围内增加一个轻量的Q可靠的条g是可行的?

l构和参与?/h3>通过使用伪代码能够最好地展示Double Checked Locking模式的结构和参与者,?展示了在Double Checked Locking模式有下列参与者:(x)



1、仅有一ơ(f)界区QJust Once Critical Section,Q。(f)界区所包含的代码仅仅被执行一ơ。例如,单例对象仅仅被初始化一ơ。这P执行对new Singleton的调用(只有一ơ)相对于Singleton::instanceҎ(gu)的访问将非常E?
2、mutex。锁被用来序列化对(f)界区中代码的讉K?
3、标记。标记被用来指示临界区的代码是否已经被执行过。在上面的例子中单例指针instance_被用来作为标记?
4?应用U程。试图执行(f)界区代码的线E?

协作

?展示了Double Checked Locking模式的参与者之间的互动。作ZU普通的优化用例Q应用线E首先检flag是否已经被设|。如果没有被讄Qmutex被获取。在持有q个锁之后,应用U程再ơ检flag是否被设|,实现Just Once Critical SectionQ设定flag为真。最后应用线E释N?



l论

使用Double Checked Locking模式带来的几点好处:(x)
1、最化加锁。通过实现两个flag,Double Checked Locking模式实现通常用例的优化。一旦flag被设|,W一个检将保证后箋的访问不要加锁操作?
2、防止竞争条件。对flag的第二个将保证临界Z的事件仅实现一ơ?
使用Double Checked Locking模式也将带来一个缺点:(x)产生微妙的移植bug的潜能。这个微妙的UL问题能够D致命的bugQ如果用Double Checked Locking模式的Y件被UL到没有原子性的指针和正数赋D义的gq_上。例如,如果一个instance_指针被用来作为Singleton实现的flagQinstance_指针中的所有位QbitQ必d一ơ操作中完成d写。如果将new的结果写入内存不是一个原子操作,其他的线E可能会(x)试图d一个不健全的指针,q将D非法的内存访问?
在一些允许内存地址跨越寚w边界的系l上q种现象是可能的Q因此每ơ访问需要从内存中取两次。在q种情况下,pȝ可能使用分离的字寚w合成flagQ来表示instance_指针?
如果一个过于激q(aggressiveQ编译器通过某种~冲手段来优化flagQ或是移除了W二个flag==0,带来另外的相关问题。后面会(x)介绍如何使用volatile关键字来解决q个问题?

实现和例子代?/h3>ACE在多个库lg中用Double Checked Locking模式。例如,Z减少代码的重复,ACE使用了一个可重用的适配器ACE Singleton来将普通的c{换成h单例行ؓ(f)的类。下面的代码展示了如何用Double Checked Locking模式来实现ACE Singleton?


// A Singleton Adapter: uses the Adapter
// pattern to turn ordinary classes into
// Singletons optimized with the
// Double-Checked Locking pattern.
template 
class ACE_Singleton
{
public:
static TYPE *instance (void);
protected:
static TYPE *instance_;
static LOCK lock_;
};
template  TYPE *
ACE_Singleton::instance ()
{
// Perform the Double-Checked Locking to
// ensure proper initialization.
if (instance_ == 0) {
ACE_Guard lock (lock_);
if (instance_ == 0)
instance_ = new TYPE;
}
return instance_;
}


ACE Singletonc被TYPE和LOCK来参数化。因此一个给定TYEP的类被转换成用LOCKcd的互斥量的具有单例行为的cR?
ACE中的Token Manager.是用ACE Singleton的一个例子。Token Manager实现在多U程应用中对本地和远端的tokenQ一U递归锁)死锁。ؓ(f)了减资源的使用QToken Manager被按需创徏。ؓ(f)了创Z个单例的Token Manager对象Q只是需要实C面的typedefQ?

typedef ACE_Singleton Token_Mgr;
Token Manager单例被用于本地和远端的token死锁。在一个线E阻塞等待互斥量之前Q它首先查询Token Manager单例Q来试d是否?x)导致死锁状态。对于系l中的每一个tokenQToken Manager单例l护一个持有tokenU程和所有阻塞等待在该token的线E记录链表。这些数据将提供充的检死锁状态的依据。用Token Manager单例的过E如下:(x)


// Acquire the mutex.
int Mutex_Token::acquire (void)
{
// If the token is already held, we must block.
if (mutex_in_use ()) {
// Use the Token_Mgr Singleton to check
// for a deadlock situation *before* blocking.
if (Token_Mgr::instance ()->testdeadlock ()) {
errno = EDEADLK;
return -1;
				}
else
// Sleep waiting for the lock...
		// Acquire lock...
		}

变化

一U变化的Double Checked Locking模式实现可能是需要的Q如果一个编译器通过某种~冲方式优化了flag。在q种情况下,~冲的粘着性(coherencyQ将变成问题Q如果拷贝flag到多个线E的寄存器中Q会(x)产生不一致现象。如果一个线E更改flag的值将不能反映在其他线E的对应拯中?

另一个相关的问题是编译器U除了第二个flag==0,因ؓ(f)它对于持有高度优化特性的~译器来说是多余的。例如,下面的代码在Ȁq的~译器下被跌对flag的读取,而是假定instance_q是?Q因为它没有被声明ؓ(f)volatile的?

Singleton *Singleton::instance (void)
{
if (Singleton::instance_ == 0)
{
// Only lock if instance_ isn't 0.
Guard guard (lock_);
// Dead code elimination may remove the next line.
// Perform the Double-Check.
if (Singleton::instance_ == 0)
// ...



解决q两个问题的一个方法是生命flag为Singleton的volatile成员变量Q如下:(x)
private:
static volatile long Flag_; // Flag is volatile.
使用volatile保证编译器不会(x)flag~冲到编译器Q同时也不会(x)优化掉第二次L作。用volatile关键字的a下之意是所有对flag的访问是通过内存Q而不是通过寄存器?

相关模式

Double Checked Locking模式是First-Time-In?fn)惯用法的一个变化。First-Time-In?fn)惯用法l常使用在类似cq种~少构造器的程序语a中,下面的代码展CZq个模式Q?


	static const int STACK_SIZE = 1000;
static T *stack_;
static int top_;
void push (T *item)
{
// First-time-in flag
if (stack_ == 0) {
stack_ = malloc (STACK_SIZE * sizeof *stack);
assert (stack_ != 0);
top_ = 0;
}
stack_[top_++] = item;
// ...
}



W一ơpush被调用时Qstack_?Q这导致触发malloc来初始化它自己?


killvin 2006-09-13 23:16 发表评论
]]>IE览器的两大问题(l?http://www.tkk7.com/killvin/archive/2006/07/02/56203.htmlkillvinkillvinSun, 02 Jul 2006 13:53:00 GMThttp://www.tkk7.com/killvin/archive/2006/07/02/56203.html在上一的文章中,比较仔细的分析了IE对于Cookie处理q程中出现的问题Q既然存在问题就要想办法解决Q而问题的关键在于IE没有能够"老实"的报告用户对于Cookie的设|问?br />
IE
GET /mail HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon)
Host: mail.google.com
Connection: Keep-Alive
Cookie: gmailchat=killvin.liu@gmail.com/519974 ; PREF=ID=d68c481e542af276:NW=1:TM=1151742225:LM=1151742225:S=2qbdhg0_z3i-OAbW; SID=DQAAAG8AAACEdcjD2IZMNqZVatDbD62X8_U18oJuTVQc9XZUJi7MgCkM8sggJ8M5npZ35GXjdalT2o8QWPUve04tepy61MPv4v_EpILafg3JdIf8AFjD91aMT0tI5gb763FouV3e_2-C364HDO5Qzb4P4gjjgpHC

Firefox
GET /mail HTTP/1.1
Host: mail.google.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

我们可以注意刎ͼ(x)如果用户关闭了浏览器的Cookie选项Q在Firefox中对于新的请求是包含Cookie的信息的Q然而IE却恰恰相反!q也q接用IE览一些网站所D的Cookie校验p|问题Q比如即使用户在使用q程中突然关闭CookieQ依然可以自q讉K|站的各Ҏ(gu)务)Q进一步,如果某个|站是读取依靠Cookie中的信息来验证用?其是那U保存客户信息的提示)Q即使这个用L(fng)开或者关闭窗口,M一个后来的人都可以L的浏览这个用L(fng)U有信息Q这是Cookie的最大的问题所在,当然q是另外的话题,不属于本ơ讨论的范畴Q这一ơ要说的?/font> 如何避免IE览器下Q用户关闭Cookie的问题?br />
有一个思\Q经q测试我们发现IE览器只是在首次面h的时候才?x)去dCookie的|所以,Z避免IE览器关闭Cookie的问题,可以在用戯求某个链接的时候,先将用户的Cookie存放在某处,q清I此时所有的Cookie|再次的请求页面,而这样做的目的就是强qI(xin)Ed盘上的CookieQ如果此时用户关闭了CookieQ就不会(x)在请求的头信息中看到Cookie信息Q如果没有关闭Cookie,可以放心的原先的Cookie写回Reponse对象?br />

只是不知道Google的网站是否也是按照这个思\去解x问题的?



killvin 2006-07-02 21:53 发表评论
]]>
IE览器的两大问题http://www.tkk7.com/killvin/archive/2006/07/01/56096.htmlkillvinkillvinSat, 01 Jul 2006 07:53:00 GMThttp://www.tkk7.com/killvin/archive/2006/07/01/56096.html IE在处理COOKIE斚w的问?br />
1。即使你提高了浏览器的隐U登讎ͼ在第一ơ打开H口的时候,你获取不CQ何的Cookies对象Q很昄的结果)Q然而当你再ơ刷新本面的,Cookie此时?x)奇q般的出玎ͼ而在Firefox览器中按照以上的步骤,是不?x)出现这L(fng)情况的?br />
2。不仅如此,你还可以透过Action的处理,多次的往Cookie中增加Cookie的数量(当然在Action中你依然可以自由的获取到Cookieq个数组Qƈ且不为空Q,然而让人匪h思的是在Cookie的存攄录下你是扑֯不到M的蛛丝马q的。而在Firefox没有出现以上的情c(din)?br />
Q解?br />1。在首次q入面时查询客L(fng)的CookieQ如果不存在则警告用Pq要求再ơ的登陆?br />2。在用户登陆后,如果更改了浏览器的隐U别,对于Firefox标准的浏览器Q此时肯定不?x)再扑ֈCookie数组对象了,你需要做的仅仅只是将面调{到登陆窗口;而在IE下就非常的麻烦了甚至无法解决Q因Z依然可以讉K到原来的Cookie数组|Q比如,用IE在CSDN登陆后提高隐U别,你依然可以登陆到其他的服务区域)此时没有什么好的办法,不过Google解决了这L(fng)问题Q只是不知道如何解决的?/strong>


IE在处理Frame标记的问?br />1。如果你在某个页面中嵌入了Frame标签Qƈ且希望与q个嵌入的页面共享某些存攑֜Session中的数据Q此时你需要将外部的sessionId传入到frame标记的页面中。然而在IE中你可能q不能完全的享受q样的逻辑Q原因在于IE对于嵌入的页面不?x)自动的传递sessionIdQ也怽y可以Q也怸行,也就是说完全是在IE?掌控"之下。而在Firefox没有出现q样的情c(din)?br />
Q解?br />为嵌入的面中所有的链接增加sessionId参数?br />

最好的办法是Q说服客户用标准的览器Firefox!



killvin 2006-07-01 15:53 发表评论
]]>
从ActionErrorsq渡到ActionMessageshttp://www.tkk7.com/killvin/archive/2006/06/27/55429.htmlkillvinkillvinTue, 27 Jun 2006 15:02:00 GMThttp://www.tkk7.com/killvin/archive/2006/06/27/55429.html 在Struts中我们经常这样@环的打印Message
<logic:messagesPresent message="true">
  <html:messages id="msg" message="true">
    <div class="success">
      <bean:write name="msg"/>
    </div><br/>
  </html:messages>
</logic:messagesPresent>

查阅struts tag的文档我们看C关于messagesPresent的message属性注释如?br />

message

By default the tag will retrieve the request scope bean it will iterate over from the Globals.ERROR_KEY constant string, but if this attribute is set to 'true' the request scope bean will be retrieved from the Globals.MESSAGE_KEY constant string. Also if this is set to 'true', any value assigned to the name attribute will be ignored


也就是说在将message讄为trueӞ?x)去request中寻找Globals.MESSAGE_KEY所代表的beanQ然而我们在具体的Action使用ActionMessagescȝ时候往往是这L(fng)
ActionMessages messages = getErrors(request);
messages.add(ActionMessages.GLOBAL_MESSAGE , new ActionMessage(key , value0));
saveMessages(request,messages);

而往往困扰人的在于ؓ(f)什么要lmessages中放入名UCؓ(f)"ActionMessages.GLOBAL_MESSAGE"的ActionMessage对象Q而且q需要再ơ的调用saveErrors(request,messages)Ҏ(gu)Q?/strong>

首先要说明的是你为ActionMessage起Q何的名称都没有关p,因ؓ(f)ActionMessages本nl持着一个HashMapQ而参数property是q个HashMap中的key|如果不存在则?x)徏立相应的key,q将需要保存的ActionMessage对象存入到这个key所对应的List中?br />    public void add(String property, ActionMessage message) {

        ActionMessageItem item = (ActionMessageItem) messages.get(property);
        List list = null;

        if (item == null) {
            list = new ArrayList();
            item = new ActionMessageItem(list, iCount++, property);

            messages.put(property, item);
        } else {
            list = item.getList();
        }

        list.add(message);

    }

至于Z么一定要调用saveMessages(request,messages)Q看看它具体的实现逻辑清楚了
    protected void saveMessages(
        HttpServletRequest request,
        ActionMessages messages) {

        // Remove any messages attribute if none are required
        if ((messages == null) || messages.isEmpty()) {
            request.removeAttribute(Globals.MESSAGE_KEY);
            return;
        }

        // Save the messages we need
        request.setAttribute(Globals.MESSAGE_KEY, messages);
    }

再对比前面介l的messagesPresent标签的用,是不是就清楚了呢Q原来它是将ActionMessages对象保存在request中,q且名称是Globals.ERROR_KEYQ从而ؓ(f)tag的顺利解析铺q了道\。当然按理你可以选择这L(fng)对象攄在Q何的scope中,但Action只是提供了request , session两种ScopeQ不qpage , application不经怋用,可以理解Q但不提供相应的l构׃太好了)

至于messagesPresent标签是如何在scope中寻找ActionMessages对象

org.apache.struts.taglib.logic.MessagesPresentTag
    protected boolean condition(boolean desired) throws JspException {
        ActionMessages am = null;

        String key = name;
        if (message != null && "true".equalsIgnoreCase(message)){
           key = Globals.MESSAGE_KEY;
        }

        try {
            am = TagUtils.getInstance().getActionMessages(pageContext, key);
           
        } catch (JspException e) {
            TagUtils.getInstance().saveException(pageContext, e);
            throw e;
        }

        Iterator iterator = (property == null) ? am.get() : am.get(property);

        return (iterator.hasNext() == desired);

    }

org.apache.struts.taglib.TagUtils
   public ActionErrors getActionErrors(PageContext pageContext, String paramName)
            throws JspException {

        ActionErrors errors = new ActionErrors();

        Object value = pageContext.findAttribute(paramName);
        if (value != null) {
            try {
                if (value instanceof String) {
                    errors.add(
                            ActionMessages.GLOBAL_MESSAGE,
                            new ActionMessage((String) value));

                } else if (value instanceof String[]) {
                    String keys[] = (String[]) value;
                    for (int i = 0; i < keys.length; i++) {
                        errors.add(
                                ActionMessages.GLOBAL_MESSAGE,
                                new ActionMessage(keys[i]));
                    }

                } else if (value instanceof ActionErrors) {
                    errors = (ActionErrors) value;

                } else {
                    throw new JspException(
                            messages.getMessage(
                                    "actionErrors.errors",
                                    value.getClass().getName()));
                }

            } catch (JspException e) {
                throw e;

            } catch (Exception e) {
                log.debug(e, e);
            }
        }
        return errors;
    }

PageContext中的findAttribute?x)帮你在scope中寻扑֐UCؓ(f)Globals.MESSAGE_KEY的ActionMessage对象?br />

注意
虽然Struts已经声明Q不推荐使用ActionErrors & ActionError对象Q但在一些遗留的pȝ中,依然q是可以看到其媄子,所以如果你的系l不q属于这L(fng)两种混合pȝQ有以下的几U方法可以参?br />
1。两ơ调用messagesPresentQ如?br /><!-- Print ActionErrors Object -->
<logic:messagesPresent>
  <html:messages id="msg" message="true">
    <div class="success">
      <bean:write name="msg"/>
    </div><br/>
  </html:messages>
</logic:messagesPresent>

<!-- Print ActionMessages Object -->
<logic:messagesPresent message="true">
  <html:messages id="msg" message="true">
    <div class="success">
      <bean:write name="msg"/>
    </div><br/>
  </html:messages>
</logic:messagesPresent>

2.分别使用<html:messages> <html:errors>标签Q当然在老系l中需要调用Action的saveErrorsҎ(gu)Q而在新的应用中要调用saveMessagesҎ(gu)?/font>

3.更换所有的ActionErrors为ActionMessages,q将所有调用saveErrors的地Ҏ(gu)换成saveMessagesQƈ?lt;html:errors>标签相应的更换成<html:messages message="true"> Q?推荐Q?/font>

 



killvin 2006-06-27 23:02 发表评论
]]>
q发问题?qing)控制手D?http://www.tkk7.com/killvin/archive/2006/04/06/39542.htmlkillvinkillvinThu, 06 Apr 2006 02:57:00 GMThttp://www.tkk7.com/killvin/archive/2006/04/06/39542.html http://www.cnblogs.com/zhenyulu/articles/208799.html

W??q发问题?qing)控制手D?/h1>

什么是q发问题Q假设有q么一家书吧,֮可以到那里喝茶读书。顾客拿着选好要读的图书到柜台登记Q然后找个地方去阅读Q(f)走时图书归q店家。有一天,一个顾客相中了一本书后正要拿ȝ讎ͼ另一个顾客的手也抓住了这仅有的一本书Qƈ发问题出C。两个顾客要d一本书Q互不相让,q让店主伤透了脑筋。这个案例仅仅是众多q发问题中的一个微部分,但从中我们可以看出ƈ发问题主要出现在多个用户Ҏ(gu)限资源进行访问的时候,如果解决不好?x)直接媄响系l的有效、正常运行。数据库是一个共享的资源Qƈ发问题的出现是必不可免的Q如何识别ƈ发类型ƈ加以控制是这一章重点要讲述的内宏V?/p>

本章分成两大部分,一部分主要讲Visual FoxPro中ƈ发控制机制。VFP中ƈ发控制相对简单,数据加锁的Ş式比较单一Q非帔R合作ؓ(f)初步了解q发问题的切入点。第二部分以SQL Server 2000、ADO.NET以及(qing)C#Z要工P深入了解q发一致性问题、封锁协议、事务隔ȝ内容Q难度相对较深。象一些更为深入的q发控制手段Q例如多_度锁和意象锁{内容在本章中将不做深入讨论Q感兴趣可以参考相关书c?/p>

 

[实在不好意思COPY别h的成果,不过q篇文章出奇的精彩,ƈ发操作的来龙去脉说的清清楚楚Q也是我正要扄Q比JAVAEYE上面所谓的专家叫嚷着什?(zhn)观??乐观?而不解是原因要强的多Q值得收藏]



killvin 2006-04-06 10:57 发表评论
]]>
北大青鸟Q存储牛_的地方http://www.tkk7.com/killvin/archive/2006/04/01/38599.htmlkillvinkillvinSat, 01 Apr 2006 04:53:00 GMThttp://www.tkk7.com/killvin/archive/2006/04/01/38599.html痛快Q。。。h们L认ؓ(f)骂h是没有素质的象征Q然而我到觉得要看对谁而言Q如果你的面前是个谦虚、严谨而又懂得重别h的hQ你Ҏ(gu)׃可能让自己愤怒,也不可能让自p现的很没有素质;相反如果你的面前是个先入Z、自傌Ӏ不懂得重别h的hQ你的愤怒就?x)在最短的旉内激发出来。-对于hQ就要骂Q?br />
而这有与北大青鸟有什么关pdQ?br />
在我的职业生涯里Q有一D让自己愤怒的培训l历Q到今天我都己在q样的培训部的学?fn)经历而感到耻iQ甚至不愿意在简历里提及(qing)ACCP的字P而这L(fng)培训l历是在北大青鸟(西安兆隆Q里度过的?br />
我参加的是北大青鸟(西安兆隆Q的W二期培训,培训的课E涉?qing)到数据库、编E语a、职业素质、项目实늭Q看上去非常的正规,可是真正的学?fn)效果却是让人非常的失望的?br />
首先Q就是它的课E体p,完全的引入印度的教程Q而翻译的质量非常的差Q其实这到没有什么,只是教程的讲解范围和深度都非常的(q还是第二期的培训)Q如果你只是按照它的教程我可以说你根本学不到M有h(hun)值的东西Q只是皮毛而已。-拿着淡薄的教学资料的同时你也׃了贼船了?br />

再次Q就是它的老师的水q_在不敢恭l_(d)Q当然ƈ不是说根本就没有好的老师Q曾l就遇到q一个讲解JAVA与UML的老师Q水q非常的高深Q可惜ACCP没有留住Q,比如~程语言中学?fn)了VBQ仅仅只是这一门课E就换了3个老师Q最后是一位号U是西工大的博士上的课,然而这位博士显然是心思不再这里,除了讲解课本上已l有的代码,Ҏ(gu)不敢深入的讲解原理,q门评也就q样淯M。-如果q样学习(fn)~程语言道不如自学来得轻松?br />

q有Q就是所谓的目实践Ҏ(gu)׃是老师带的目Q而是一些书本上或者捏造出来的一些项目,比如图书理pȝ{,如果学员无法真正的理解需求,怎么ȝ解设计,又如何来q行实际的编码呢Q如果遇到图书管理的专业问题来问谁呢Q-别指望在他们宣传的所谓的目实践中得到锻点{?br />
在看看他们引以ؓ(f)傲的工作分配问题吧?我个h的亲w感受来aQ这里会(x)提供一些工作的Z(x)Q但都是一些小公司Q而且往往是一些前三个月不l工资的公司Q当时我在我们班U里是比较认真的一个(我是班里唯一的一个交了对目分析文档的学员,q且是项目实践中的小l组长)Q可是在一ơ很好的面试Z(x)面前Q她们竟然由于工作的p忘记了给我打?sh)话Q!Q如果这L(fng)工作分配{略也算作是l予你的{案的话Q你一定会(x)变得和我一L(fng)愤怒!


我没有在ACCP学到M的有用的东西Q然而在真实的世界里却学CZ对于ACCP的看法,很多的技术经??技术ȝ从骨子里非常的厌恶从北大青鸟出来的学生,对于他们开讄一些课E也是相当的反感Q当时在襉K世纪工作的时候,同组的就有和我一起上评同班同学Q在他交?000多元的学?fn)费用(d的费用接q?万多元)后,得到的仅仅只是西部世U的一张试用通知单,而条件是必须无条件的为公司工作三个月Q?br />

q就是我在北大青鸟的学习(fn)l历Q然而愤怒的不是q个Q却是今天参加的面试l历Q对照着自己的个人的工作l历我希望自p够成Z名培训部的老师Q教l那些原来如我一L(fng)学生一些在实践当中有用的东西,而不是空z的理论Q所以我lACCP投了自己的简历,然而让我却又一ơ的遇到了那个欺骗过我的咨询师,不过她的记忆力也是非常的好,一眼就认出了我Q当然了我是曄l她带来奖金的hQ,在紧接着的面试过E中已经变了味道Q谈论的话题也不是具体项目技术的问题Q(不是我笑话她与她谈论技术问题根本就如同对牛弹琴Q她昄是一个没有素质的WOMANQ也可以肯定的是Ҏ(gu)本没有在外企工作q的l历Q所以说话的词汇以及(qing)与其如同大街上的泼妇一般,可以惌她一定是一个被ACCP严重z过脑的人,而且是属于那U技术失败的产品Q她无法接受别的培训部的名字Q一旦你提v别的培训部的某个老师的水q_何如何的好,她就如同一个快被点燃的鞭炮一般,两眼充满了愤怒!

然而让我最l和她一般的没有素质的大骂的是她对于我辞职的评点Q我很纳L(fng)是她在不知道一件事情的原因的情况下Q可以讲q自q观点Qƈ且是带着教育的口吻,实在是h才呀Q这是北大青鸟?人才力量"Q对于这L(fng)白痴U别的Q务的观点Q我只好打断Q因为它甚至q我在的那个单位的名字都不知道!Q?br />
实在是一场闹剧,而她更像是个丑Q除了唧唧喳喳的重复一?z脑"的词汇已l不知道H外的天气了Q可以预料北大青鸟的牌子必将?x)毁在这些个白痴的手中,世界需要白_(d)那如同鲜花需要牛_一P我们改变不了白痴的世界观的,你能够做的就是别被这臭烘烘的牛粪l熏臭了?br />



killvin 2006-04-01 12:53 发表评论
]]>
վ֩ģ壺 պŷAVҹҹ| | ޹þþþƷС˵| ƷؼһëƬѹۿ| aëƬ˾þ| һëƬڼ| ޾Ʒ߾ƷƵ| һ߹ۿѸ߹ۿ | ĻӰ| һëƬշ| 㽶Ƶ߹ۿ| ִӲˬƵ| ŷһëƬѿ| ޲AVӰƬ߲| ѴƬ߹ۿcom| ɫɫwww| ëƬѹۿƵ| JLZZJLZZٸ| ޾ƷӰԺ| þƵ| ɫվwwwһ| ޳aƬ߹ۿձ| ֻˬִƵ| aëƬվ| ޳ҹ| aaһƬѹۿ| AVվ| պƵѿ| avվyy| һƷƵ| Ļѹۿ| þ91Ƶۿ | ѵӾ߹ۿ| ޹һ| ƷþþþþþѼձ| ޹ۺϾƷĻ| þþƷƵѲ| ŷպĻһ| Ƭѹۿþ| þsmȤ| һeһƬ߲|