- HTML 是 Web 统一语言,这些容纳在尖括号里的简单标签,构成了如今的 Web。1991 年,Tim Berners-Lee 编写了一份叫做 “HTML 标签”的文档,里面包含了大约20个用来标记网页的 HTML 标签。他直接借用 SGML 的标记格式,也就是后来我们看到的 HTML 标记的格式。本文讲述了 HTML 这门 Web 标记语言的发展简史。
从 IETF 到 W3C: HTML 4 之路
HTML 1 并不曾存在,HTML 的第一个官方版本就是由 IETF (互联网工程任务组) 推出的 HTML 2.0。问世之前,这个版本中的很多细则已经被实现,比如,1994年的 Mosaic 浏览器已经实现了在文档中嵌入图片的方法,后来 HTML 2.0 便吸纳了 img 这个标签。 Read More - 前面介绍的无论是泛型类还是泛型方法,基本上都是把定义的类型参数作为一个整体来操作,放到数组或取出来,顶多就是调用了一下 hashCode() 方法,因为这是 Java 的根对象拥有的方法。比如说一个泛型数组,要得到其中的最小元素:
1package com.unmi; 2 3/** 4 * 泛型,类型变量的限定 5 * @author Unmi 6 */ 7public class ArrayAlg { 8 9 public static <T> T main(T[] a){ 10 if(a==null || a.length ==0){ 11 return null; 12 } 13 T smallest = a[0]; 14 for(int i=0;i<a.length;i++){ 15 if(smallest.compareTo(a[i])>0){ 16 smallest = a[i]; 17 } 18 } 19 20 return smallest; 21 } 22}
Read More - 前面讲了泛型类的定义,你也可以在一个普通类中单单定义一个泛型方法。也就是说类能够带个类型参数,方法也可以带类型参数的。还是来看个例子(包括如何应用),一个获得数组中间元素的方法,因为数组中存储元素的类型是不定的,所以把该方法定义成泛型的。
1package com.unmi; 2 3/** 4 * 泛型方法示例 5 * @author Unmi 6 */ 7public class ArrayAlg { 8 9 //这个就是在普通类 ArrayAlg 中定义的泛型方法 10 public static <T> T getMiddle(T[] a){ 11 return a[a.length/2]; 12 } 13 14 public static void main(String[] args) { 15 String[] names = {"Fantasia","Unmi","Kypfos"}; 16 //String middle = ArrayAlg.<String>getMiddle(names); 17 18 //上面那样写是可以,编译器可推断出要调用的方法,所以省去<String> 19 String middle = ArrayAlg.getMiddle(names); 20 System.out.println(middle); 21 } 22}
Read More - JDK 1.5 相对于 JDK 1.4 来说变化最大的部分就是泛型,甚至可以说自 Java 1.0 发布以来也是最大的一次语言变化,因为要涉及到编译器的大改动。很早的时候大家对泛型的呼声很大,正如 C++ 的模板,C# 的泛型确实是个值得借鉴的好特性。JDK1.5 这前,很多人对于泛型是急不可耐,在 JDK1.4 下搭配一个外挂的 Generic Java 编译器,通老实 -Xbootclasspath、-bootclasspath 同样能让你在 1.4 的 JDK 上使用泛型:
javac -J-Xbootclasspath/p:JSR14HOME\gjcrt.jar -bootclasspath JSR14HOME\collect.jar;JDK141HOME\jre\lib\rt.jar -source 1.5 FileName.java
java -Xbootclasspath/p:JSR14HOME\gjc-rt.jar FileName Read More 我在 BlogJava 后台传的文件为什么点击不能下载了,从上星期六开始的,比如地址为:http://www.blogjava.net/Files/Unmi/testrmi.rar,点击后出现 403 - Forbidden: Access is denied. 如图:

我以为登录后就行,可是登录后仍然一样的提示,直接在后台“文件”中点击下载也是这样提示。
希望能快点好。- 这种异常只会发生在 Windows 平台上,可以说是 iBatis 的一个 Bug,大约 iBatis 的开发测试人员都比较热衷于 Unix 族系的平台,而忽略了 Windows 下的兼容性测试。
出现 FileNotFoundException 异常的情形是这样的:Windows7 + iBatis2.3.0.677 + OSCache2.4.1。
iBatis 中配置使用 OSCache 缓存,在映射文件 Product.xml 中有如下声明片断:1<cacheModel type="OSCACHE" id="productCache"> 2 <flushOnExecute statement="Product.insert"/> 3 <flushOnExecute statement="Product.delete"/> 4</cacheModel> 5 6<select id="getById" cacheModel="productCache" parameterClass="int" resultClass="Product"> 7 select id, name,description as desc1 from test_product where id = #value# 8</select>
OSCache 的 oscache.properties 中指明用磁盘文件缓存数据,注意以下几个配置: Read More - 基本用法(不涉及其他相关类):
Ext.data.Record 实例就是对应一条记录,记录通常会放在数据集 Store 中,其中包含了数据的定义信息(字段名等) 和数据的值信息。这里不涉及与它相关的 Proxy、DataReader 和 Store,只单纯的用 Record 的方法。通常是两步,先调用 Record 的 create() 方法,返回一个类,然而 new 前面方法返回的类,代码过程如下:代码说明: Read More1//第一步,create() 返回一个 Record 的子类(定义了数据表现,有点像泛型) 2var Person = Ext.data.Record.create([ //用对象数组指定每个字段名 3 {name:'name'},{name:'email'} //name 属性指定每个字段名 4]); 5 6//通过前面 create() 返回的 Person 类创建 record 实例 7var record = new Person({//传入一个对象作为第一个参数,注意属性名对应 8 name:'Unmi', 9 email:'fantasia@sina.com' 10},2009); //第二个参数指定记录的标识 ID,未指定 ID 则为你用整数进行编号 11 12//验证效果,只取 id 和其中的 email 属性,可试下前面无 {id:'name'}的情况 13alert('id:' + record.id +", email:" + record.get('email')); - 在 ExtJs 中支持多线程的类有 Ext.util.TaskRunner 和 Ext.util.DelayedTask。TaskRunner 提供了多线程的定时服务,DelayedTask 允许你延时多久在新建线程中执行一个任务。Ext.TaskMgr 是一个 TaskRunner 实例,在 TaskMgr.js 源码中可以看到最后一行是:
Ext.TaskMgr = new Ext.util.TaskRunner();
实质上不管是 TaskRunner 还是 DelayedTask,它们都是通过 setInterval() 来执行任务的,TaskRunner 能多次重复的执行一个方法,而 DelayedTask 是延时执行完一次任务后就会调用 clearInterval() 来保证只执行一次。所以这里所说如何向任务的 run() 方法传递参数,本质上就是向 setInterval() 中方法传递参数。 Read More - 最近以裁判的身份参加了公司举办的编程大赛,发现高手云集,对公司内部的程序员能力也有了更深入的了解。我觉得编程能力对程序员而言,虽然很重要,但并不是全部。那么作为一个程序员,到底应该具备什么样的能力呢?这个话题显然太大。不过我觉得可以看看其它国家的程序员,也许可以得到一些借鉴。我有幸和中国,美国,印度和日本四国程序员有比较深入的合作过。虽然他们不一定有代表性,但我觉得他们的共性还是比较明显的。以下的比较纯属个人见解,欢迎指正。首先是日本程序员。他们的特点是非常仔细。我认为很主要的一个原因是日本公司的需求非常细致。细致到在网页上,连一个像素都不能偏差的地步。另外,日本人的执行力非常强,对老板的承诺比命还重要。一个项目可以做到连续3个月天天加班,每天只睡4个小时。然而,高执行力背后的代价是低创造力。在日新月异的互联网今天,很少听说日本工程师发明了哪些重要的技术。与其说这些特点是日本程序员的,不如说是大部分日本人的。因为在日本文化中,追求品质和遵守等级制度是根深蒂固的。另外,技术领域中的很多专业词汇是外来语,以英语(论坛)为主。这些专业词汇往往会被翻译成片假名。而片假名的发言有时候和英语大相径庭,导致沟通的困难。比如病毒一词在英语中是Virus,发音为歪儒斯,而日语的发音是味鲁斯。再例如服务器(Server)一词在日语中的发音是萨巴,和英文发言简直风牛马不相及。因此与日本程序员沟通是比较痛苦的,除非你懂日语。 Read More我们在使用 ExtJs 创建组件时最容易理解的当然是用
new Ext.form.TextField({fieldLabel:'姓名', id:'name',width:120});
我们还可以直接用 xtype(比如 TextField 对应的 xtype 是 textfield) 的对象形式来创建组件,比如在面板的 items 属性中,尤其是多个组件或需要写许多的 ExtJs 相关代码时就更值得推荐。我们来对照如下形式就知道了:Read More1items[ 2 new Ext.form.TextField({fieldLabel:'姓名', id:'name', width:120}), 3 new Ext.form.TextField({fieldLabel:'密码', id:'passwd', inputType:'password', width:120}), 4 new Ext.form.DateField({fieldLabel:'生日', id:'birth', format:'Y年m月d日', width:120}) 5] 6//替换成用 xtype 写法就如下(似乎只是免去了很多的 new ...) 7items[ 8 {xtype:'textfield', fieldLabel:'姓名', id:'name', width:120}, 9 {xtype:'textfield', fieldLabel:'密码', id:'passwd', inputType:'password', width:120}, 10 {xtype:'datefield', fieldLabel:'生日', id:'birth', format:'Y年m月d日', width:120} 11]