在过去我们用 DTD 来定义 XML 文档的和法性,而现在可以利用 XML Schema (XML Schema Definition,XSD)来替代 DTD。同 DTD 相同,XML Schema 描述了 XML 文档的结构,既然如此,那么我们为什么要选择 XML Schema 而不是 DTD 呢?
1、XML Schema 可针对未来的需求进行扩展,DTD 不易扩展。
2、XML Schema 更完善,功能更强大。
3、XML Schema 基于 XML 编写,一个 XML Schema 也是一个 XML 文件。DTD 不遵循 XML 语法,这表示你不得不多去学习另外一门语言。
4、XML Schema 支持数据类型,内置多种数据类型。DTD 数据类型有限。
5、XML Schema 支持命名空间,DTD 不支持命名空间。
6、XML Schema 在 2001年5月2日成为 W3C 标准。
最近正在将 Grapevine 升级至第2代版本 ,将全 xml 配置转为 Annotation + xml 的方式。如此一来,将大大简化 xml 文件的配置,提高生产效率。我们来看看 Grapevine2 中最基础的 xml 配置是如何利用 XML Schema 进行验证的。
Continue Reading »
在日本Mayaa很流行,也许是因为是日本人写的框架,总之现在很多日本的项目都用这个框架。
Mayaa处于 web 体系的表示层,主要是将后台数据交给 html 显示。Mayaa的思路很不错,它的重点在于使得 html 更加单纯,将逻辑和设计进一步分离。即使程序已经写好,页面设计人员也可以很容易地对页面进行重构且不会影响到程序的正确性。开发人员也可以更清晰地对程 序进行修改和变更。为了做到这一点,Mayaa 的做法是为每个 .html 文件配置一个 .mayaa 文件,当访问该 .html 文件时,解析对应的 .mayaa 文件并将结果交给 html ,最终做为 response 输出到客户端。那么如何取出后台数据,又该怎么将数据交给 html 呢?看两段代码:
html 文件:<div m:id=”test” id=”test”/>
mayaa 文件:<m:write m:id=”test” value=”${test}” />
为 html 的项目追加 m:id 属性,在相应的 mayaa 文件中追加相同 m:id 的标签m:write 标签。这样一来,这两个文件的同一 m:id 的项目就绑定了,系统运行时,就会将 m:write 标签的 value交给绑定的 html 项目了。
Continue Reading »
昨天追加了一些功能,经过测试发现了几个问题,今天对其进行了修正。
1、对自定义树节点图标的改进。
问题:自定义树节点图标是用文件选择框(JFileChooser)实现的。但是 Swing 的 JFileChooser
是不支持图片预览的,这样使用起来非常不方便。
改进:在文件选择框右侧追加了图片预览框。当选中某个图片时,该框会显示出图片。
2、修正了点击弹出的密码输入框的“取消”按钮后文章依然被打开的 bug。
3、修正了可修改有密码文章标题的 bug。
今天比较空闲,把 Grape 做了一点修改。
1、修改了几个 bug :
a、修复了更换皮肤导致所有打开的文章变为修改状态。
b、修复了设置文章为“只读”后,状态栏没有改变。
2、修改并追加了几个小功能:
a、密码输入框改为了 JPasswordField。
b、追加了文章密码设置。
c、查找对话框显示时,将选择的文字做为要查找的对象。
d、自定义节点(文章)图标。
Continue Reading »
接下来的时间又要开始忙了,估计这个程序一时半会做不完了。干脆把目前的成果先放出来,大家可以看看。
本程序分为两部分,Grapevine 和 Grape。Grapevine 是一个 Swing 开发框架,写的比较粗,没时间细写。实现了 OR/M、IOC、Interseptor 等功能,有兴趣的朋友可以了解一下。Grape 是建立在 Grapevine 上的一个知识管理的应用,实现了多文件、多文档编辑、发布日志到 WordPress 等功能。还是没时间,设置基本上都还没时间写,发布日志也比较简化,有时间再好好修改。
config目录下的classes.xml是类的配置文件,所有的对象都是由 Grapevine 生成并注射到程序中去的。包括画面、菜单、事件处理等等。Grapevine.jar 在 lib 目录下。
要运行程序,需要安装 jdk 6,否则程序将无法运行,切记。
程序基本上可以完成基础需求了,不过还没有测试过,可能有很多Bug。我在使用中也遇到了几个小Bug。
本次不是发布,只是接下来没有时间写了,所以把半成品给大家预览一下。目前源代码还没有整理过,注释也乱七八糟的,比较乱,有些地方也不是很合理,还需要调整,有想要学习或正在开发相同应用的朋友可以参考一下。
应用:Grape
源码:Grape Grapevine WordEditor
Grape 是使用了 Swing 的 Look And Feel 机制来进行换肤的。当然仅仅使用 Look And Feel
是不够的,例如界面图标、浏览样式等等。
为了能够使换肤功能更易扩展,Grape 专门设计了一组皮肤类,结构如下:

