ravenix

鱼如何控制自己的呼吸
posts - 7, comments - 3, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

日历

<2005年8月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

公告

独立软件顾问-欢迎咨询

文章分类

搜索

  •  

最新评论

2005年8月22日

Eclipse 应用可以使用Java Web Start部署,实现Rich Client。

这要求把所有的插件打包成独立的jar,并且要签署它。

如果要用到别人开发的java库,就要利用eclipse提供的Create a plug-in project from existing JAR archives 把它做成 eclipse plugin。

Apache Jakarta有许多项目使用了commons-logging来写log。如果用到了这样的项目,你也需要把commons-logging做成一个 plugin。但是commons-logging在使用eclispe plugin包装并使用Java Web Start部署时,它会抛出异常

LogConfigurationException : Invalid class loader hierarchy. You have more than one version of org.apache.commons.logging.Log visible, which is not allowed.

究其原因,是JCL(Jakarta Commons Logging)中一直存在的classloader问题。

简单来说,JCL使用调用者的classloader加载Log接口,这是最常见的类载入方法;但是加载具体的实现类是,用的是thread context classloader。

通常情况下,这两个classloader是同一个。但是Eclipse有一套插件类加载机制,每个插件使用不同的 classloader。在这个例子中,加载Log接口是EclipseClassLoader,加载Log实现类的thread context classloader是JNLPClassLoader,它们并不相同。问题就来了,用不同classloader加载的类被认为是无关的,所以JCL 的实现类不能赋给Log接口类,就会抛出那个异常。

关于JCL classloader问题更详细解释,请看log4j的创始人之一,Ceki Gülcü写的文章
"Taxonomy of class loader problems encountered when using Jakarta Commons Logging"

为了解决这个问题,我启动了一个项目,jcleclipse -- 重写了JCL,固定实现为把所有的log写到eclipse自己的ILog里。这样就不用要求用户在某个指定的地方建目录来存储log。

jcleclipse项目主页 http://jcleclipse.sourceforge.net/
jcleclipse项目概要 http://sourceforge.net/projects/jcleclipse

posted @ 2005-09-09 14:30 ravenix 阅读(1256) | 评论 (1)编辑 收藏

如果用digister处理的xml里包含了外部dtd指定,即在!DOCTYPE中用PUBLIC指定外部dtd,即使使用了

digester.setValidating(false);

底层的sax解析器xerces仍然会去指定的地址去加载DTD,特别地,如果指定的地址无法获得DTD,就会抛出异常:
SAXException: The markup declarations contained or pointed to by the document type declaration must be well-formed

为了避免这个问题,可以使用这样的语句:
digester.setValidating(false);
digester.setFeature(
"http://apache.org/xml/features/nonvalidating/load-external-dtd",false);

当然这个设置只有在底层的sax解析器是xerces才有效。如果你使用的是其它的sax解析器,请参考解析器的文档。

posted @ 2005-08-30 15:57 ravenix 阅读(1058) | 评论 (0)编辑 收藏

目前所知道的
apache xerces 支持中文元素
saxon自带的aelfred 不支持

posted @ 2005-08-26 16:04 ravenix 阅读(498) | 评论 (0)编辑 收藏

尽管有一些不足,wutka dtdparser 仍然是使用最广泛的java dtd dom解析器。

其它可用的java dtd parser有 Ronald Bourret DTD ParserMatra DTD parser

要在DTD中使用中文,必须要在dtd文件的第一行写上

<?xml version="1.0" encoding="UTF-8"?>

并且将dtd文件以utf-8格式保存。别的编码格式也可以试试,但我不想冒险。

dtdparser不使用这个encoding指示来解析DTD,我们只能自己想办法,修改它的代码。

dtdparser有这些构造器(省略了带trace的)

DTDParser(java.io.File in)
DTDParser(java.io.Reader in)
DTDParser(java.net.URL in)

其中以Reader为参数的没有编码问题,因为reader本身已经指定了字符集。

以File为参数的构造器内部使用了new FileReader(in),这个方式使用系统默认字符集,不要用它,可以用FileInputStream和InputStreamReader来指定字符集,传递给以Reader为参数的构造器。

以URL为参数的构造器内部使用了new InputStreamReader(in.openStream()),没有指定字符集,我们可以给它增加一个带有String charsetName参数的构造器,内部调用new InputStreamReader(in.openStream(), charsetName)

posted @ 2005-08-22 21:02 ravenix 阅读(1353) | 评论 (1)编辑 收藏

w3c CSS2规范中明确指出,在样式定义中要使用unicode字符,必须用转义方式

unicode的写法如下

unicode 	\\[0-9a-f]{1,6}[ \n\r\t\f]?

必须以反斜线开头,后面跟1到6个16进制字符(0-9a-f)来表示该字符的unicode码,字符的后面可以附加空格,制表符,换行或回车。

举例来说,样式“标题”应该写成\6807\9898

java工具native2ascii可以用来查看字符串的unicode码,注意在CSS里反斜线后面不写u

另外要注意的是,用sac flute来解析CSS的时候,转义字串的末尾如果是回车的话,一定要附加空格,否则会被解释成“标题\n”

CSS里注释是可以写中文的,用/* */包围起来就好了。
带有中文的CSS最好用UTF-8编码保存,并且在CSS的第一行写上
@charset "UTF-8";

CSS规范并没有规定解析器必须支持何种编码,但是UTF-8是被普遍支持的,如果你的解析器支持多语言编码的话。

posted @ 2005-08-22 17:31 ravenix 阅读(777) | 评论 (0)编辑 收藏