posts - 16,comments - 17,trackbacks - 0
@ My Space
posted @ 2005-05-13 00:08 非飞 阅读(2450) | 评论 (2)编辑 收藏
@ My space
posted @ 2005-05-07 00:19 非飞 阅读(2217) | 评论 (0)编辑 收藏
在JDK1.4.2中加入了对NIO的支持,掌握其中的Selector个人认为是能实现好NIO的关键。

Selector是用来获取注册在其中的channel的相关事件的发生,也就是accept,read和write。selector中有3个key set。

key set:包含代表所有在其中注册的channel,可以通过selector.keys()得到。
selected-key set:包含所有被检测到有关注的操作已经就绪的key,通过selector.selectedKeys得到。
cancelled-key set:包含所有已经被cancel,但是还没有channel还没有deregister的key,这个集合是不能直接被访问的。

key通过调用channel的register方法被加入到key set中。被取消的key在select的时候会被从相应的key set中移除。

key set自身是不可以直接进行修改的。 无论是通过调用channel的close方法还是调用key的cancel方法,key都会被放置到canceled-key set中。取消的key会将其channel在下一次select时将注册撤销,同时将key从所有的key set中移除。

key在执行select操作时被加入到selected-key set中。在selected-key set中的key可以通过调用iterator的remove方法,将其从selected-key set中移除,不能通过其他的办法将其从selected-key set中移除。

通过selector的3个方法select(阻塞选择,直到有关心的事件发生时退出阻塞),selectNow(不阻塞选择),select(long)(指定超时选择,超时到达或者有关心事件发生时退出阻塞),来获取关心事件的发生。其执行步骤分为以下3步:

1、将存在于canceled-key set中的key从所有的key set中移除,撤销注册的channel,清空canceled-key set。
2、地层操作系统检查是否有关心的事件发生,当有关心的事件发生时,首先检查channel的key是否已经存在于selected-key set中,如果不存在,则将其加入到selected-key set中去,同时修改key的ready-operation set来表明当前ready的操作,而以前存在于ready-operation set中的信息会被删除。如果对应的key已经存在于selected-key set中,这直接修改其ready-operation set来表明当前ready的操作,删除原来ready-operation set中的信息。
3、如果在第二步中有加入到canceled-key set中的key,在这一步会执行第一步的操作。

selector自身是线程安全的,而他的key set却不是。在一次选择发生的过程中,对于key的关心事件的修改要等到下一次select的时候才会生效。 另外,key和其代表的channel有可能在任何时候被cancel和close。因此存在于key set中的key并不代表其key是有效的,也不代表其channel是open的。如果key有可能被其他的线程取消或关闭channel,程序必须小 心的同步检查这些条件。

阻塞了的select可以通过调用selector的wakeup方法来唤醒。
posted @ 2005-04-26 10:06 非飞 阅读(17351) | 评论 (3)编辑 收藏

在JavaScript中,可以通过window.location来获取url地址。但是window.location是一个对象,没有办法直接从里面获取出我们需要的参数。通常的做法就是使用一个隐藏的<input>,通过将window.location负值给input。其目的就是为了将location转换成String。写的过程中总是觉得太复杂了,后来发现使用document.URL就可以解决这个问题。
posted @ 2005-04-18 15:52 非飞 阅读(4086) | 评论 (3)编辑 收藏

今天在帮朋友写一个简单的产品发布网站,由于使用的空间是静态的,没有办法只能在javascript上下功夫了。首先想到的便是RIA,上网google了一下,发现这样的东西还真不少,可谓是十八般武艺各显灵通。看了看文明的bindows,感觉真的非常的好。可是选择它对于我要做的东西,可以说是过于复杂了。(http://www.bindows.net 有兴趣的朋友可以去看看)。
搜索了半天最后还是决定,采用javascript读取服务器端xml文件的办法来实现。尝试了一下感觉还不错,确定就是对使用的浏览器有依赖。
先写了一个商品的xml文件:

<?xml version="1.0"?>
<root>
 
<product id="0001" name="product1" price="10.00">
  
<description>
   Detail Description
  
</description>
 
</product>
 
<product id="0002" name="product2" price="20.00">
  
<description>
   Detail Description
  
</description>
 
</product>
</root>

 

使用javascript来读入xml实在是相当的简单,只需要两句话就可以搞定:

// 装载xml文件的函数
function loadXML(fileName) {
 
// 定义一个xml dom对象
 var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
 
 xmlDoc.load(fileName);
 xmlObj 
= xmlDoc.documentElement;
}

 

指定要载入的xml文件名就可以完成对xml的读入。

// 载入xml文件
loadXML("product.xml");

 

得到xml对象后就可以适用对象提供的相应方法和属性来获取xml中定义的数据信息。
xmlObj.hasChildNodes来判断是否含有子项;
xmlObj.childNodes.lenght 得到包含的子项的数量
子项可以用数字来作为索引,以product.xml为例。如果我们要获取第二条商品时,可以用xmlObj.childNodes(1)来获得,xmlObj.childNodes(1).childNodes(0)得到的是description
xmlObj.childNodes(1).childNodes(0).text 得到description的值
xmlObj.childNodes(1).getAttribute("name") 得到第二条商品的名字


posted @ 2005-04-09 12:23 非飞 阅读(4703) | 评论 (1)编辑 收藏