Continue Reading »
WordEditor 是为 Grape 写的一个文字处理器,实现了文字加粗、斜体、字体大小、字体样式、下划线、删除线、居左、居右、居中、文字颜色、文字背景色、插入本地图片、插入互联网图片、分隔线、下沉、上移、超链接、撤销、重做以及快捷键等基本的文字处理功能。也实现了保存为文本文件和
RTF 文件的功能。
WordEditor 支持多国语言,所有的文字以及消息都配置在 properties
文件中。若要生成中文的编辑器,只需要在构造方法中传入“cn”即可。例如:new
WordEditor(“cn”);若要生成英文的编辑器,将“cn”改为”en”即可。日文也相同。当然,前提是 config
文件夹下必需要有这几个配置文件。中文:CN.properties,英文:EN.properties,日文:JP.properties。目前我只做了英文和中文的
properties。
Continue Reading »
本文不是一篇真正意义上的日志,只是为了测试 Grape 日志发布功能,请大家忽略。
刚开始打算写 Grape 的时候,只是想做一个 Swing 下快速开发的框架。当框架开发的差不多的时候,就打算利用它开发一个 Swing
应用程序。终于在这休息的一个多月的时间里,这个应用程序开发了 80%。最主要的功能已经基本实现(还没认真测试)。下图的应用程序就是基于Grape 开发出来的。

Swing 的 JTextPane 是非常强大的文字处理工具,它不但可以处理文本,也可以作为浏览器来显示指定的网页。利用 JTextPane 可以很轻松地开发类似 Word 之类的文字处理工具。比如要设置文本为粗体,可以这样实现:
MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setBold(attr, !StyleConstants
.isBold(((HTMLEditorKit) editor.getEditorKit())
.getInputAttributes()));
setCharacterAttributes(editor, attr, false);
设置背景色为:
MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setBackground(attr, color);
setCharacterAttributes(editor, attr, false);
看上去都没有什么问题,不过,若你的程序有保存功能,并且保存的是JTextPane生成的html,这样问题就来了。当利用getText方法取得生成的html代码时,我们发现虽然背景色的显示正确但html代码无法生成。这似乎是一个bug?不过没关系,我们可以利用HTMLEditorKit的insertHML来实现。
Continue Reading »
从JDK1.3开始,Java就引入了动态代理的概念。动态代理(Dynamic Proxy)可以帮助你减少代码行数,真正提高代码的可复用度。例如,你不必为所有的类的方法里面都写上相同的Log代码行,取而代之的是实用类的动态代理类。当然,这种便利是有条件的。
在JDK1.3以前,代理模式就已流行,所以得代理模式是生成一个和类相同接口的代理类,用户通过使用代理类来封装某个实现类。其目的是加强实现类的某个方法的功能,而不必改变原有的源代码。代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
Continue Reading »