9月21
分组 XML 技术
很多年前,当 XML 成为最热门的技术之一时,很难想象得到 XML 会在十年内变得如此重要,而且您可以找到大量与 XML 相关的有趣技术。实际上,可以通过多种途径了解 XML 技术。
传统的 XML 分组
可以将与 XML 相关的技术划分为一些基本的分组或主要区域:
1. 文档创作:此分组面向将主要的时间用于创作 XML 的人。无论他们是创建原始 XML 数据,还是用 XML 格式表示现有数据,这里主要关注的都是纯 XML,很少关注可能使用这些文档的编程任务。这就是 XML 的核心思想所在,这个分组还包括特定的 XML 词汇表(比如 MathML)或一些科学 XML 词汇表。
2. 处理 XML:这些技术(比如 XSL)允许对 XML 进行转换、修改或由一种格式迁移到另一种格式。这些技术主要关注的仍然是 XML 文档及其内部数据,但有时候也使用编程语言来完成这些转换。
3. 读取/编写 XML(以及持久化数据):这些技术与编程联系更加紧密,包括从低级的 API(比如 SAX 和 DOM)到数据处理技术(比如 JAXB 和 Castor)。这些技术将 XML 看作一种数据存储机制,而且在许多情形下看作一种达到目的的手段。
到目前为止,这些分组是主要的技术类别,每个分组中都在不断出现最新的技术和规范。
将 XML 转变为一类数据居民
XML 的一个主要问题就是缺乏良好的搜索支持,尽管这个问题仅限于上面的三个分组。如果想要对 XML 格式的数据进行搜索,则这会是一个问题。实际上,通常的解决方案是将上面的一些分组结合起来。文档创作者可能使用命令行工具(比如 grep,这是一种笨拙的搜索方式。编程人员可能读入 XML(另一个分组),然后使用他们的编程语言(比如 Java 或 C#)对非 XML 格式的数据进行搜索。这种方法是可行的,但暴露了 XML 的一些局限性。
幸运的是,XPath(和 XQuery,本文稍后将会谈到)的引入和流行带来了一个新分组:
4. 搜索 XML:XPath 和 XQuery 就属于这个分组。这些规范/技术允许以 XML 的方式对 XML 文档进行搜索。换句话说,可以使用 XML 语义进行搜索,并且不但能够搜索 XML 文档中的数据,还能够搜索这些文档的结构。
借助 XPath 和 XQuery,不再需要将数据由 XML 转换为一种编程语言,然后使用这种语言的工具来搜索数据。使用这种方法不仅会受到编程语言的约束,通常还会丢失大多数 XML 语义和结构(比如元素之间的父子关系等等)。使用 XPath 和 XQuery,无需编程语言 就可以对 XML 进行搜索。
很多年前,当 XML 成为最热门的技术之一时,很难想象得到 XML 会在十年内变得如此重要,而且您可以找到大量与 XML 相关的有趣技术。实际上,可以通过多种途径了解 XML 技术。
传统的 XML 分组
可以将与 XML 相关的技术划分为一些基本的分组或主要区域:
1. 文档创作:此分组面向将主要的时间用于创作 XML 的人。无论他们是创建原始 XML 数据,还是用 XML 格式表示现有数据,这里主要关注的都是纯 XML,很少关注可能使用这些文档的编程任务。这就是 XML 的核心思想所在,这个分组还包括特定的 XML 词汇表(比如 MathML)或一些科学 XML 词汇表。
2. 处理 XML:这些技术(比如 XSL)允许对 XML 进行转换、修改或由一种格式迁移到另一种格式。这些技术主要关注的仍然是 XML 文档及其内部数据,但有时候也使用编程语言来完成这些转换。
3. 读取/编写 XML(以及持久化数据):这些技术与编程联系更加紧密,包括从低级的 API(比如 SAX 和 DOM)到数据处理技术(比如 JAXB 和 Castor)。这些技术将 XML 看作一种数据存储机制,而且在许多情形下看作一种达到目的的手段。
到目前为止,这些分组是主要的技术类别,每个分组中都在不断出现最新的技术和规范。
将 XML 转变为一类数据居民
XML 的一个主要问题就是缺乏良好的搜索支持,尽管这个问题仅限于上面的三个分组。如果想要对 XML 格式的数据进行搜索,则这会是一个问题。实际上,通常的解决方案是将上面的一些分组结合起来。文档创作者可能使用命令行工具(比如 grep,这是一种笨拙的搜索方式。编程人员可能读入 XML(另一个分组),然后使用他们的编程语言(比如 Java 或 C#)对非 XML 格式的数据进行搜索。这种方法是可行的,但暴露了 XML 的一些局限性。
幸运的是,XPath(和 XQuery,本文稍后将会谈到)的引入和流行带来了一个新分组:
4. 搜索 XML:XPath 和 XQuery 就属于这个分组。这些规范/技术允许以 XML 的方式对 XML 文档进行搜索。换句话说,可以使用 XML 语义进行搜索,并且不但能够搜索 XML 文档中的数据,还能够搜索这些文档的结构。
借助 XPath 和 XQuery,不再需要将数据由 XML 转换为一种编程语言,然后使用这种语言的工具来搜索数据。使用这种方法不仅会受到编程语言的约束,通常还会丢失大多数 XML 语义和结构(比如元素之间的父子关系等等)。使用 XPath 和 XQuery,无需编程语言 就可以对 XML 进行搜索。
9月21
Java 5.0 泛型简介
泛型其实并不是一种新的语言元素,C++中早就就有,但是在C++之后的java却没有吸收这个特性,现在Java也有了泛型的特性,大概也和.Net的竞争有关系吧。
首先看泛型的一个应用。
在过去,我们可能经常要写一些类似这样的代码:
实际上第三行对String的类型转换意义并不大,因为通常我们如果在操作一个List,都是知道这个List里面放的是什么类型对象的,但是我们如果不这样写又通不过语法检查。
利用java的泛型机制,我们可以这么写:
这样做的好处是在定义容器的时候就指明了容器中的类型,一方面我们不再需要取一个元素时候做强制类型转换,另外一方面如果在这个容器中放入的对象类型不符合要求,那么会在编译时候产生一个错误,而不是在运行时候才抛出一个异常。
另外这样也提高了程序的可读性。
泛型其实并不是一种新的语言元素,C++中早就就有,但是在C++之后的java却没有吸收这个特性,现在Java也有了泛型的特性,大概也和.Net的竞争有关系吧。
首先看泛型的一个应用。
在过去,我们可能经常要写一些类似这样的代码:
实际上第三行对String的类型转换意义并不大,因为通常我们如果在操作一个List,都是知道这个List里面放的是什么类型对象的,但是我们如果不这样写又通不过语法检查。
利用java的泛型机制,我们可以这么写:
这样做的好处是在定义容器的时候就指明了容器中的类型,一方面我们不再需要取一个元素时候做强制类型转换,另外一方面如果在这个容器中放入的对象类型不符合要求,那么会在编译时候产生一个错误,而不是在运行时候才抛出一个异常。
另外这样也提高了程序的可读性。
9月21
Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。
Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。
JavaBean 是 reflection 的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。
1. 一个简单的例子
考虑下面这个简单的例子,让我们看看 reflection 是如何工作的。
Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。
JavaBean 是 reflection 的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。
1. 一个简单的例子
考虑下面这个简单的例子,让我们看看 reflection 是如何工作的。
9月21
对于JSF的应用,你可能会在HTTP的头信息中看到这样的字样:
Server : Apache/2.0.61 (Unix)
X-Powered-By : JSF/1.2
让用户知道这些消息没有太大意义,而且可能造成安全漏洞。需要屏蔽的话可以参考以下步骤:
隐藏Server信息:在apache里控制的,在httpd.conf里加入一行
ServerTokens Prod
隐藏X-Powered-By:在web.xml中加入:
Server : Apache/2.0.61 (Unix)
X-Powered-By : JSF/1.2
让用户知道这些消息没有太大意义,而且可能造成安全漏洞。需要屏蔽的话可以参考以下步骤:
隐藏Server信息:在apache里控制的,在httpd.conf里加入一行
ServerTokens Prod
隐藏X-Powered-By:在web.xml中加入:
9月21
phpExcelReader是专门用来读取文件的。返回一个数组,包含表格的所有内容。
该 class 使用的方法可以参考网站下载回来的压缩档中的 example.php。
有几点要需要注意:
1、reader.php 中:将 require_once 'Spreadsheet/Excel/Reader/OLERead.php';改为 require_once 'oleread.inc';
2、example.php 中:修改 $data->setOutputEncoding('CP1251');为 $data->setOutputEncoding('CP936');或者是$data->setOutputEncoding('gbk');
3、修改 nl2br(htmlentities($data->sheets[$sheet]['cells'][$row][$col]));为 $table_output[$sheet] .= nl2br(htmlspecialchars($data->sheets[$sheet]['cells'][$row][$col]));
不然中文会有问题。
繁体的话可以修改为CP950、日文是CP932,具体可参考codepage说明。
修改 $data->read('jxlrwtest.xls') 为自己的 excel 文件名,zip 档中附的 jxlrwtest.xls 应该是坏了。
这是下载地址:
phpExcelReader:http://sourceforge.net/projects/phpexcelreader/
PHPExcel:http://www.codeplex.com/PHPExcel/Wiki/View.aspx?title=Documents&referringTitle=Home
范例代码一:
该 class 使用的方法可以参考网站下载回来的压缩档中的 example.php。
有几点要需要注意:
1、reader.php 中:将 require_once 'Spreadsheet/Excel/Reader/OLERead.php';改为 require_once 'oleread.inc';
2、example.php 中:修改 $data->setOutputEncoding('CP1251');为 $data->setOutputEncoding('CP936');或者是$data->setOutputEncoding('gbk');
3、修改 nl2br(htmlentities($data->sheets[$sheet]['cells'][$row][$col]));为 $table_output[$sheet] .= nl2br(htmlspecialchars($data->sheets[$sheet]['cells'][$row][$col]));
不然中文会有问题。
繁体的话可以修改为CP950、日文是CP932,具体可参考codepage说明。
修改 $data->read('jxlrwtest.xls') 为自己的 excel 文件名,zip 档中附的 jxlrwtest.xls 应该是坏了。
这是下载地址:
phpExcelReader:http://sourceforge.net/projects/phpexcelreader/
PHPExcel:http://www.codeplex.com/PHPExcel/Wiki/View.aspx?title=Documents&referringTitle=Home
范例代码一:
9月21
我们在jsf中你其实并不能通过h:commandButton或 者h:commandLink向一个带参数的方法中传递参数,但是你也可以使用f:param来达到这一目的。比如对于下面的代码:
你不能够这样定义MyAction中的actionMethod:
public String actionMethod(String myParam)
JSF不会把相应的参数传递给方法。但是你可以申明一个无参数的方法并通过request得到f:param中的值:
另外,需要提醒你的是,如果你使用了JBoss Seam,你就完全可以使用带参数的方法了。
你不能够这样定义MyAction中的actionMethod:
public String actionMethod(String myParam)
JSF不会把相应的参数传递给方法。但是你可以申明一个无参数的方法并通过request得到f:param中的值:
另外,需要提醒你的是,如果你使用了JBoss Seam,你就完全可以使用带参数的方法了。
9月21
我们在HttpServletRequest中我们可以通过getLocale()得到用户请求的locale,但是如果你希望手动改变用户的locale设置的话却没有setLocale方法,那么有什么办法来改变request的locale设置吗呢?
答案是可以写一个HttpServletRequestWrapper,通过其中的getLocale()方法和getLocales()方法来改变用户请求的locale设置。首先我们来写一个这样的类:

答案是可以写一个HttpServletRequestWrapper,通过其中的getLocale()方法和getLocales()方法来改变用户请求的locale设置。首先我们来写一个这样的类:
9月21
内存溢出的原因
有三种可能导致OutOfMemoryError。首先是,此JVM有真实的内存泄漏,导致此JVM堆在内部实现时产生了一个Bug。这极不可靠。所有JVM都经过充分的测试,并且,如果有人发现这种bug,它将绝对是最高的优先级。因此你可以非常宽心地排除这种可能性。
第二种可能的OutOfMemoryError原因只不过是,你没有为你的应用程序运行时给予足够多的可用内存。这种情况,有两种可能的方案,或者增加 JVM堆可用大小,或者减少你的应用程序所需的内存总量。提高JVM可用堆大小可以简单的使用JVM的 -Xmx 参数。假如你将此参数设置尽可能的大(可用内存极限不要超过系统物理内存,否则你的应用程序将分页并暂停),仍然有以上所提到的内存问题,那么,你需要减少你的应用程序所可能用到内存总量。减少应用程序内存可能是简单的,你可能允许一些集合过大,例如使用了许多大的缓冲区。或者它过于复杂,要求你重新实现一些类,乃至重新设计应用程序。
有些JVM还有一个“Perm”参数用来处理JVM结构与类对象。如果你正在使用一个数量非常巨大的类集,它有可能运行在"Perm"空间之外,然后你需要增加此空间的大小,例如,sun的JVM使用 -XX:PermSize 与 -XX:MaxPermSize 选项。
第三种导致OutOfMemoryError最为常见,无心的对象引用保持。你没有明确无误的释放对象,以致于你的堆增长再增长,直到你没有额外的空间。
有三种可能导致OutOfMemoryError。首先是,此JVM有真实的内存泄漏,导致此JVM堆在内部实现时产生了一个Bug。这极不可靠。所有JVM都经过充分的测试,并且,如果有人发现这种bug,它将绝对是最高的优先级。因此你可以非常宽心地排除这种可能性。
第二种可能的OutOfMemoryError原因只不过是,你没有为你的应用程序运行时给予足够多的可用内存。这种情况,有两种可能的方案,或者增加 JVM堆可用大小,或者减少你的应用程序所需的内存总量。提高JVM可用堆大小可以简单的使用JVM的 -Xmx 参数。假如你将此参数设置尽可能的大(可用内存极限不要超过系统物理内存,否则你的应用程序将分页并暂停),仍然有以上所提到的内存问题,那么,你需要减少你的应用程序所可能用到内存总量。减少应用程序内存可能是简单的,你可能允许一些集合过大,例如使用了许多大的缓冲区。或者它过于复杂,要求你重新实现一些类,乃至重新设计应用程序。
有些JVM还有一个“Perm”参数用来处理JVM结构与类对象。如果你正在使用一个数量非常巨大的类集,它有可能运行在"Perm"空间之外,然后你需要增加此空间的大小,例如,sun的JVM使用 -XX:PermSize 与 -XX:MaxPermSize 选项。
第三种导致OutOfMemoryError最为常见,无心的对象引用保持。你没有明确无误的释放对象,以致于你的堆增长再增长,直到你没有额外的空间。
9月21
9月21
我们在很多时候你可能需要在程序中解析HTML文件或者字符串并从中抽取出文本内容来,要实现这个功能有很多工具可用。今天介绍的这个示例是使用swing中的一个类HTMLEditorKit.ParserCallback来实现这个功能。下面是一段示例代码:
其中:静态方法htmlToPlainText可以用来将html转化为纯文本,main函数示例了如何将一个网页的内容转化成为纯文本.
其中:静态方法htmlToPlainText可以用来将html转化为纯文本,main函数示例了如何将一个网页的内容转化成为纯文本.







