﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-泰仔在线-随笔分类-Java 相关</title><link>http://www.blogjava.net/kxx129/category/9851.html</link><description>java学习,心情日记,缤纷时刻</description><language>zh-cn</language><lastBuildDate>Sat, 31 Oct 2015 16:49:27 GMT</lastBuildDate><pubDate>Sat, 31 Oct 2015 16:49:27 GMT</pubDate><ttl>60</ttl><item><title>JdkにSSLルート証明書をインストールする</title><link>http://www.blogjava.net/kxx129/archive/2015/10/21/427844.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Wed, 21 Oct 2015 01:46:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2015/10/21/427844.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/427844.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2015/10/21/427844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/427844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/427844.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JdkにSSLルート証明書をインストールする(例として、GeoTrustのRapidSSLSHA2(SHA256))&nbsp;&nbsp;<a href='http://www.blogjava.net/kxx129/archive/2015/10/21/427844.html'>阅读全文</a><img src ="http://www.blogjava.net/kxx129/aggbug/427844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2015-10-21 09:46 <a href="http://www.blogjava.net/kxx129/archive/2015/10/21/427844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用Maven plugin使用</title><link>http://www.blogjava.net/kxx129/archive/2015/10/21/427843.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Wed, 21 Oct 2015 01:29:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2015/10/21/427843.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/427843.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2015/10/21/427843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/427843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/427843.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 常用Maven plugin使用&nbsp;&nbsp;<a href='http://www.blogjava.net/kxx129/archive/2015/10/21/427843.html'>阅读全文</a><img src ="http://www.blogjava.net/kxx129/aggbug/427843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2015-10-21 09:29 <a href="http://www.blogjava.net/kxx129/archive/2015/10/21/427843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to get IBM Java 7 for Windows?</title><link>http://www.blogjava.net/kxx129/archive/2013/04/08/397512.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Mon, 08 Apr 2013 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2013/04/08/397512.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/397512.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2013/04/08/397512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/397512.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/397512.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Q：IBM has its own JVM called J9. Linux versions can be downloaded from DeveloperWorks, but not the Windows versions (except for one requiring IBM hardware). This is most likely a licensing issue. We develop against IBM non-x86 hardware with J9 so it is interesting to use the same JVM for development too. <br>What is the official way of getting IBM Java 7 for Windows? (and how expensive is it?) &nbsp;&nbsp;<a href='http://www.blogjava.net/kxx129/archive/2013/04/08/397512.html'>阅读全文</a><img src ="http://www.blogjava.net/kxx129/aggbug/397512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2013-04-08 11:41 <a href="http://www.blogjava.net/kxx129/archive/2013/04/08/397512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JNLP介绍</title><link>http://www.blogjava.net/kxx129/archive/2009/12/25/307289.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Fri, 25 Dec 2009 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2009/12/25/307289.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/307289.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2009/12/25/307289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/307289.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/307289.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: jnlp是什么？是java提供的一种让你可以通过浏览器直接执行java应用程序的途径，它使你可以直接通过一个网页上的url连接打开一个java应 用程序．好处就不用说了，如果你的java应用程序以jnlp 的方式发布，如果版本升级后，不需要再向所有用户发布版本，只需要更新服务器的版本，这就相当于让java应用程序有了web应用的优点了&nbsp;&nbsp;<a href='http://www.blogjava.net/kxx129/archive/2009/12/25/307289.html'>阅读全文</a><img src ="http://www.blogjava.net/kxx129/aggbug/307289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2009-12-25 16:43 <a href="http://www.blogjava.net/kxx129/archive/2009/12/25/307289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用POI的HSSF来控制EXCEL的研究 </title><link>http://www.blogjava.net/kxx129/archive/2009/09/23/296200.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Wed, 23 Sep 2009 11:48:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2009/09/23/296200.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/296200.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2009/09/23/296200.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/296200.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/296200.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.创建工作簿 (WORKBOOK)<br>    HSSFWorkbook wb = new HSSFWorkbook();<br>    FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br>    wb.write(fileOut);<br>    fileOut.close();<br>2.创建工作表（SHEET）<br>    HSSFWorkbook wb = new HSSFWorkbook();<br>    HSSFSheet sheet1 = wb.createSheet("new sheet");<br>    HSSFSheet sheet2 = wb.createSheet("second sheet");<br>    FileOutputStream fileOut = new FileOutputStream("workbook.xls");<br>    wb.write(fileOut);<br>    fileOut.close();&nbsp;&nbsp;<a href='http://www.blogjava.net/kxx129/archive/2009/09/23/296200.html'>阅读全文</a><img src ="http://www.blogjava.net/kxx129/aggbug/296200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2009-09-23 19:48 <a href="http://www.blogjava.net/kxx129/archive/2009/09/23/296200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nutch的索引代码解读（一） </title><link>http://www.blogjava.net/kxx129/archive/2009/09/05/294001.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Sat, 05 Sep 2009 09:00:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2009/09/05/294001.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/294001.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2009/09/05/294001.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/294001.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/294001.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Nutch的内部网增量缩影是可以通过recrawl脚本（nutch的wiki上有发布）进行增量更新，但是对于对于全网爬取的URL如何做到增量更新，目前来说还没有相关的方法，尤其是对于上TB级别数据的索引更新和合并，直接把Nutch似乎还有相当多的问题需要解决（比如分布式大索引分割、合并等等，在Nutch的mailing list上大家讨论了非常多，但还是没有一个合理的解决方案），因此，作者期望通过解读源码的方式来对Nutch的索引构建机制和源码做一个较为初浅的解读，以期通过修改解决Nutch的索引面临的问题，期望能得到广大网友的意见。 <br>    考虑到笔者的需求是Nutch对于海量的数据的索引，因此基于集群的方式对Nutch的源码进行解读。 <br>本文是针对Nutch1.0而写，Nutch1.0相比0.9更多的功能采用了Map/reduce算法结构，若不是先前对MapReduce有一番了解，看起来将是非常费解。 <br>首先：补充一点最基础的知识，就是Nutch的文件目录所包含的内容： &nbsp;&nbsp;<a href='http://www.blogjava.net/kxx129/archive/2009/09/05/294001.html'>阅读全文</a><img src ="http://www.blogjava.net/kxx129/aggbug/294001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2009-09-05 17:00 <a href="http://www.blogjava.net/kxx129/archive/2009/09/05/294001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nutch的命令详解</title><link>http://www.blogjava.net/kxx129/archive/2009/09/05/294000.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Sat, 05 Sep 2009 08:55:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2009/09/05/294000.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/294000.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2009/09/05/294000.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/294000.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/294000.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 关键字: nutch 命令 <br>Nutch采用了一种命令的方式进行工作，其命令可以是对局域网方式的单一命令也可以是对整个Web进行爬取的分步命令。主要的命令如下： <br><br>1. Crawl <br>Crawl是“org.apache.nutch.crawl.Crawl”的别称，它是一个完整的爬取和索引过程命令。<br>2.  Readdb <br>    Readdb命令是“org.apache.nutch.crawl.CrawlDbReader”的别称，返回或者导出Crawl数据库（crawldb）中的信息。 <br>3. readlinkdb <br>它是"org.apache.nutch.crawl.LinkDbReader"的别称，导出链接库中信息或者返回其中一个URL信息。 <br>4. inject <br>它是"org.apache.nutch.crawl.Injector"的别称，注入新URL到crawldb中。 <br>5. generate <br>它是“org.apache.nutch.crawl.Generator”，从Cra&nbsp;&nbsp;<a href='http://www.blogjava.net/kxx129/archive/2009/09/05/294000.html'>阅读全文</a><img src ="http://www.blogjava.net/kxx129/aggbug/294000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2009-09-05 16:55 <a href="http://www.blogjava.net/kxx129/archive/2009/09/05/294000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>iReport和JasperReport生成PDF文件中文字体问题</title><link>http://www.blogjava.net/kxx129/archive/2009/08/25/292518.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Tue, 25 Aug 2009 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2009/08/25/292518.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/292518.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2009/08/25/292518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/292518.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/292518.html</trackback:ping><description><![CDATA[下载iText的亚洲语言包iTextAsian.jar，加入classpath中。同时也放入到ireport的lib目录里。<br />
在ireport的Font选项中，PDF font name选择STSong-Light，PDF Encoding选择UniGB-UCS2-H。PDF Embedded选上。<br />
这样出来的PDF就能显示中文。
<img src ="http://www.blogjava.net/kxx129/aggbug/292518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2009-08-25 15:00 <a href="http://www.blogjava.net/kxx129/archive/2009/08/25/292518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SWT窗口居中</title><link>http://www.blogjava.net/kxx129/archive/2009/02/26/256908.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Thu, 26 Feb 2009 14:21:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2009/02/26/256908.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/256908.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2009/02/26/256908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/256908.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/256908.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ////<br>loginShell.setLocation(display.getClientArea().width / 2 - loginShell.getSize().x/2, display<br>                .getClientArea().height / 2 - loginShell.getSize().y/2);<br>////<br><br>////<br>Monitor primary = loginShell.getMonitor();<br>Rectangle bounds = primary.getBounds();<br>Rectangle rect = loginShell.getBounds();<br>int x = bounds.x + (bounds.width - rect.width) / 2;<br>int y = bounds.y + (bounds.height - rect.height) / 2;<br>if (x < 0)<br>	x = 0;<br>if (y < 0)<br>	y&nbsp;&nbsp;<a href='http://www.blogjava.net/kxx129/archive/2009/02/26/256908.html'>阅读全文</a><img src ="http://www.blogjava.net/kxx129/aggbug/256908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2009-02-26 22:21 <a href="http://www.blogjava.net/kxx129/archive/2009/02/26/256908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jar使用说明和JavaDoc的使用说明</title><link>http://www.blogjava.net/kxx129/archive/2008/04/18/194058.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Fri, 18 Apr 2008 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2008/04/18/194058.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/194058.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2008/04/18/194058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/194058.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/194058.html</trackback:ping><description><![CDATA[<p>Jar使用说明和JavaDoc的使用说明&nbsp; <br />
　 Jar使用说明</p>
<p><br />
功能说明： <br />
　　Java归档工具 </p>
<p>
<p>语法： <br />
　　jar [ 命令选项 ] [manifest] destination input-file [input-files] </p>
<p>补充说明： <br />
　　jar工具是个java应用程序，可将多个文件合并为单个JAR归档文件。jar是个多用途的存档及压缩工具，它基于ZIP和ZLIB压缩格式。然而，设计jar的主要目的是便于将java applet或应用程序打包成单个归档文件。将applet或应用程序的组件(.class 文件、图像和声音)合并成单个归档文件时，可以用java代理(如浏览器)在一次HTTP事务处理过程中对它们进行下载，而不是对每个组件都要求一个新连接。这大大缩短了下载时间。jar还能压缩文件，从而进一步提高了下载速度。此外，它允许applet的作者对文件中的各个项进行签名，因而可认证其来源。jar工具的语法基本上与tar命令的语法相同。</p>
<p>命令选项 <br />
　　-c 在标准输出上创建新归档或空归档。</p>
<p>　　-t 在标准输出上列出内容表。 </p>
<p>　　-x[file] 从标准输入提取所有文件，或只提取指定的文件。如果省略了file，则提取所有文件；否则只提取指定文件。 </p>
<p>　　-f 第二个参数指定要处理的jar文件。在-c(创建)情形中，第二个参数指的是要创建的jar文件的名称(不是在标准输出上)。在-t(表(或-x(抽取)这两种情形中，第二个参数指定要列出或抽取的jar文件。</p>
<p>　　-v 在标准错误输出设备上生成长格式的输出结果。 </p>
<p>　　-m 包括指定的现有清单文件中的清单信息。用法举例：&#8220;jar cmf myManifestFile myJarFile *.class&#8221;</p>
<p>　　-0 只储存，不进行 ZIP 压缩。 </p>
<p>　　-M 不创建项目的清单文件。 </p>
<p>　　-u 通过添加文件或更改清单来更新现有的 JAR 文件。例如：&#8220;jar -uf foo.jar foo.class&#8221;将文件 foo.class 添加到现有的JAR文件foo.jar中，而&#8220;jar umf manifest foo.jar&#8221;则用manifest中的信息更新foo.jar的清单。 </p>
<p>　　-C 在执行 jar 命令期间更改目录。例如：&#8220;jar -uf foo.jar -C classes *&#8221;将classes目录内的所有文件加到foo.jar中，但不添加类目录本身。 </p>
<p>程序示例 <br />
　　1:将当前目录下所有CLASS文件打包成新的JAR文件： <br />
　　jar cf file.jar *.class </p>
<p>　　2:显示一个JAR文件中的文件列表 <br />
　　jar tf file.jar </p>
<p>　　3:将当前目录下的所有文件增加到一个已经存在的JAR文件中 <br />
　　jar cvf file.jar * <br />
　</p>
<p>javadoc使用说明 </p>
<p><br />
功能说明 <br />
　　Java API文档生成器从Java源文件生成API文档HTML页。</p>
<p>语法： <br />
　　javadoc [ 命令选项 ] [ 包名 ] [ 源文件名 ] [ @files ] <br />
　　其中[ 包名 ]为用空格分隔的一系列包的名字，包名不允许使用通配符，如（*）。[ 源文件名 ]为用空格分隔的一系列的源文件名，源文件名可包括路径和通配符，如（*）。[ @files ]是以任何次序包含包名和源文件的一个或多个文件。 </p>
<p>补充说明 <br />
　　Javadoc解析Java源文件中的声明和文档注释，并产生相应的HTML页缺省），描述公有类、保护类、内部类、接口、构造函数、方法和域。 </p>
<p>　　在实现时，Javadoc要求且依赖于java编译器完成其工作。Javadoc调用部分javac编译声明部分，忽略成员实现。它建立类的内容丰富的内部表示，包括类层次和&#8220;使用&#8221;关系，然后从中生成HTML。Javadoc还从源代码的文档注释中获得用户提供的文档。 </p>
<p>　　当Javadoc建立其内部文档结构时，它将加载所有引用的类。由于这一点，Javadoc必须能查找到所有引用的类，包括引导类、扩展类和用户类。 </p>
<p>
<p>命令选项 <br />
　　-overview i&gt;path/filename 指定javadoc应该从path/filename所指定的&#8220;源&#8221;文件中获取概述文档，并将它放到概述页中（overview-summary.html）。其中path/filename 是相对于-sourcepath的相对路径名。 </p>
<p>　　-public 只显示公有类及成员。 </p>
<p>　　-protected 只显示受保护的和公有的类及成员。这是缺省状态。</p>
<p>　　-package 只显示包、受保护的和公有的类及成员。 </p>
<p>　　-private 显示所有类和成员。 </p>
<p>　　-help 显示联机帮助，它将列出这些javadoc和doclet命令行选项。 </p>
<p>　　-doclet class 指定启动用于生成文档的docle 的类文件。该doclet定义了输出的内容和格式。如果未使用-doclet选项，则javadoc使用标准doclet生成缺省HTML格式。该类必须包含start(Root)法。该启动类的路径由 -docletpath选项定义。 </p>
<p>　　-docletpath classpathlist 指定doclet类文件的路径，该类文件用-doclet选项指定。如果doclet已位于搜索路径中，则没有必要使用该选项。 </p>
<p>　　-1.1 生成具有用Javadoc 1.1生成的文档的外观和功能的文档。也就是说，页的背景为灰色，用图像做页眉，使用bullet列表而不是表格，具有单层目的目录结构，不包含继承 API，不使?*** TML框架，并且不支持内部类。该选项还自动将索引分割成每个字母一个文件。如果想要这种外观，则该选项比javadoc 1.1优越之处等于修正了一些错误。 </p>
<p>　　-sourcepath sourcepathlist <br />
　　当将包名传递到javadoc命令中时，指定定位源文件（.java）的搜索路径。注意只有当用 javadoc命令指定包名时才能使用sourcepath选项 -- 它将不会查找传递到javadoc命令中的.java文件。如果省略-sourcepath，则javadoc使用类路径查找源文件。 </p>
<p>　　-classpath classpathlist 指定javadoc将在其中查找引用类的路径 -- 引用类是指带文档的类加上它们引用的任何类。Javadoc将搜索指定路径的所有子目录。classpathlist可以包括多个路径，彼此用逗号分隔。</p>
<p>　　-bootclasspath classpathlist 指定自举类所在路径。它们名义上是Java平台类。这个bootclasspath是Javadoc将用来查找源文件和类文件的搜索路径的一部分。在 classpathlist中用冒号（:）分隔目录。</p>
<p>　　-extdirs dirlist 指定扩展类所在的目录。它们是任何使用Java扩展机制的类。这个 extdirs是Javadoc将用来查找源文件和在文件的搜索路径的一部分。在dirlist中用冒号（:）分隔目录。</p>
<p>　　-verbose 在javadoc运行时提供更详细的信息。不使用verbose选项时，将显示加载源文件、生成文档（每个源文件一条信息）和排序的信息。verbose选项导致打印额外的信息，指定解析每个java源文件的毫秒数。 </p>
<p>　　-locale language_country_variant 指定javadoc在生成文档时使用的环境。 </p>
<p>　　-encoding name 指定源文件编码名，例如EUCJIS/SJIS。如果未指定该选项，则使用平台缺省转换器。</p>
<p>　　-J[flag] 将flag直接传递给运行javadoc的运行时系统java。注意在J和flag之间不能有空格。 <br />
标准 Doclet 提供的选项 </p>
<p>　　-d directory 指定javadoc保存生成的HTML件的目的目录。省略该选项将导致把文件保存到当前目录中。其中directory可以是绝对路径或相对当前工作目录的相对路径。 </p>
<p>　　-use 对每个带文档类和包包括一个&#8220;用法&#8221;页。该页描述使用给定类或包的任何 API 的包、类、方法、构造函数和域。对于给定类 C，使用类 C 的任何东西将包括 C 的子类、声明为 C 的域、返回 C 的方法以及具有 C 类型参数的方法和构造函数。 </p>
<p>　　-version 在生成文档中包括 @version 文本。缺省地将省略该文本。 </p>
<p>　　-author 在生成文档中包括 @author 文本。 </p>
<p>　　-splitindex 将索引文件按字母分割成多个文件，每个字母一个文件，再加上一个包含所有以非字母字符开头的索引项的文件。 </p>
<p>　　-windowtitle[title] 指定放入 HTML <br />
　<br />
&nbsp;<br />
相关文章： <br />
&gt;&gt;Cookie的传递流程及安全问题 <br />
&gt;&gt;JAVA生成JPG缩略图 <br />
&gt;&gt;上传图片的缩放处理 <br />
&gt;&gt;学习JSP的一些心得.jsp <br />
&gt;&gt;怎样打包成可执行的jar文件.jsp <br />
&gt;&gt;开发晋级篇：Java性能优化技巧集锦 <br />
&gt;&gt;为何我写的邮件发送程序不能正确发送邮件？ <br />
&gt;&gt;一个邮件发送的API（可以带附件和群发） <br />
&nbsp;</p>
<p>JavaDoc命令使用说明</p>
<p>作者：未知&nbsp;&nbsp;&nbsp; 转贴自：网络收藏&nbsp;&nbsp;&nbsp; 点击数：25</p>
<p>&nbsp;</p>
<p>javadoc的命令行语法如下：<br />
javadoc [ options ] [ packagenames ] [ sourcefiles ] [ @files ]<br />
参数可以按照任意顺序排列。下面分别就这些参数和相关的一些内容进行说明： <br />
&#8226; Packagenames 包列表。这个选项可以是一系列的包名（用空格隔开），例如java.lang java.lang.reflect java.awt。不过，因为javadoc不递归作用于子包，不允许对包名使用通配符；所以你必须显示地列出希望建立文档的每一个包。<br />
&#8226; Sourcefiles 源文件列表。这个选项可以是一系列的源文件名（用空格隔开），可以使用通配符。javadoc允许四种源文件：类源代码文件、包描述文件、总体概述文件、其他杂文件。<br />
◇ 类源代码文件：类或者接口的源代码文件。<br />
◇ 包描述文件：每一个包都可以有自己的包描述文件。包描述文件的名称必须是package.html，与包的.java文件放置在一起。包描述文件的内容通常是使用HTML标记写的文档。javadoc执行时将自动寻找包描述文件。如果找到，javadoc将首先对描述文件中之间的内容进行处理，然后把处理结果放到该包的Package Summary页面中，最后把包描述文件的第一句（紧靠）放到输出的Overview summary页面中，并在语句前面加上该包的包名。<br />
◇ 总体概述文件：javadoc可以创建一个总体概述文件描述整个应用或者所有包。总体概述文件可以被任意命名，也可以放置到任意位置。-overview选项可以指示总体概述文件的路径和名称。总体概述文件的内容是使用HTML标记写的文档。javadoc在执行的时候，如果发现-overview选项，那么它将首先对文件中之间的内容进行处理；然后把处理后的结果放到输出的Overview summary 页面的底部；最后把总体概述文件中的第一句放到输出的Overview summary页面的顶部。<br />
◇ 其他杂文件：这些文件通常是指与javadoc输出的HTML文件相关的一些图片文件、Java源代码文件（.java）、Java程序（.class）、Java小程序（Applets）、HTML文件。这些文件必须放在doc-files目录中。每一个包都可以有自己的doc-files目录。举个例子，你希望在java.awt.Button的HTML文档中使用一幅按钮的图片（Button.gif）。首先，你必须把图片文件放到C:usersrcjavaawtdoc-files中；然后在Button.java文件中加入下面注释<br />
/**<br />
* This button looks like this: <br />
* <br />
*/<br />
&#8226; @files 包含文件。为了简化javadoc命令，你可以把需要建立文档的文件名和包名放在一个或多个文本文件中。例如，为了简化下面命令：<br />
javadoc -d apidoc com.mypackage1 com.mypackage2 com.mypackage3<br />
你可以建立一个名称为mypackage.txt的文件，其内容如下：<br />
com.mypackage1<br />
com.mypackage2<br />
com.mypackage3<br />
然后执行下面命令即可：<br />
javadoc -d apidoc @mypackage.txt<br />
&#8226; options 命令行选项。javadoc使用doclets（doclets是指用doclet API编写的程序。）来确定输出的内容和格式。命令行选项中一部分是可用于所有doclet的通用选项，一部分是由默认的标准doclet提供的专用的选项。下面对各自一些常用的选项分别进行介绍：<br />
通用选项：<br />
◇ -1.1 生成具有javadoc 1.1版本生成的文档的外观和功能的文档。不是所有的选项都可以用于-1.1选项，具体可以使用javadoc -1.1 -help察看。<br />
◇ -help 显示联机帮助。<br />
◇ -bootclasspath classpathlist 指定根类（通常是Java平台自带的一些类。例如java.awt.*等）的路径。<br />
◇ -sourcepath sourcepathlist 指定包的源文件搜索路径。但是必须注意，只有在javadoc命令中指定了包名的时候才可以使用-sourcepath选项。如果指定了包名，而省略了-sourcepath，那么javadoc使用类路径查找源文件。举例说明：假定你打算为com.mypackage建立文档，其源文件的位置是C:usersrc。那么你可以使用下面的命令：<br />
javadoc -sourcepath c:usersrc com.mypackage <br />
◇ -classpath classpathlist 指定javadoc查找引用类的路径。引用类是指带文档的类加上它们引用的任何类。javadoc将搜索指定路径的所有子目录。Classpathlist可以包含多个路径（使用;隔开）。如果省略-classpath，则javadoc使用-sourcepath查找源文件和类文件。举例说明：假定你打算为com.mypackage建立文档，其源文件的位置是C:usersrc，包依赖C:userlib中的库。那么你可以使用下面的命令：<br />
javadoc -classpath c:userlib -sourcepath c:usersrc com.mypackage<br />
◇ -overview pathfilename 告诉javadoc从pathfilename所指定的文件中获取概述文档，并且把它放到输出的概述页面（overview-summary.html）中。其中pathfilename是相对于-sourcepath的相对路径。<br />
◇ -public 只显示公共类以及成员。<br />
◇ -protected 只显示受保护的和公共的类以及成员。缺省选项。<br />
◇ -package只显示包、受保护的和公共的类以及成员。<br />
◇ -private 显示所有类和成员。 <br />
◇ -doclet class 指定javadoc产生输出内容的自定义doclet类。如果忽略这个选项，javadoc将使用默认的doclet产生一系列HTML文档。<br />
◇ -docletpath classpathlist 与- doclet选项相关，制定自定义的doclet类文件的路径。Classpathlist可以包含多条路径（用;隔开）。<br />
◇ -verbose 在javadoc运行时提供更详细的信息。<br />
标准doclet专用选项：<br />
◇ -author 在生成的文档中包含作者项。<br />
◇ - d directory 指定javadoc保存生成的HTML文件的目录。省略该选项将把文件保存在当前目录。Directory可以是绝对目录，也可以是相对当前目录的相对目录。<br />
◇ -version 在生成的文档中包含版本项。<br />
◇ -use 为类和包生成use（用法）页面。这些页面描述了该类和包在javadoc命令涉及的文件中被使用的情况。例如：对于给定的类C，在C的用法页面中将包含C的子类，类型为C的域，返回变量类型为C的方法以及在参数中有变量类型为C的方法和构造器。<br />
◇ -splitindex 把索引文件按照字母顺序分为多个文件。每一个文件对应一个字母。<br />
◇ -windowtitle title 指定输出的HTML文档的标题。<br />
◇ -header header 指定输出的HTML文档的页眉文本。<br />
◇ -footer footer 指定输出的HTML文档的脚注文本。<br />
◇ -bottom text 指定输出的HTML文档底部的文本。<br />
◇ - group groupheading packagepatten;packagepatten;&#8230; 在总体概述页面中按照命令的指定方式分隔各个包。例如执行下面命令：<br />
javadoc -group Core Packages java.lang*:java.util<br />
-group Extension Packages javax.*<br />
java.lang java.lang.reflect java.util javax.servlet java.new<br />
在页面中将有如下结果：<br />
Core Packages <br />
java.lang <br />
java.lang.reflect <br />
java.util <br />
Extension Packages <br />
javax.servlet <br />
Other Packages <br />
java.new <br />
◇ - noindex 不输出索引文件。<br />
◇ - help 在文件的导航条中忽略help链接。<br />
◇ - helpfile pathfilename 指定导航条中的help链接所指向的帮助文件。忽略该选项，javadoc将生成缺省的帮助文件。<br />
◇ -stylesheetfile pathfilename 指定javadoc的HTML样式表文件的路径。忽略该选项，javadoc将自动产生一个样式表文件stylesheet.css。<br />
JavaDoc文档标记<br />
javadoc注释以/**开始，以*/结束，里面可以包含普通文本、HTML标记和javadoc标记。javadoc只处理源文件中在类/接口定义、方法、域、构造器之前的注释，忽略位于其他地方的注释。举例如下：<br />
/**<br />
*Demo--Helloworld<br />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#97;&#117;&#116;&#104;&#111;&#114;">*@author</a> sunjl<br />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#118;&#101;&#114;&#115;&#105;&#111;&#110;">*@version</a> 1.0 2001/10/15<br />
*/<br />
public class myHelloworld<br />
{<br />
/**<br />
*在main( )方法中使用的显示用字符串<br />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#115;&#101;&#101;">*@see</a> #main(java.lang.String[])<br />
*/<br />
static String SDisplay; <br />
/**<br />
*显示HelloWorld<br />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#112;&#97;&#114;&#97;&#109;">*@param</a> args 从命令行中带入的字符串<br />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#114;&#101;&#116;&#117;&#114;&#110;">*@return</a> 无<br />
*/<br />
public static void main(String args[])<br />
{<br />
SDisplay = Hello World ;<br />
System.out.println( SDisplay );<br />
}<br />
}</p>
<p>使用下面命令：<br />
javadoc -private -d doc -author -version myHelloworld.java<br />
即可以生成漂亮的关于myHelloworld.java的API文档了。<br />
上面例子中以@开头的标记就是javadoc标记。在Java程序中正确使用javadoc标记是一个良好的注释习惯，将非常有助于javadoc自动从源代码文件生成完整的格式化API文档。下面就对各种标记进行详细说明。<br />
◇ @author name-text 指定生成文档中的作者项，从JDK/SDK 1.0开始引入。name-text可以指定多个名字（使用,隔开）。文档注释可以包含多个类。<br />
◇ <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#55;&#66;&#64;&#100;&#111;&#99;&#114;&#111;&#111;&#116;">{@docroot</a>} 代表产生文档的根路径，从JDK/SDK 1.3开始引入。用法举例如下<br />
/**<br />
*see the copyright<br />
*/<br />
假定生成文档的根目录是doc，上面注释所在的文件最后生成的文件是docutilityutl.html，那么copyright的链接会指向..copyright.html。<br />
◇ @deprecated deprecated-text 添加注释，表明不推荐使用该API。<br />
◇ @exception class-name description @throw的同义标记，从JDK/SDK 1.0开始引入。<br />
◇ <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#55;&#66;&#64;&#108;&#105;&#110;&#107;">{@link</a> package.class#member label} 插入指向package.class#member的内嵌链接，从JDK/SDK 1.2开始引入。举例说明，假定注释中有如下文档：<br />
/** Use the <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#55;&#66;&#64;&#108;&#105;&#110;&#107;">{@link</a> #getComponentAt(int, int) getComponentAt} method. */<br />
那么javadoc最终生成的HTML页面中将有如下内容<br />
Use the getComponentAt method.<br />
◇ @param parameter-name description 描述参数，从JDK/SDK 1.0开始引入。<br />
◇ @return description 描述返回值，从JDK/SDK 1.0开始引入。<br />
◇ @see reference 添加参见标题，其中有指向reference的链接或者文本项，从JDK/SDK 1.0开始引入。@see标记有三种形式，下面分别说明：<br />
（1）、@see string 为string添加文本项，不产生链接。<br />
（2）、@see Label 使用HTML标记产生链接<br />
（3）、@see package.class#member Label 使用Java语言的名字package.class #member产生链接。<br />
◇ @serial field-description 用于缺省可序列化域的注释，从JDK/SDK 1.2开始引入。<br />
◇ @serialField field-name field-type field-description 建立Serializable类的serialPersistentFields成员的ObjectStreamField组件的文档，从JDK/SDK 1.2开始引入。<br />
◇ @serialData data-description data-description建立数据序列和类型的文档，从JDK/SDK 1.2开始引入。<br />
◇ @since since-text 利用since-text内容为文档增加since标题，从JDK/SDK 1.1开始引入。<br />
◇ @throws class-name description 与@exception同义。用class-name和description为输出文档添加抛出标题，从JDK/SDK 1.2开始引入。<br />
◇ @version version-text 添加版权标题，从JDK/SDK 1.0开始引入。<br />
上面介绍了标准doclet提供的所有标记。不过，需要注意这些标记的使用是有位置限制的。其中可以出现在类或者接口文档注释中的标记有：@see、<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#55;&#66;&#64;&#108;&#105;&#110;&#107;">{@link</a>}、@since、@deprecated、@author、@version。可以出现在方法或者构造器文档注释中的标记有：@see、<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#55;&#66;&#64;&#108;&#105;&#110;&#107;">{@link</a>}、@since、@deprecated、@param、@return、@throws、@exception、@serialData。可以出现在域文档注释中的有：@see、<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#55;&#66;&#64;&#108;&#105;&#110;&#107;">{@link</a>}、@since、@desprecated、@serial、@serialField。<br />
除了javadoc自身提供的标准标记以外，我们可以定制自己的标记吗？当然可以。只需要对javadoc标准的doclet程序进行扩充即可。实际上，利用javadoc提供的doclet API，不仅可以扩充doclet标记，甚至还可以改变javadoc的整个输出。为了满足需要，你可以使javadoc输出普通文本、XML文件等。由于扩充doclet涉及到Java编程，本文不再做深入介绍。<br />
总之，javadoc提供了完整规范的API文档功能。在软件项目管理中，合理地使用javadoc不仅可以减少开发时的文档工作量，提高效率；而且还非常有利于将来软件的修改和维护。<br />
JavaDoc 书写规范：<br />
1、 File Header Comments : 每个文件都应该加上文件头标记，包括文件名、修改历史、版权信息和附加信息。例如：</p>
<p>/**<br />
* @(#)demo.java 1.00 2002/05/27<br />
*<br />
* Copyright (c) 2000-2002 中国平安保险股份有限公司 版权所有<br />
* Ping An Insurance Company of China. All rights reserved.</p>
<p>* This software is the confidential and proprietary <br />
* information of Ping An Insurance Company of China. <br />
* (Confidential Information). You shall not disclose <br />
* such Confidential Information and shall use it only<br />
* in accordance with the terms of the contract agreement <br />
* you entered into with Ping An.<br />
*/</p>
<p>2、class description:类信息，概括的描述类的功能和实现。<br />
/** class description<br />
*/<br />
3、Variable Description:描述变量的意义和取值含义。<br />
/** var variable description<br />
*/<br />
4、Method Description:标明每个方法的输入、输出参数和返回值类型，说明特殊变量取值的含义。相关类文档链接。<br />
/** method description<br />
* @param var signification<br />
* @exception exception class name<br />
* @return return_value return signification<br />
*/</p>
<p>5、Association Description:关联类文档描述，在注释当中需要参引其它文档描述的地方，可在相应的注释当中如下插入：<br />
/** method description<br />
* @param var signification<br />
* @exception exception class name<br />
* @return return_value return signification<br />
* @see package.class#member label<br />
*/<br />
6、包描述文件：概括描述包的功能和设计概要。为每个包创建一个描述文件，命名为package.html，与包的java文件放在一起。<br />
注：javadoc生成文档时，会将该html文件的第一句放在package summary中，而把整个内容放在Overview summary中.<br />
<br />
转载自:<a href="http://auuppp.bokee.com/6172069.html" title="Jar使用说明和JavaDoc的使用说明">Jar使用说明和JavaDoc的使用说明</a><img src ="http://www.blogjava.net/kxx129/aggbug/194058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2008-04-18 16:24 <a href="http://www.blogjava.net/kxx129/archive/2008/04/18/194058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>iReport制作报表</title><link>http://www.blogjava.net/kxx129/archive/2008/04/08/191425.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Tue, 08 Apr 2008 03:59:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2008/04/08/191425.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/191425.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2008/04/08/191425.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/191425.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/191425.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;文章将会涉及3个方面的内容： </p>
<p style="text-indent: 2em">第一部分：使用iReport制作报表的详细过程（Windows环境下）</p>
<p style="text-indent: 2em">第二部分：使用Jasperreport作为报表控件开发胖客户端报表应用</p>
<p style="text-indent: 2em">第三部分：使用Jasperreport作为报表控件开发Web报表应用 </p>
<p style="text-indent: 2em"><strong>第一部分：使用iReport制作报表的详细过程（Windows环境下）</strong></p>
<p style="text-indent: 2em">1、前言</p>
<p style="text-indent: 2em">在网络上可以搜索到很多使用iReport和Jasperreport配合实现各种报表任务的文章，但是我觉得很少有一篇（几乎没有）做一个比较详细的介绍如何使用iReport制作报表的全过程，我所看过的文章的基本思想是覆盖面广，很多内容都是提及即过，并不是开发人员都有时间为每个实践花费时间自己实现，如果能有更详细的资料，那岂不是一件乐事。出于这个念头促使我写这篇文章，希望能对那些使用iReport和Jasperreport朋友有所帮助，特别是需要亲身去实现报表的朋友，希望能给你们带来一点帮助。本文不是对iReport的每个细节进行介绍，关于iReport的每个细节可以参考iReport网站的资料，但是可能得花费一些费用。一般用户没有必要付出这些费用，因为我们关心的是如何制作我们需要的报表，而不是去扩展iReport，比如制作iReport的插件。</p>
<p style="text-indent: 2em">2、准备</p>
<p style="text-indent: 2em">2.1、下载JDK</p>
<p style="text-indent: 2em">地址：<a href="http://www.sun.com/">http://www.sun.com</a>，选择1.3以上版本（建议1.4.2以上版本），安装JDK，默认安装即可；如果你的系统已经有安装过JDK或是有JRE即可省略这一步骤，验证JDK或是JRE是否可以默认运行，在命令行（CMD）打入X:&gt;java 如果出现：Usage：java&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..开头的一堆信息既是通过验证。否则必须进行配置，配置信息如下，在windows的环境变量设置：</p>
<p style="text-indent: 2em">path：在最后面加入&#8220;;java的安装目录&#8221;</p>
<p style="text-indent: 2em">JAVA_HOME ：&#8220;java的安装目录&#8221;</p>
<p style="text-indent: 2em">CLASSPATH：&#8220;java的安装目录\bin&#8221;</p>
<p style="text-indent: 2em">重新验证JDK或是JRE是否可以在CMD任何位置运行</p>
<p style="text-indent: 2em">2.2、下载iReport</p>
<p style="text-indent: 2em">地址：<a href="http://ireport.sourceforge.net/">http://ireport.sourceforge.net/</a>，选择0.3.2版本（发稿之前为止建议使用的版本）解压iReport在任意目录，解压后的文件里面有一个iReport.bat，通过双击，过大约30秒钟如果可以弹出iReport的主窗体即表明你的系统已经可以运行iReport了，如果不能弹出主窗体，一般是第一步骤错误，或是没有完成。</p>
<p style="text-indent: 2em">2.3、准备数据库</p>
<p style="text-indent: 2em">iReport支持绝大部分数据库，只要该数据库能提供JDBC驱动器。本文提供MySql数据库作为例子，但是文章最后会提到如何配置Oracle的支持。关于数据库的安装和建立表不属于本文的范围，请参考其他资料。本文假设已经安装了MySql和在MySql已经有一些表，并且确定表中已经有数据了。</p>
<p style="text-indent: 2em">*【特别提示】MySql的版本要求与iReport文件夹下的Lib目录的使用MySql驱动程序兼容，笔者建议到 <a href="http://www.mysql.org/">http://dev.mysql.com/downloads/</a> 下载最新版本mysql的驱动器，这样就不会应为JDBC驱动器的问题而当心数据库的支持问题。</p>
<p style="text-indent: 2em">2.4、启动MySql服务</p>
<p style="text-indent: 2em">确定Mysql使用的的字符集是重要的问题，特别是对需要中文报表的朋友，应该特别注意这个问题。 </p>
<p style="text-indent: 2em">2.5、确定商务逻辑</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也就是希望完成什么样的报表任务。需要实现的报表的详细描述，这是实现报表的业务条件，否则所有的任务绝大部分没有意义。本文使用一个Bug记录表为例，本文的例子是制作一个根据项目和项目中的模块分组的Bug量统计。</p>
<p style="text-indent: 2em">3、开始配置基本信息</p>
<p style="text-indent: 2em">3.1、配置界面使用的语言和报表输出路径</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一次进入系统是英文环境，可以通过【Tools】－【Options】开启配置iReport系统的基本信息对话框。在&#8220;Language&#8221;选项里面选择你需要的界面语言，比如&#8220;中文－中国&#8221;。点击【Apply】按钮，系统既把整个界面中文化。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在配置iReport系统的基本信息对话框中选择【编译】Label，之后决定你的报表输出路径，可以把&#8220;编译在报表数据文件夹&#8221;选择打勾，这样报表的jrxml文件和jasper文件就放置同一文件夹。（在新建报表时会要求你把jrxml文件保存到指定的文件夹）</p>
<p style="text-indent: 2em">【Options】选项中的一部分参数修改不能通过【Apply】按钮直接起作用，比如&#8220;Look&amp;Feel&#8221;，必须重新启动iReport才能起作用。不知道是不是iReport的Bug？！最后【存档】。</p>
<p style="text-indent: 2em">3.2、配置MySql的数据库连接</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这就是报表与数据库的接口。可以通过【资料来源】－【连接/资料来源】开启配置列表对话框，iReport会记录以前使用的所有连接，除非你手工删除这些连接，否则所有的连接都会存在连接/资料来源配置列表对话框中，不管是否确实可用。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击【New】进入配置新连接界面，如图：</p>
<p style="text-indent: 2em"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/jemlee2002/51118/o_1.JPG" border="0" /></p>
<p style="text-indent: 2em">填写JDBC连接需要的信息，iReport支持多种数据源连接，如图：</p>
<p style="text-indent: 2em"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/jemlee2002/51118/o_2.JPG" border="0" /></p>
<p style="text-indent: 2em">本文只是介绍DataBase JDBC Connection连接方式，这也是最常用的方式，特别是在嵌入式报表应用。所有的信息填写并测试通过之后，最后就是保存信息。回到配置列表对话框，关闭对话框，完成MySql数据库JDBC连接配置。</p>
<p style="text-indent: 2em">提示：如果你需要报表提供中文内容显示可以在JDBC URL下工夫，比如输入：</p>
<p style="text-indent: 2em">jdbc:mysql://localhost/SUBRDB?user=****&amp;password=****&amp;useUnicode=true&amp;characterEncoding=GB2312</p>
<p style="text-indent: 2em">其中的****号替换成数据库的用户合密码。</p>
<p style="text-indent: 2em">3.3、新建一个空报表的基本配置</p>
<p style="text-indent: 2em">单击工具栏的第一个工具&#8220;New Report&#8221;，新建一个报表，输入报表名称和定义报表的一些参数，比如名称输入BugsRpt（例子是做一个项目的Bug量统计报表）,单击【More&#8230;.】选择标签，填写或是选择XML编码，这是关系到你的XML支持的字符集的选择，请根据需要选择，比如需要你的XML文件支持中文，那么可以输入GB2312或是GBK，之后点击【OK】按钮，进入报表的设计界面。</p>
<p style="text-indent: 2em">*【特别提示】请在开始任何工作之前保存报表，这时iReport提示保存报表的位置，选择合适的位置之后输入BugsRpt作为名称。</p>
<p style="text-indent: 2em">3.4、定义报表可能需要的字体类型及其属性</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个报表的内容五花八门，有表头、栏位名、数据、其他变量信息等等，如果这些信息都是一致的字体和属性（比如颜色），那么整个报表就死气沉沉，显得很粗糙了。我们可以在为报表添加每个元素时定义元素的属性，但是那是一个多么费时的工作，如果能预先定义一些属性的组合，之后在创建每个元素时只需选择这些组合的其中一个即可，省事又快速。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单击【预览】－【报表字体】开启自定义组合对话框。单击【New】进入定义详细对话框，如图：按照图中的顺序填写信息和步骤，依次定义&#8220;表头&#8221;、&#8220;组&#8221;、&#8220;列&#8221;、&#8220;列内容&#8221;、&#8220;统计计算&#8221;、&#8220;其他&#8221;等6中字体组合。注意PDF内嵌字体的选择，如果你需要报表时以PDF文件格式提供，那么对此需要作出选择。</p>
<p style="text-indent: 2em"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/jemlee2002/51118/o_3.JPG" border="0" /></p>
<p style="text-indent: 2em">4、理解几个重要的概念</p>
<p style="text-indent: 2em">4.1、iReport的输出格式</p>
<p style="text-indent: 2em">iReport的预览输出格式可以支持以下几种：</p>
<p style="text-indent: 2em">PDF、HTML、CSV、JAVA2D、Excel、纯文字、JRViewer，其中最常用的是PDF、JRViewer。本文以JRViewer为例子。JRViewer是直接以C/S方式作为报表的输出格式，在JFrame框架下输出。Jasperreport提供默认的JRViewer输出类。</p>
<p style="text-indent: 2em">4.2、报表的动态对象变量、参数、字段</p>
<p style="text-indent: 2em">在使用iReport的过程中会碰到很多与变量（Variables）、参数（Parameters）、字段（Fields）这些有关的内容，我们要介绍这些对象的使用和意义：</p>
<p style="text-indent: 2em">&#183;字段（Fields）：是数据库抽取出来的，希望在报表中出现的数据库内容。比如一个ID的所有值。$F{ filedsName }</p>
<p style="text-indent: 2em">&#183;参数（Parameters）：这是你的应用需要提供给报表的入口，比如你希望在报表被解释的时候提供Where语句的条件值，那么就可以使用参数（Parameters）。$P{ parameterName }</p>
<p style="text-indent: 2em">&#183;变量（Variables）：这是报表中一些逻辑运算的表现，比如统计值。$V{ variablesName }</p>
<p style="text-indent: 2em">每种对象的定义格式如每个对象的后面说明，比如定义一个变量（Variables），那么表达式就写成$V{ variablesName }，报表中出现的就是这个变量的名称。后文会详细的介绍使用方法。</p>
<p style="text-indent: 2em">4.3、编译、静态运行、动态运行</p>
<p style="text-indent: 2em">Jasperreport运行时需要的就是一个jasper后缀的文件，编译过程其实就是把jrxml后缀的文件生成jasper后缀的文件。（可以参考Jasperreport的运行原理）</p>
<p style="text-indent: 2em">静态运行和动态运行是相对的，后者带数据源运行，比如带数据库运行。前者就是静态文本运行，和数据源无关，如果报表中出现和数据源有关的对象，则以null显示。</p>
<p style="text-indent: 2em">4.4、报表结构</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个报表的结构大致是几个部分：title、pageHeader、columnHeader、detial、columnFooter、pageFooter、summary、groupHeader、groupfooter。</p>
<p style="text-indent: 2em">&#183;Title：每个报表一般会有一个名字，比如&#215;&#215;&#215;销售报表，title就是搁置这个名称的最好地方了，当然你也可以根据需要搁置在合适的地方。</p>
<p style="text-indent: 2em">&#183;pageHeader：报表的一些公共要素，比如页码、创建时间、创建人等信息放置在这里是比较好的选择。</p>
<p style="text-indent: 2em">&#183;columnHeader：无可非议的这里是放置列的名称，记住不是列数据。</p>
<p style="text-indent: 2em">&#183;Detial：放置需要循环的数据，比如销售记录数据。</p>
<p style="text-indent: 2em">&#183;columnFooter：放置列级别的统计计算值或是列的说明。</p>
<p style="text-indent: 2em">&#183;pageFooter：放置页级别的统计值或是页的说明。</p>
<p style="text-indent: 2em">&#183;Summary：可能需要对几页（你的报表可能有几个页组成）的统计值。比如50个销售记录共占用了3页，那么放置这些统计记录的统计值最好的地方就是summary。</p>
<p style="text-indent: 2em">&#183;groupHeader：每个表的内容可能需要根据某个属性进行划分显示内容和计算内容，比如希望以月份为单位每组分开显示销售记录，那么就可以定义一个组（组的定义参考后文），groupHeader就是放置组说明或是组标志最好的地方。</p>
<p style="text-indent: 2em">&#183;Groupfooter：放置组的统计或是说明</p>
<p style="text-indent: 2em">5、向表添加对象</p>
<p style="text-indent: 2em">5.1、添加静态对象</p>
<p style="text-indent: 2em">可以通过工具栏的工具添加静态对象，比如文本，点击【<em>T</em>】，之后在报表的空白处单击，如此即可把静态对象添加到报表，然后拖动对象的边框，使它的大小合适，双击对象弹出对象的属性配置对话框，切换到【Font】Label，在&#8220;Report font&#8221;的ComBox选择&#8220;表头&#8221;字体，（表头字体是前文提供的自定义属性组合），再切换到【Static Text】Label，修改表头的名字，比如&#8220;Bug统计报表&#8221;或是&#8220;销售记录统计表&#8221;等等与业务有关的内容。添加图片，请点击【Image Tool】，之后的操作与Text类似。其他静态对象操作步骤类似。</p>
<p style="text-indent: 2em">5.2、使用连接</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 还记得前文提供的（3.2节）配置MySql数据库连接吗？这里我们将要使用前文配置的连接了。选择菜单【建立】－【使用动态连接】开启可选的动态连接，选择任何一个你需要的连接最后【OK】，保存报表，这样你的报表就使用了这个连接了。</p>
<p style="text-indent: 2em">*【特别提示】此连接必须与以后应用程序使用的连接一致。</p>
<p style="text-indent: 2em">5.3、创建SQL查询语句</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SQL语句是对任何RDBMS起作用的语言，外部用户需要使用这些语言管理维护数据库中的数据，同样的，iReport也是需要这么做，我们需要提供查询数据库的语言－SQL语句，这样，iReport即可通过此SQL语句获取数据，之后组织到报表中并显示出来，以满足用户的需要为目的。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过菜单【资料来源】－【报表查询】开启SQL输入对话框，并在【Report SQL Query】 Label中输入SQL语句如图：图中的&#8220;Automatically Retrieve Fields&#8221;checkbox和&#8220;ReadFields&#8221;Button是确认自动获取还是手动获取数据库表的可用Fields。单击【OK】，保存报表。</p>
<p style="text-indent: 2em"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/jemlee2002/51118/o_4.JPG" border="0" /></p>
<p style="text-indent: 2em">5.4、创建字段动态对象</p>
<p style="text-indent: 2em">报表的动态对象有变量、参数、字段，前文提及了他们的概念，这里将要一一讲解如何使用。</p>
<p style="text-indent: 2em">字段也就是数据库中的字段，通过菜单【预览】－【报表字段】开启字段的列表（工具条上可以找到相应的工具），可以拖放任意字段到报表的任何位置，比如拖动一部分Bug的内容字段到detial段（内容无关紧要，只要知道原理）。</p>
<p style="text-indent: 2em">5.5、创建组</p>
<p style="text-indent: 2em">组是一个很重要的概念，一个报表可以多个组，每个组以一个关键字为标记，比如希望Bug统计是根据项目（或是产品）进行统计的。那么可以设立一个项目标记的组。如图：</p>
<p style="text-indent: 2em"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/jemlee2002/51118/o_5.JPG" border="0" /></p>
<p style="text-indent: 2em">组的参数设定可以看界面即可理解部分，其中最主要的是&#8220;Group expression&#8221;，这是必须输入格式正确的并且存在的字段名称，本文的&#8220;proname&#8221;是【字段】中的一个元素。依此类推，建立其他的组对象。每建立一个组，在报表的界面上都会出现该组对应的段，如图：至于他们的意义和容纳的内容参考&#8220;4.4报表结构&#8221;，他们是首尾对应出现的。（Header和Footer）</p>
<p style="text-indent: 2em"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/jemlee2002/51118/o_6.JPG" border="0" /></p>
<p style="text-indent: 2em">5.6、添加参数和使用参数</p>
<p style="text-indent: 2em">我们重申参数作用，一般是需要外界提供参数给报表的入口，比如SQL语句的where条件的表达式。通过【预览】－【报表参数】开启报表参数列表对话框（工具条上可以找到相应的工具）。如图：输入名称及其他参数。【ok】,保存报表。</p>
<p style="text-indent: 2em"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/jemlee2002/51118/o_7.JPG" border="0" /></p>
<p style="text-indent: 2em">那么如何使用呢？打开SQL语句对话框，参考&#8220;5.3创建SQL查询语句&#8221;，这时候的SQL语句应该是：</p>
<p style="text-indent: 2em">SELECT *</p>
<p style="text-indent: 2em">FROM bugs&nbsp; where proname=$P{ProjectName} order by proname,modulename</p>
<p style="text-indent: 2em">注意其中的红体字部分，就是把刚才定义的变量运用到SQL语句了。这样当应用提供参数时，只要指定提供给这个参数，那么报表解释引擎即可替换这些变量然后再执行SQL语句，在第二部分提到编程时，会提供参数设定代码。</p>
<p style="text-indent: 2em">5.7、添加变量和使用变量</p>
<p style="text-indent: 2em">变量的定义类似参数，通过【预览】－【报表变量】开启报表变量列表对话框（工具条上可以找到相应的工具），如图，图中定义的变量的作用是：定义一个Bug的计数器，数据类型是java.lang.Integer,使用Count函数进行统计字段tester，作用范围是模块组，也就是统计模块的Bug量。其中的tester可以改成其他非组对象，比如proname是组对象，就不要用作这里的统计参数。以上提供的是自定义变量，其实iReport系统还有提供一些内嵌（Buildin）的变量，比如页码，行记录数等，视需要而使用。</p>
<p style="text-indent: 2em"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/jemlee2002/51118/o_8.JPG" border="0" /></p>
<p style="text-indent: 2em">6、最后的报表</p>
<p style="text-indent: 2em">6.1、完成后的报表</p>
<p style="text-indent: 2em"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/jemlee2002/51118/o_9.JPG" border="0" /></p>
<p style="text-indent: 2em">6.2、预览报表</p>
<p style="text-indent: 2em">点击动态运行报表，出现如图内容：</p>
<p style="text-indent: 2em"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/jemlee2002/51118/o_10.JPG" border="0" /></p>
<p style="text-indent: 2em">7、总结</p>
<p style="text-indent: 2em">第一部分只是介绍了如何制作一个动态数据报表，其实iReport还有提供很多的特性供开发人员使用，比如柱状图、饼图、及各种形状的图形等，满足企业绝大部分应用的需求。希望你能继续研究并充分利用。&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;关于使用Oracle数据库作为数据源的内容：提供与使用的Oracle版本对应的JDBC驱动，把驱动放置在iReport的lib目录，配置数据库的JDBC连接时如图：其它操作基本没有区别。</p>
<p style="text-indent: 2em"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/jemlee2002/51118/o_11.JPG" border="0" /></p>
<p style="text-indent: 2em">8、补充内容</p>
<p style="text-indent: 2em">8.1、实现表格</p>
<p style="text-indent: 2em">可以在Detial中加入必要线条实现表格，配合columnFooter、columnHeader、Detial这3个位置实现，您可以试试画线的位置！</p>
<p style="text-indent: 2em"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/jemlee2002/51118/o_12.JPG" border="0" /><strong>第二部分：使用Jasperreport作为报表控件开发胖客户端报表应用</strong> </p>
<p style="text-indent: 2em">1、概述</p>
<p style="text-indent: 2em">我们对第一部分的内容做个简要的回忆，第一部分主要是介绍使用iReport如何制作一个数据报表，我认为文章比较详细的介绍&#8220;如何从零到满足大部分需求报表出现&#8221;。但是文中没有涉及Jasperreport的任何内容，目的是让你纯粹的理解如何做报表，因为做报表和把报表内嵌到应用程序编程是可以分工的，便于整合也便于分解。</p>
<p style="text-indent: 2em">我们知道iReport是一个Jasperreport的前端开发工具，iReport用来制作和预览报表，为应用使用报表提供足够的前端支持。现在简要的介绍Jasperreport是如何工作的，这样你可以更好的理解iReport是如何帮助Jasperreport实现前端的工作，其实这些工作在我们看来就是&#8220;脏活&#8221;，为什么呢？看看下面的资料就知道了。</p>
<p style="text-indent: 2em"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/jemlee2002/51118/o_2-1.JPG" border="0" /></p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过上图你大概已经明白Jasperreport的工作原理了。首先是要有一个XML文件（一般是以jrxml后缀），那么这个XML文件从那里来呢？做什么用呢？ 这个XML文件就是报表的定义文件，整个报表的每一个细节都在这个XML文件之中定义，一个简单报表的xml文件就有几百行，你可以手工编辑这个XML文件（一行一行，一段一段的编辑吧――这就是所谓的&#8220;脏活&#8221;）。如果是手工制作这个XML文件，单从效率上考虑就不允许，特别是现在很多应用系统的开发时间变得越来越紧张，总是会在时间上出问题。节省时间最好的办法就是充分的利用自动化工具，詹姆斯.马丁的软件工程思想也是反复的强调过程的自动化，如何做到自动化呢？就是充分的利用自动化工具集成到开发流程，说了一大堆不就是为了说要用iReport来做报表吗！这是我们第一部分已经完成的工作，但是这里重要的是理解Jasperreport的工作原理。</p>
<p style="text-indent: 2em">2、结合Jbuilder开发胖客户端报表应用</p>
<p style="text-indent: 2em">2.1、建立Application</p>
<p style="text-indent: 2em">参考Jbuilder有关资料。只要是普通Window窗口应用即可。</p>
<p style="text-indent: 2em">2.2、引入JasperReports需要的库文件</p>
<p style="text-indent: 2em">通过jbuilder9【Tool】－【configure Libraries】－按最左边的【New】－输入一个名称，比如Report－【add】按钮，导航到iReport的lib目录，把lib目录里面的所有文件引入。如图：</p>
<p style="text-indent: 2em"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/jemlee2002/51118/o_2-2.JPG" border="0" /></p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em">按两次OK回到Jbuilder的开发界面。</p>
<p style="text-indent: 2em">2.3、向工程添加Report系列库文件</p>
<p style="text-indent: 2em">通过右击工程，选择【properties】－【paths】Label－【Required Libraries】Label－【Add】按钮－选择&#8220;Report&#8221;－按两次OK回到Jbuilder的开发界面。这样就添加完成了需要的库文件了。这么做是比较理想的，但是报表运行时可能不需要iReport的lib下所有的jar文件。</p>
<p style="text-indent: 2em">2.4、在主界面上添加需要的组件</p>
<p style="text-indent: 2em">在主Frame添加一个Button和一个Label以及一个TextBox，当然你也可以通过创建菜单连接，如图：</p>
<p style="text-indent: 2em"><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/jemlee2002/51118/o_2-3.JPG" border="0" /></p>
<p style="text-indent: 2em"></p>
<p style="text-indent: 2em">这个窗体时用来做测试用的，实际的界面可能很复杂，其中的TextBox就是为报表的变量做准备的。这里填写的值就是要传递给报表的变量，也就是第一部分定义的带$P{}符号的变量，程序会把他们对应起来。Button的单击事件代码如下： </p>
<p style="text-indent: 2em">/**</p>
<p style="text-indent: 2em">&nbsp;&nbsp; * RptDialog对话框是用来承载报表的显示。</p>
<p style="text-indent: 2em">&nbsp;&nbsp; * @param e</p>
<p style="text-indent: 2em">&nbsp;&nbsp; */</p>
<p style="text-indent: 2em">&nbsp; void jButton1_actionPerformed(ActionEvent e) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//请创建一个对话框类RptDialog</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp; RptDialog dlg = new RptDialog(this.jGroupID.getText());</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Dimension dlgSize = dlg.getPreferredSize();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Dimension frmSize = getSize();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Point loc = getLocation();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp; dlg.setLocation( (frmSize.width - dlgSize.width) / 2 + loc.x,</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (frmSize.height - dlgSize.height) / 2 + loc.y);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp; dlg.setModal(true);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp; dlg.pack();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp; dlg.show();</p>
<p style="text-indent: 2em">&nbsp; }</p>
<p style="text-indent: 2em">RptDialog是接下来制作的一个Dialog对象，通过Jbuilder新建一个Dialog对象并命名RptDialog。RptDialog的代码如下：</p>
<p style="text-indent: 2em">import java.awt.*;</p>
<p style="text-indent: 2em">import javax.swing.*;</p>
<p style="text-indent: 2em">import dori.jasper.engine.*;</p>
<p style="text-indent: 2em">import dori.jasper.view.*;</p>
<p style="text-indent: 2em">import dori.jasper.engine.util.JRLoader;</p>
<p style="text-indent: 2em">import java.sql.Connection;</p>
<p style="text-indent: 2em">import java.io.File;</p>
<p style="text-indent: 2em">import java.util.Map;</p>
<p style="text-indent: 2em">import java.util.HashMap;</p>
<p style="text-indent: 2em">import mytest.trac.CommectionDB;</p>
<p style="text-indent: 2em">/**</p>
<p style="text-indent: 2em">&nbsp;* &lt;p&gt;Title: RptDialog &lt;/p&gt;</p>
<p style="text-indent: 2em">&nbsp;* &lt;p&gt;Description: 报表承载对话框&lt;/p&gt;</p>
<p style="text-indent: 2em">&nbsp;* &lt;p&gt;Copyright: Copyright (c) 2004&lt;/p&gt;</p>
<p style="text-indent: 2em">&nbsp;* &lt;p&gt;Company: *****&lt;/p&gt;</p>
<p style="text-indent: 2em">&nbsp;* @author 李克喜 </p>
<p style="text-indent: 2em">&nbsp;* @version 1.0</p>
<p style="text-indent: 2em">&nbsp;*/</p>
<p style="text-indent: 2em">public class RptDialog extends JDialog {</p>
<p style="text-indent: 2em">&nbsp; JPanel ReportPan = new JPanel();</p>
<p style="text-indent: 2em">&nbsp; BorderLayout borderLayout1 = new BorderLayout();</p>
<p style="text-indent: 2em">&nbsp; //Bug项目名称</p>
<p style="text-indent: 2em">&nbsp; String proname = "";</p>
<p style="text-indent: 2em">&nbsp; //显示报表需要的控件</p>
<p style="text-indent: 2em">&nbsp; JRViewer jrview;</p>
<p style="text-indent: 2em">&nbsp; public RptDialog(String GroupID) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; proname = GroupID;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; try {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jbInit();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pack();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; catch (Exception ex) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp; }</p>
<p style="text-indent: 2em">&nbsp; private void jbInit() throws Exception {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; ReportPan.setLayout(borderLayout1);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; getContentPane().add(ReportPan);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //装载报表,在Jbuilder工程的目录创建一个Reports文件夹，并把报表的jasper文件搁置在该文件夹。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; String reportPath = System.getProperty("user.dir") + "\\Reports\\ BugsRpt.jasper";</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; JasperReport jasperReport = </p>
<p style="text-indent: 2em">(JasperReport) JRLoader.loadObjectFromLocation(reportPath);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //创建数据库的连接，参考java的JDBC编程资料创建连接方式</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; CommectionDB conndb = new CommectionDB();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;//注意：这个连接要求与制作报表时使用的连接一致</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; Connection conn = conndb.getDbConnection();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //报表配置参数，前文提过的SQL语句的Where条件参数就是与这里对应。</p>
<p style="text-indent: 2em">&nbsp; //条件的值可能是通过多种方式得到的，比如上一个页面传递过来的</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; Map parameters = new HashMap();&nbsp;&nbsp;&nbsp; </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;//ProjectName就是iReport的变量$P{ProjectName}的名称，参考第一部分的5.6添加参数和使用参</p>
<p style="text-indent: 2em">proname就是从界面上获取的值。</p>
<p style="text-indent: 2em">&nbsp;parameters.put("ProjectName ", proname);&nbsp;&nbsp; </p>
<p style="text-indent: 2em">&nbsp;JasperPrint jasperPrint =</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JasperFillManager.fillReport(</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jasperReport,</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parameters,</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; );</p>
<p style="text-indent: 2em">&nbsp;&nbsp; //装载过程，注意其中的红体字部分</p>
<p style="text-indent: 2em">&nbsp; &nbsp;jrview = new dori.jasper.view.JRViewer(jasperPrint);</p>
<p style="text-indent: 2em">&nbsp;&nbsp; ReportPan.setLayout(borderLayout1);</p>
<p style="text-indent: 2em">&nbsp;&nbsp; ReportPan.setPreferredSize(new Dimension(800, 600));</p>
<p style="text-indent: 2em">&nbsp;&nbsp; getContentPane().add(ReportPan, BorderLayout.CENTER);</p>
<p style="text-indent: 2em">&nbsp;&nbsp; ReportPan.add(jrview,null);</p>
<p style="text-indent: 2em">&nbsp; }</p>
<p style="text-indent: 2em">}</p>
<p style="text-indent: 2em">到这里，所有需要设置和编程的工作基本完成了。</p>
<p style="text-indent: 2em">3、运行</p>
<p style="text-indent: 2em">确定数据库已经启动了，在JBuilder运行应用程序。在TextBox输入有意义的组值，比如&#8220;BugWin系统&#8221;，这是我的测试值，实际情况是根据你的需要来确定的。单击Button，系统会弹出对话框，运行结果和第一部分6.2、预览报表结果一致。</p>
<p style="text-indent: 2em">4、总结</p>
<p style="text-indent: 2em">随着技术的进步，应用环境的不断变化，胖客户端的应用可能会逐渐退出主流，但是它的存在是必要的。所以我要写胖客户端的应用方面的报表使用技术。文中简要明了的介绍了如何使用Jasperreport编程报表程序。希望对你有一点帮助。</p>
<p style="text-indent: 2em"><strong>第三部分：使用Jasperreport作为报表控件开发Web报表应用</strong></p>
<p style="text-indent: 2em">1、概述</p>
<p style="text-indent: 2em">如何实现发Web报表有很多的选择，自定义CSS＋HTML或是XSLT＋XML或是其他控件，特别是支持图表的控件，比如：jfreechart。本文作为Web报表的一种实现方式，建议你使用Jasperreport作为报表控件，第一、二部分已经对制作报表和开发胖客户端报表应用做了介绍，其实有很多的文章可以参考实现第三部分的内容，不止是我写的这篇文章。</p>
<p style="text-indent: 2em">2、数据连接建立</p>
<p style="text-indent: 2em">参考<a href="http://blog.csdn.net/jemlee2002/archive/2004/09/28/JJEM.aspx">http://blog.csdn.net/jemlee2002/archive/2004/09/28/JJEM.aspx</a>，这里有详细的介绍数据库的连接过程。</p>
<p style="text-indent: 2em">3、拷贝必要的jar文件到Web应用的WEB-INF\lib目录</p>
<p style="text-indent: 2em">每个Web应用都会有WEB-INF目录，但是lib是不一定有的，如果没有就创建它，本文需要的jar库文件有3个：</p>
<p style="text-indent: 2em">jasperreports-0.5.3.jar ：jasperreports执行时需要的API</p>
<p style="text-indent: 2em">iTextAsian.jar ：亚洲字符集支持</p>
<p style="text-indent: 2em">itext-1.02b.jar ：其他字符集支持</p>
<p style="text-indent: 2em">如果你的报表全英文或是不需要支持亚洲字符集，那么iTextAsian.jar、可以不要。</p>
<p style="text-indent: 2em">4、创建repotrs目录并导入.jasper文件</p>
<p style="text-indent: 2em">在Web应用中根目录下创建repotrs目录，其实这是一种建议，没有必要完全按照这样做，你可以根据你的业务需要创建N个目录或是层次目录。</p>
<p style="text-indent: 2em">把.jasper文件拷贝到repotrs目录下，比如例子中的BusinessRpt.jasper文件。</p>
<p style="text-indent: 2em">5、例子程序</p>
<p style="text-indent: 2em">Test.jsp文件的内容：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&lt;%</span><span style="color: #000000">@&nbsp;page&nbsp;session</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">false</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;%</span><span style="color: #000000">@&nbsp;page&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">dori.jasper.engine.*</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;%</span><span style="color: #000000">@&nbsp;page&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">javax.naming.*</span><span style="color: #000000">"</span><span style="color: #000000">%&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;%</span><span style="color: #000000">@&nbsp;page&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">java.sql.*</span><span style="color: #000000">"</span><span style="color: #000000">%&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;%</span><span style="color: #000000">@&nbsp;page&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">javax.sql.*</span><span style="color: #000000">"</span><span style="color: #000000">%&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;%</span><span style="color: #000000">@&nbsp;page&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">java.util.*</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;%</span><span style="color: #000000">@&nbsp;page&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">java.io.*</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">html</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">head</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">meta&nbsp;http</span><span style="color: #000000">-</span><span style="color: #000000">equiv</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">Content-Type</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;content</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">text/html;&nbsp;charset=gb2312</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">title</span><span style="color: #000000">&gt;&lt;/</span><span style="color: #000000">title</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;%</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;DataSource&nbsp;ds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_381_1248_Open_Image" onclick="this.style.display='none'; Codehighlighter1_381_1248_Open_Text.style.display='none'; Codehighlighter1_381_1248_Closed_Image.style.display='inline'; Codehighlighter1_381_1248_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_381_1248_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_381_1248_Closed_Text.style.display='none'; Codehighlighter1_381_1248_Open_Image.style.display='inline'; Codehighlighter1_381_1248_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_381_1248_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_381_1248_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitialContext&nbsp;ctx</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InitialContext();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ds</span><span style="color: #000000">=</span><span style="color: #000000">(DataSource)ctx.lookup(</span><span style="color: #000000">"</span><span style="color: #000000">java:comp/env/jdbc/mysql</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ds.getConnection();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">装载jasper文件</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;business_rpt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(application.getRealPath(</span><span style="color: #000000">"</span><span style="color: #000000">/reports/BusinessRpt.jasper</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">配置参数，可以参考《第二部分：使用Jasperreport作为报表控件开发胖客户端报表应用》<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;</span><span style="color: #008000; text-decoration: underline">http://blog.csdn.net/jemlee2002/archive/2004/10/08/JJem3.aspx</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">ProjectName就是iReport的变量$P{ProjectName}的名称，<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">参考第一部分的5.6添加参数和使用参数<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">proname就是从界面上获取的值。</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />Map&nbsp;parameters&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameters.put(</span><span style="color: #000000">"</span><span style="color: #000000">ProjectName&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;proname);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;JasperRunManager是一个输出控制管理类，下文会提及部分内容</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JasperRunManager.runReportToHtmlFile(business_rpt.getPath(),parameters,conn);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果创建报表成功，则转向该报表，其实可以把报表套在框架内，这样实现比较有意义的报表格式。</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.sendRedirect(</span><span style="color: #000000">"</span><span style="color: #000000">/reports/BusinessRpt.html</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_1268_1352_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1268_1352_Open_Text.style.display='none'; Codehighlighter1_1268_1352_Closed_Image.style.display='inline'; Codehighlighter1_1268_1352_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1268_1352_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1268_1352_Closed_Text.style.display='none'; Codehighlighter1_1268_1352_Open_Image.style.display='inline'; Codehighlighter1_1268_1352_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;ex)</span><span id="Codehighlighter1_1268_1352_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1268_1352_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.print(</span><span style="color: #000000">"</span><span style="color: #000000">出现例外，信息是:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">ex.getMessage());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">%&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">head</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">body</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">body</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">html</span><span style="color: #000000">&gt;</span></div>
<p style="text-indent: 2em">6、关于JasperRunManager</p>
<p style="text-indent: 2em">JasperRunManager有很多的静态方法，控制输出的格式，比如输出格式是pdf或是html等，建议浏览JasperRunManager的一些方法，这样对开发报表输出有帮助。</p>
<p style="text-indent: 2em">7、输出内容</p>
<p style="text-indent: 2em">例子中输出格式是以HTML文件格式，所以web服务器可以直接解释并显示，效果不错。</p>
<p style="text-indent: 2em">8、总结</p>
<p style="text-indent: 2em">终于把3个部分的内容全部写完，到这里我可以休息一小会儿了，就像一休大师说得:&#8220;休息,休息&#8230;&#8230;&#8221;. </p>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;转载自:&nbsp; <a title="iReport制作报表" href="http://blog.csdn.net/jemlee2002/">iReport制作报表</a> 
<img src ="http://www.blogjava.net/kxx129/aggbug/191425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2008-04-08 11:59 <a href="http://www.blogjava.net/kxx129/archive/2008/04/08/191425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JasperReports+iReport在eclipse中的使用</title><link>http://www.blogjava.net/kxx129/archive/2008/04/08/191421.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Tue, 08 Apr 2008 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2008/04/08/191421.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/191421.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2008/04/08/191421.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/191421.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/191421.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一、介绍</p>
<p style="text-indent: 2em">1）它可以PDF，HTML，XML等多种形式产生报表或动态报表，在新版本还支持CSV，XLS，RTF等格式的报表；</p>
<p style="text-indent: 2em">2）它按预定义的XML文档来组织数据，来源多（如：关系数据库，Java容器对象（collection，arrays）等）；</p>
<p style="text-indent: 2em">报表的填充过程：</p>
<p style="text-indent: 2em">先产生报表设计对象-&gt;序列化该对象-&gt;存储在磁盘或网络-&gt;产生XML文件（表格数据）。</p>
<p style="text-indent: 2em">表单的设计过程就是用定义于XML文件中的Java表达式来实现报表的设计。</p>
<p style="text-indent: 2em">3）它带数据一致性验证；</p>
<p style="text-indent: 2em">4）报表引擎必须先接受数据（通过参数等多种形式）来产生报表，更多的是来自数据源，引擎直接接收用于填充表格的数据源对象，或者通过自身提供的JDBC连接对象来处理数据库的数据；</p>
<p style="text-indent: 2em">5）报表最终要产生一个新的对象来进行填充操作，从而产生打印文档对象，这也是存储在磁盘或网络传输介质的序列化对象；</p>
<p style="text-indent: 2em">6）内置浏览器能直接查看结果，以PDF，HTML，XML导出；</p>
<p style="text-indent: 2em">7）重要的类：</p>
<p style="text-indent: 2em">net.sf.jasperreports.engine.design.JasperDesign</p>
<p style="text-indent: 2em">其实例是用于报表产生的原始类；</p>
<p style="text-indent: 2em">net.sf.jasperreports.engine.design.JasperReport</p>
<p style="text-indent: 2em">表现了报表设计对象，是作为报表的编译过程的结果而被实例化，是向报表中填充数据的准备。</p>
<p style="text-indent: 2em">二、结构</p>
<p style="text-indent: 2em">JasperReports用XML文件来定义，约定用jrxml作为文件的后缀名。</p>
<p style="text-indent: 2em">1）主要元素：</p>
<p style="text-indent: 2em">&lt;jasperReport&gt; 根元素</p>
<p style="text-indent: 2em">&lt;title&gt; 报表的标题</p>
<p style="text-indent: 2em">&lt;pageHeader&gt; 页眉</p>
<p style="text-indent: 2em">&lt;detail&gt; 正文</p>
<p style="text-indent: 2em">&lt;pageFooter&gt; 页脚</p>
<p style="text-indent: 2em">&lt;band&gt; 定义报表部件，以上所有元素都包含一个band元素作为其唯一子元素。</p>
<p style="text-indent: 2em">除了根元素，其余元素是可选的。</p>
<p style="text-indent: 2em">2）其编辑工具iReport在Eclipse3.2下的安装过程</p>
<p style="text-indent: 2em">菜单&#8220;帮助&#8221;-&gt;&#8220;软件更新&#8221;-&gt;&#8220;查找并安装&#8221;-&gt;&#8220;搜索要安装的新功能部件&#8221;--(下一步)--&gt;&#8220;新建远程站点&#8221;，输入以下内容：</p>
<p style="text-indent: 2em">名称：JasperForge</p>
<p style="text-indent: 2em">URL：<a href="http://www.jasperforge.org/update">http://www.jasperforge.org/update</a></p>
<p style="text-indent: 2em">--(确定)--&gt;&#8220;下一步&#8221;--&gt;直至完成。</p>
<p style="text-indent: 2em">3）以JasperReports1.3.0版本为例，一个JasperReports项目需要如下jar包：</p>
<p style="text-indent: 2em">包名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明</p>
<p style="text-indent: 2em">jasperreports-1.3.0.jar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JasperReports API</p>
<p style="text-indent: 2em">commons-beanutils-1.7.jar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JavaBeans Utility classes</p>
<p style="text-indent: 2em">commons-collections-2.1.jar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Collections framework extension classes</p>
<p style="text-indent: 2em">commons-digester-1.7.jar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classes for processing XML documents</p>
<p style="text-indent: 2em">commons-logging-1.0.2.jar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logging classes</p>
<p style="text-indent: 2em">poi-2.0-final-20040126.jar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Jarkarta POI API to generate an Excel Document</p>
<p style="text-indent: 2em">itext-1.3.1.jar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PDF library</p>
<p style="text-indent: 2em">xml-apis.jar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XML parser API</p>
<p style="text-indent: 2em">三、iReport介绍</p>
<p style="text-indent: 2em">1）iReport是为JasperReports设计的强大的，直观的，易于使用的可视化报表设计器，为win32平台编写。允许用户可视化地编辑XML JasperDesign文件，可以和其它数据库进行JDBC通信。</p>
<p style="text-indent: 2em">再设计模板时可以以HTML，PDF，XML方式预览，用它生成的文件有.jrxml和.jasper两种文件。</p>
<p style="text-indent: 2em">.jrxml：是可视化编辑的xml文件；</p>
<p style="text-indent: 2em">.jasper：经编译后生成的类文件，即报表模板文件。</p>
<p style="text-indent: 2em">2）iReport的输出格式</p>
<p style="text-indent: 2em">其预览输出格式有：PDF，HTML，CSV。JAVA2D，EXCEL，纯文本，JRView。</p>
<p style="text-indent: 2em">注意：JRViewer是直接以C/S方式作为报表的输出格式，在JFrame框架下输出。</p>
<p style="text-indent: 2em">3）报表的动态对象变量、参数、字段</p>
<p style="text-indent: 2em">字段Fields：是从数据库抽取出来的，在报表中出现的数据库内容。$F</p>
<p style="text-indent: 2em">参数Parameters：你写的应用需要提供给报表的入口。 $P</p>
<p style="text-indent: 2em">变量Variables：报表中一些逻辑运算的表现。 $V</p>
<p style="text-indent: 2em">每个对象的定义格式如下： $V{variablesName}</p>
<p style="text-indent: 2em">4）运行时需要.jasper文件；编译：把.jrxml-&gt;.jasper文件。</p>
<p style="text-indent: 2em">静态运行：静态文本来运行，和数据源无关；</p>
<p style="text-indent: 2em">动态运行：带数据源运行。</p>
<p style="text-indent: 2em">5）报表的结构</p>
<p style="text-indent: 2em">title、pageHeader、columnHeader、detail、columnFooter、pageFooter、summary、groupHeader、groupfooter。</p>
<p style="text-indent: 2em">6）在iReport中创建数据库连接</p>
<p style="text-indent: 2em">（1）菜单DourceSource -&gt; Connections/DataSources -&gt; ...new -&gt;</p>
<p style="text-indent: 2em">（2）菜单Build -&gt; Set active connection -&gt; 选择 -&gt; ... -&gt; OK</p>
<p style="text-indent: 2em">7）在iReport中创建文件</p>
<p style="text-indent: 2em">iReport工具是一个可视编辑器帮助创建JasperReports文件。JasperReports是一个基于Java报表的引擎。</p>
<p style="text-indent: 2em">当你在iReport中创建一个报表，你实际上是对配置文件进行操作，告诉JasperReports应该怎样建立Report。</p>
<p style="text-indent: 2em">三种文件：</p>
<p style="text-indent: 2em">.jasper文件：编译的二进制文件；</p>
<p style="text-indent: 2em">.jrxml文件：报表的配置文件；</p>
<p style="text-indent: 2em">.pdf文件：生成的pdf文件。</p>
<p style="text-indent: 2em">8）报表格式化</p>
<p style="text-indent: 2em">在iReport上选择报表的一个区域，将呈现蓝色高亮显示；</p>
<p style="text-indent: 2em">可用鼠标拖曳来改变区域的尺寸，当误操作时，用undo来恢复；</p>
<p style="text-indent: 2em">如选择框变红，则有错误，report将不能编译；</p>
<p style="text-indent: 2em">改变字体或调整尺寸，菜单&#8220;View&#8221;-&gt;&#8220;Element properties&#8221;-&gt;分三个选择：</p>
<p style="text-indent: 2em">（1）Common选择：尺寸，前景色/背景色，透明度，打印条件，位置属性等；</p>
<p style="text-indent: 2em">（2）Font选择：字体、大小、类型，PDF字体，加粗，斜体，下划线，水平位置，垂直位置，PDF编码。</p>
<p style="text-indent: 2em">注意：两种字体：</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp; Font Name：将显示在iReport设计器和JasperReports运行中；</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp; PDF font Name：将显示在编译后的PDF文件中。</p>
<p style="text-indent: 2em">（3）Static Text：静态文本。</p>
<p style="text-indent: 2em">想浏览元素时，看&#8220;View&#8221;-&gt;&#8220;Elements browser&#8221;；</p>
<p style="text-indent: 2em">一次选择多个域，按&#8220;shift&#8221;键再用鼠标点击；</p>
<p style="text-indent: 2em">菜单&#8220;View&#8221;-&gt;&#8220;Report Properties&#8221;报表属性：</p>
<p style="text-indent: 2em">报表尺寸，单位，页边距，报表名，纵向Portrait/横向Landscape，列宽，Spacing，标题作为新页，Summary作为新页，XML编码（UTF-8）。</p>
<p style="text-indent: 2em">9）使用Groups</p>
<p style="text-indent: 2em">菜单&#8220;View&#8221;-&gt;&#8220;Report query&#8221; 可以查询和修改SQL语句。</p>
<p style="text-indent: 2em">10）为report增加参数</p>
<p style="text-indent: 2em">（1）菜单&#8220;View&#8221;-&gt;&#8220;Report Query&#8221;，修改SQL语句，如：加上 WHERE LAST_NAME=$P{LAST_NAME}</p>
<p style="text-indent: 2em">注意：参数用$P{}来封装。</p>
<p style="text-indent: 2em">（2）定义参数</p>
<p style="text-indent: 2em">菜单&#8220;View&#8221;-&gt;&#8220;Reports Parameters&#8221;</p>
<p style="text-indent: 2em">新建参数，如参数名为&#8220;LAST_NAME&#8221;，再指定参数的类型（如：String）</p>
<p style="text-indent: 2em">还可设定&#8220;缺省值&#8221;和参数的&#8220;描述&#8221;</p>
<p style="text-indent: 2em">运行报表（缺省），还可以传递参数方式：<a href="http://server/showReport?LAST_NAME=smith">http://server/showReport?LAST_NAME=smith</a></p>
<p style="text-indent: 2em">菜单&#8220;Build&#8221;-&gt;&#8220;Execute report（using active conn.）&#8221;</p>
<p style="text-indent: 2em">11）创建子报表</p>
<p style="text-indent: 2em">例子：一个报表包含另一个报表</p>
<p style="text-indent: 2em">（1）建立两个报表；</p>
<p style="text-indent: 2em">（2）扩展master报表，增加一个subreport元素；</p>
<p style="text-indent: 2em">（3）双击subreport元素，设置其属性。在Subreport（other）栏中，</p>
<p style="text-indent: 2em">Subreport Expression填入&#8220;c:\test2.jasper&#8221;(第二个表即子表的文件名），点击&#8220;Add&#8221;，增加/修改：&#8220;Subreport parameter name&#8221;和Default value expression值；（COUNTRY&nbsp;&nbsp;&nbsp;&nbsp; $F{COUNTRY}）</p>
<p style="text-indent: 2em">（4）对子表&#8220;Report query&#8221;-&gt;添加'where COUNTRY=${COUNTRY}'</p>
<p style="text-indent: 2em">（5）增加&#8220;Report parameters&#8221;，（COUNTRY，java.lang.String)</p>
<p style="text-indent: 2em">（6）编译detail report；</p>
<p style="text-indent: 2em">（7）运行master report。</p>
<p style="text-indent: 2em">iReport支持Groovy脚本语言，可无需懂Java。</p>
<p style="text-indent: 2em">1、配置XML文件</p>
<p style="text-indent: 2em">jasperreports的XML配置文件局域jasperreport.dtd文件而来。</p>
<p style="text-indent: 2em">1）根元素jasperReport</p>
<p style="text-indent: 2em">其子元素有：报告的字体reportFont，参数parameter，查询字符串queryString，字段field，变量variable，组group，标题title，页眉pageHeader，列眉columnHeader，表明细detail，列脚columnFooter，页脚pageFooter。</p>
<p style="text-indent: 2em">属性有：列宽columnWidth，列间距columnSpacing，左边距leftMargin，顶边距topMargin，底边距bottomMargin。</p>
<p style="text-indent: 2em">2）报表层字体含义reportFonts</p>
<p style="text-indent: 2em">无子元素；</p>
<p style="text-indent: 2em">属性有：名字name，是否缺省isFault，字体名fontName，字体大小size，是否粗体isBold，是否斜体isItalic，是否带下划线isUnderline，isStrikeThrough，PDF字体名pdfFontName，PDF编码pdfEncoding，是否嵌入PDF（isPdfEmbedded）。</p>
<p style="text-indent: 2em">3）用于产生报表的对象参数parameter。引用P${name}</p>
<p style="text-indent: 2em">其子元素有：ParameterDescription，defaultValueExpression</p>
<p style="text-indent: 2em">属性有：name，class</p>
<p style="text-indent: 2em">4）从数据库检索数据的查询SQL语句 queryString</p>
<p style="text-indent: 2em">5）包含于report中的数据库表列字段 field。 引用F${name}</p>
<p style="text-indent: 2em">其子元素有：variableExpression，initialValueExpression</p>
<p style="text-indent: 2em">属性有：name，class</p>
<p style="text-indent: 2em">6）用在XML文件中的变量 Variable&nbsp;&nbsp; 引用V${name}</p>
<p style="text-indent: 2em">其子元素有：variableExpression，initialValueExpression</p>
<p style="text-indent: 2em">属性有：name，class</p>
<p style="text-indent: 2em">7）报表标题 title</p>
<p style="text-indent: 2em">其子元素有：band</p>
<p style="text-indent: 2em">无属性</p>
<p style="text-indent: 2em">8）页眉 pageHeader</p>
<p style="text-indent: 2em">其子元素有：band</p>
<p style="text-indent: 2em">无属性</p>
<p style="text-indent: 2em">9）报表的列名 columnHeader</p>
<p style="text-indent: 2em">其子元素有：band</p>
<p style="text-indent: 2em">无属性</p>
<p style="text-indent: 2em">10）指定的列值detail</p>
<p style="text-indent: 2em">其子元素有：band</p>
<p style="text-indent: 2em">无属性</p>
<p style="text-indent: 2em">11）列尾columnFooter</p>
<p style="text-indent: 2em">其子元素有：band</p>
<p style="text-indent: 2em">无属性</p>
<p style="text-indent: 2em">12）页脚pageFooter</p>
<p style="text-indent: 2em">其子元素有：band</p>
<p style="text-indent: 2em">无属性</p>
<p style="text-indent: 2em">注：在report中，一个band表示一个report节点。一个band元素包括：staticText（静态文本）和textElement（文本元素）两个元素。</p>
<p style="text-indent: 2em">常见报表模型：列表、分组、主从、嵌套、交叉、图形、套打、分栏、填报。</p>
<p style="text-indent: 2em">2、创建报表</p>
<p style="text-indent: 2em">1）建立输入源</p>
<p style="text-indent: 2em">InputStream input = new FileInputStream(new File("c:\\JasperReports\\catalog.xml"));</p>
<p style="text-indent: 2em">JasperDesign design=JRXmlLoader.load(Input);</p>
<p style="text-indent: 2em">2）创建对象</p>
<p style="text-indent: 2em">JasperReport report = JasperCompileManager.compileReport(design);</p>
<p style="text-indent: 2em">3）获得JDBC连接从数据库检索数据</p>
<p style="text-indent: 2em">InitialContext initialContext = new InitialContext();</p>
<p style="text-indent: 2em">DataSource ds = (DataSource)initialContext.lookup("java:comp/env/jdbc/OracleDBConnectionDS");</p>
<p style="text-indent: 2em">Connection conn = ds.getConnection();</p>
<p style="text-indent: 2em">4）产生可预览、打印、输出为其它格式的JasperPrint文件</p>
<p style="text-indent: 2em">JasperPrint print = JasperFillManager.fillReport(report, parameters, conn);</p>
<p style="text-indent: 2em">5）参数处理</p>
<p style="text-indent: 2em">Map parameters = new HashMap();</p>
<p style="text-indent: 2em">parameters.put("ReportTitle", "PDF JasperReport");</p>
<p style="text-indent: 2em">6）输出成XML，PDF，HTML，CSV，XLS（Excel）的任一种文件。</p>
<p style="text-indent: 2em">OutputStream output = new FileOutputStream(new File("c:/JasperReports/catalog.pdf"))</p>
<p style="text-indent: 2em">JasperExportManager.exportReportToPdfStream(print,output);</p>
<p style="text-indent: 2em">3、JasperReports的安装配置</p>
<p style="text-indent: 2em">1）JDK的安装，注意JAVA_HOME环境变量；</p>
<p style="text-indent: 2em">2）要支持中文，需itext-1.3.1.jar和iTextAsian.jar包，加入CLASSPATH环境变量中；</p>
<p style="text-indent: 2em">3）安装iReport，用iReport-1.3.0-windows-installer.exe安装；</p>
<p style="text-indent: 2em">4）JasperReport不需任何配置，将其jar包（jasperreports-1.3.0.jar）放入CLASSPATH；</p>
<p style="text-indent: 2em">5）数据库的JDBC驱动包，例如Sybase的驱动包为jconn6.jar，加入到CLASSPATH。</p>
<p style="text-indent: 2em">4、iReport的安装配置</p>
<p style="text-indent: 2em">iReport如果不用其安装文件iReport-1.3.0-windows-installer.exe安装，则需要配置。</p>
<p style="text-indent: 2em">iReport需Sun公司的JDK下的tools.jar，需拷贝到iReport的lib目录下。</p>
<p style="text-indent: 2em">iReport初始化配置的组成：</p>
<p style="text-indent: 2em">（1）建立报表；</p>
<p style="text-indent: 2em">（2）选择语言；</p>
<p style="text-indent: 2em">（3）加入到CLASSPATH。</p>
<p style="text-indent: 2em">四、Report Structure 报告的结构</p>
<p style="text-indent: 2em">本章描述报告的结构，可用的report对象和它们的属性。这基本上是JasperReports的快速参考。</p>
<p style="text-indent: 2em">1、Expressions 表达式</p>
<p style="text-indent: 2em">表达式是JasperReports的核心特征。它是一个重要的机制，允许操纵和显示报告数据，执行各种计算，自定义报告的外观和报告对象的可视性。</p>
<p style="text-indent: 2em">1）一个典型的表达式</p>
<p style="text-indent: 2em">$F{LastName} + " " + $F{LastName}</p>
<p style="text-indent: 2em">一个JasperReports的表达式是以Java表达式为基础的，再加上一些附加的语法，它允许引用参数、变量和字段等。</p>
<p style="text-indent: 2em">比如说要引用一个名叫DATA的参数时，语法应为$P{PARAM_NAME}。</p>
<p style="text-indent: 2em">对变量和字段来说，其引用语法分别为$V{VAR_NAME}和$F{FIELD_NAME}。</p>
<p style="text-indent: 2em">注意：在JasperReports的groovy脚本语言中，也同样可以用$F，$P，$V引用参数、变量和字段。</p>
<p style="text-indent: 2em">2）表达式的语法</p>
<p style="text-indent: 2em">（1）$F{FIELD}&nbsp;&nbsp; 引用名为FIELD的字段；</p>
<p style="text-indent: 2em">（2）$V{VAR}&nbsp;&nbsp;&nbsp;&nbsp; 引用名为VAR的变量；</p>
<p style="text-indent: 2em">（3）$P{PARAM}&nbsp;&nbsp; 引用名为PARAM的参数；</p>
<p style="text-indent: 2em">（4）$P!{PARAM} 引用名为PARAM的参数；这个特殊的语法仅能用于report的查询中。它允许插入参数的内容到查询字符串中。例如，它能被用于创建一个带通过参数来指定WHERE条件的动态查询。</p>
<p style="text-indent: 2em">$R{keyName}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在resource bundle中检索带keyName关键字的字符串。</p>
<p style="text-indent: 2em">注意：表达式是用Java或Groovy写成的，这意外着可以用Java强大的功能，如调用方法，允许构建无限复杂的表达式。还要注意，表达式的结果总是一个对象。</p>
<p style="text-indent: 2em">3）更多的表达式</p>
<p style="text-indent: 2em">（1）new Integer(Math.max($V{Price1},$V{Price2}))</p>
<p style="text-indent: 2em">（2）(new SimpleDateFormat("dd/MM/yyyy")).format($F{OrderDate})</p>
<p style="text-indent: 2em">（3）$F{SpecialOffer}.booleanValue()? $F{SpecialPrice} : $F{Price}</p>
<p style="text-indent: 2em">2、内建的函数</p>
<p style="text-indent: 2em">JasperReports提供了一套内建的函数用于report表达式中。这些函数尽管是内建的工具，还是可以在普通操作中执行它。</p>
<p style="text-indent: 2em">注意：目前这套函数很有限，在未来会得到扩展。</p>
<p style="text-indent: 2em">1)例：使用内建函数</p>
<p style="text-indent: 2em">msg("Total cost is {0}", $F{TOTAL})</p>
<p style="text-indent: 2em">msg("Matched {0} products out of {1}", $F{MATCHED}, $P{TOTAL})</p>
<p style="text-indent: 2em">2)内建的函数</p>
<p style="text-indent: 2em">（1）String str(String key);</p>
<p style="text-indent: 2em">从和report相联系的resource bundle中得到给出的key的一个字符串。这个函数的功能和使用$R{key}语法等价。</p>
<p style="text-indent: 2em">（2）String msg(String pattern, Object arg0);</p>
<p style="text-indent: 2em">建立一个带给定的pattern和给定参数来指定其格式的java.util.MessageFormat对象。</p>
<p style="text-indent: 2em">（3）String msg(String pattern, Object arg0, Object arg1);</p>
<p style="text-indent: 2em">同上；</p>
<p style="text-indent: 2em">（4）String msg(String pattern, Object arg0, Object arg1, Object arg2);</p>
<p style="text-indent: 2em">同上。</p>
<p style="text-indent: 2em">3、Report 报告</p>
<p style="text-indent: 2em">Report是表现为报告模板的根对象。在报告执行期间，report模板和数据组合成最终的文档。</p>
<p style="text-indent: 2em">报告的属性有：</p>
<p style="text-indent: 2em">（1）Report Name 报告名；</p>
<p style="text-indent: 2em">（2）Units 报告的单位；有：像素Pixels，毫米Millimeters，厘米Centimeters和英寸Inches。</p>
<p style="text-indent: 2em">（3）Language 报告表达式使用的语言；目前有Java和Groovy两种。</p>
<p style="text-indent: 2em">（4）Orientation 页的方向；其可能值为水平Protrait和纵向Landscape。</p>
<p style="text-indent: 2em">（5）Page Width 以报告单位指定的页宽；</p>
<p style="text-indent: 2em">（6）Page Height 以报告单位指定的页高；</p>
<p style="text-indent: 2em">（7）Page Size 报告的尺寸，即为page width和page height。</p>
<p style="text-indent: 2em">（8）Left Margin 以报告单位指定的左边页边距；</p>
<p style="text-indent: 2em">（9）Right Margin 以报告单位指定的右边页边距；</p>
<p style="text-indent: 2em">（10）Top Margin 以报告单位指定的顶部页边距；</p>
<p style="text-indent: 2em">（11）Bottom Margin 以报告单位指定的底部页边距；</p>
<p style="text-indent: 2em">（12）Column Count 报告中的列数；</p>
<p style="text-indent: 2em">（13）Column Spacing 以报告单位指定的列边距；</p>
<p style="text-indent: 2em">（14）Column Width 以报告单位指定的列宽；</p>
<p style="text-indent: 2em">（15）Print Order 填充列的顺序；有垂直Vertical和水平Horizontal两种。</p>
<p style="text-indent: 2em">（16）Float Column Footer 浮动列脚，指出是否在列底部或明细表最后或组脚进行打印；</p>
<p style="text-indent: 2em">（17）Default Font 缺省字体；</p>
<p style="text-indent: 2em">（18）Default Style 缺省风格；</p>
<p style="text-indent: 2em">（19）Scriptlet Class 脚本类，它必须是JRAbstractScriptlet类的子类。如果省略，将创建一个JRDefaultScriptlet的实例。</p>
<p style="text-indent: 2em">（20）Summary New Page 新页的概要；</p>
<p style="text-indent: 2em">（21）Title New Page 新页的标题；</p>
<p style="text-indent: 2em">（22）When No Data Print 无数据时的打印，有三个选择：No Pages 表示0页；Blank Page 空白页；All Sections No Detail 除了detail section，其它的都打印。</p>
<p style="text-indent: 2em">（23）Query 查询，用来检索数据到报告中。</p>
<p style="text-indent: 2em">（24）Query Language 查询语言，有五个值：SQL 用于JDBC数据源的查询语言；HBM Hibernate用于Hibernate数据源的查询语言；XPath 用于XML数据源的查询语言；EJBQL用于支持Java持久层（Persistence）API的数据源的查询语言；MDX 用于Mondrian数据源的查询语言。</p>
<p style="text-indent: 2em">（25）Imports java输入的列表，例如：java.util.*和java.text.SimpleDateFormat格式。用于简化report的表达式。</p>
<p style="text-indent: 2em">（26）Resource Bundle 为report提供了本地的系列字符串。在报告中，本地字符串能用$R{key}引用。</p>
<p style="text-indent: 2em">（27）When Resource Missing Print 允许自定义引擎在resource bundle中处理丢失的resource。有4种选择：Null 丢失的resource不打印；Empty 丢失的resource为空；Key 用$R{key}指定的key来打印； Error 用错误来中断报告的执行。</p>
<p style="text-indent: 2em">4、Styles 风格</p>
<p style="text-indent: 2em">一个report可以定义大量的风格。一旦定义了，它们能和report对象联系起来，为了给各种可视视图提供基本的配置。report允许用模块化的方式来定义模块的风格。</p>
<p style="text-indent: 2em">风格有相关联的条件风格。条件风格允许当其表达式为真时改变风格。</p>
<p style="text-indent: 2em">1）风格的属性有：</p>
<p style="text-indent: 2em">（1）Name 风格名；</p>
<p style="text-indent: 2em">（2）Parent Style 父风格；</p>
<p style="text-indent: 2em">（3）Foreground 前景色；</p>
<p style="text-indent: 2em">（4）Background 背景色；</p>
<p style="text-indent: 2em">（5）Mode 方式，决定是否带透明度；</p>
<p style="text-indent: 2em">（6）Pen 画笔 有6种选择：None 无线；1 Point 正常宽度的线；2 Point 中等宽度的线；4 Point 粗线；Dotted 虚线；Thin 细线。</p>
<p style="text-indent: 2em">（7）Fill 填充；决定对对象进行填充的模式；</p>
<p style="text-indent: 2em">（8）Box 指定盒子的属性，如边框类型，边框颜色，是否填充。</p>
<p style="text-indent: 2em">（9）Horizontal Alignment 水平排列；有3种选择：Left 左；Center 中；Right 右。</p>
<p style="text-indent: 2em">（10）Vertical Alignment 垂直排列；有3种选择：Top 顶；Middle 中；Bottom 底。</p>
<p style="text-indent: 2em">（11）Scale 比例；指定图像的比例，有3种选择：Clip 尺寸不适合时，多余部分省略；Fill Frame 图像按比例填充进Image对象中；Retain Shape 保留原形状进行填充。</p>
<p style="text-indent: 2em">（12）Radius 指定矩形边框倒角的弧度；</p>
<p style="text-indent: 2em">（13）Pattern 用Text Field表达式的值来指定样式；其日期类型的值用java.text.SimpleDataFormat类来定义；其数值型的值用java.text.DecimalFormat来定义。</p>
<p style="text-indent: 2em">（14）Blank When Null 当Text Field表达式的值为null时显示空白；</p>
<p style="text-indent: 2em">（15）Line Spacing 线距；有3种选择：Single：单倍线距；1 and 1/2：1.5倍线距；Double：双倍线距。</p>
<p style="text-indent: 2em">（16）Rotation 旋转；有3种选择：None 不旋转；Left 左旋180度；Right 右旋180度。</p>
<p style="text-indent: 2em">（17）Styled Text 是一个标志位，用来指定是否text对象包含了已定义风格或规则的text。</p>
<p style="text-indent: 2em">（18）Font Name 字体名；</p>
<p style="text-indent: 2em">（19）Font Size 字体的尺寸；</p>
<p style="text-indent: 2em">（20）Bold 粗体；</p>
<p style="text-indent: 2em">（21）Italic 斜体；</p>
<p style="text-indent: 2em">（22）Underline 下划线；</p>
<p style="text-indent: 2em">（23）Strike Through 通过标准位来取消；</p>
<p style="text-indent: 2em">（24）PDF Font Name：PDF字体名；</p>
<p style="text-indent: 2em">（25）PDF Encoding：PDF编码；</p>
<p style="text-indent: 2em">（26）PDF Embedded是一个标志位，指定是否PDF字体应该嵌入到文档中。</p>
<p style="text-indent: 2em">2）条件风格的属性：</p>
<p style="text-indent: 2em">和上面仅有一点点的不同。其不同的属性为：</p>
<p style="text-indent: 2em">Condition Expression 条件表达式；是一个布尔型的表达式，用于判断是否应用条件表达式。</p>
<p style="text-indent: 2em">5、Section Properties 节属性</p>
<p style="text-indent: 2em">Section的种类前面已经讲了，这里只是补充讲述它的属性：</p>
<p style="text-indent: 2em">（1）Height 以报告的单位指定的section的高度；</p>
<p style="text-indent: 2em">（2）Print When Expression 是一个布尔表达式，决定是否打印本Section；</p>
<p style="text-indent: 2em">（3）Split Allowed 一个标志位，指示当Section超过当前页面的尺寸时，是否允许分割它。如果为真，当前Section将迁移到下一页。注意：如果Section在下一页也不适合时，则不管标志位值如何，都会分割它。</p>
<p style="text-indent: 2em">6、Groups 组</p>
<p style="text-indent: 2em">一个report可以定义大量的组。组表示决定带相关数据的可视组的表达式名。一旦声明后，组能在报告任意地方使用。</p>
<p style="text-indent: 2em">一个数据组用一个表达式组来识别。</p>
<p style="text-indent: 2em">注意：组机制不能完成来自于数据源数据的任何排序。如果想要有序的数据，必须把数据源的数据进行先排序处理。</p>
<p style="text-indent: 2em">组属性：</p>
<p style="text-indent: 2em">（1）Name 组名；用于引用组。</p>
<p style="text-indent: 2em">（2）Expression 表达式；决定report数据的组；</p>
<p style="text-indent: 2em">（3）Min Height To Start New Page 开始新页的最小高度；</p>
<p style="text-indent: 2em">（4）Reprint Header On Each Page 一个标志位，指示在每一页的开始处是否重新打印组头；</p>
<p style="text-indent: 2em">（5）Reset Page Number 重设页数，一个标志位；在组头在新页开始处打印时，是否重新设置页数；</p>
<p style="text-indent: 2em">（6）Start New Column 一个标志位，是否在新列中总是打印组头；</p>
<p style="text-indent: 2em">（7）Start New Page 一个标志位，是否在新页中总是打印组头；</p>
<p style="text-indent: 2em">报表工具之JasperReports+iReport（5）</p>
<p style="text-indent: 2em">五、JasperReports作为一种开源的报表库为应用提供了强大的支持。其易用性和灵活性为系统的开发提供了极大的便利。</p>
<p style="text-indent: 2em">在报表生成过程中，使用JDBC等传统数据源操作方法获取数据的过程会消耗大量的系统时间，这样就需要利用其它手段来简化数据源操作。</p>
<p style="text-indent: 2em">在这种情况下，适当的使用ORM（Object/Relational Mapping）技术，能够很好的解决这个问题，对于系统性能的提升有很大的帮助。</p>
<p style="text-indent: 2em">1、JasperReports填充报表</p>
<p style="text-indent: 2em">要完成报表的填充，必须先完成用于报表的xml模板，其过程是先产生报表布局对象，再序列号该对象，存储在磁盘或者网络，用于产生特定应用的表格数据。</p>
<p style="text-indent: 2em">实际上，表单的设计过程就是用定义于xml文件中的java表达式来表现报表的布局。</p>
<p style="text-indent: 2em">编辑过程中会有各种保证数据一致性的验证，最终会产生相关数据的文档。</p>
<p style="text-indent: 2em">报表引擎必须先接受数据来产生报表，这些数据一般来源于各种数据源，报表引擎能直接接收用于填充表格的数据源对象，或者通过自身提供的JDBC连接对象来处理数据库的数据。</p>
<p style="text-indent: 2em">报表最终要产生一个新的对象来进行填充操作从而产生用于输出的文档对象，这也是一个存储在磁盘或者网络传输介质的序列化对象。</p>
<p style="text-indent: 2em">JasperReports的内置浏览器能直接查看结果或者以PDF,HTML,XML形式将其导出。</p>
<p style="text-indent: 2em">2、持久化技术和ORM</p>
<p style="text-indent: 2em">持久化（Persistence），即把数据保存到可永久保存的存储设备中（如磁盘）。</p>
<p style="text-indent: 2em">持久化的主要应用是将内存中的数据存储在关系型的数据库中，当然也可以存储在磁盘文件中、XML数据文件中等。</p>
<p style="text-indent: 2em">ORM即&#8220;对象－关系型数据映射组件。对于O/R，即Object（对象）和Relational（关系型数据），表示必须同时使用面向对象和关系型数据进行开发。</p>
<p style="text-indent: 2em">MVC（Model View Control）中的Model包含了复杂的业务逻辑和数据逻辑，以及数据存取机制（如JDBC的连接、SQL生成和Statement创建、还要ResultSet结果集的读取等）。将这些复杂的业务逻辑和数据逻辑分离，以将系统的紧耦合关系转化为松耦合关系（即解耦合），是降低系统耦合度迫切要做的，也是持久化要做的工作。</p>
<p style="text-indent: 2em">MVC模式实现了架构上将表现层和数据处理层分离的解耦合，而持久化设计则实现了数据处理层内部的业务逻辑和数据逻辑分离的解耦合。</p>
<p style="text-indent: 2em">关系型数据库中的数据基本都是以一行行的数据进行存取的，而程序运行却是一个个对象进行处理，而目前大部分数据库驱动技术（如ADO.NET、JDBC、ODBC等）均是以行集的结果集一条条进行处理的。所以为解决这一困难，就出现ORM这一个对象和数据之间映射技术。</p>
<p style="text-indent: 2em">3、在JasperReports中使用Hibernate</p>
<p style="text-indent: 2em">Hibernate是一个开发源代码的对象关系映射框架，它对JDBC进行了非常轻量级的对象封装，使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。</p>
<p style="text-indent: 2em">Hibernate可以应用在任何使用JDBC的场合，既可以在Java的客户端程序使用，也可以在Servlet/JSP的Web应用中使用，最具革意义的是，Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。</p>
<p style="text-indent: 2em">package src;</p>
<p style="text-indent: 2em">import java.util.HashMap;</p>
<p style="text-indent: 2em">import java.util.List;</p>
<p style="text-indent: 2em">import net.sf.jasperreports.engine.JRException;</p>
<p style="text-indent: 2em">import net.sf.jasperreports.engine.JasperCompileManager;</p>
<p style="text-indent: 2em">import net.sf.jasperreports.engine.JasperFillManager;</p>
<p style="text-indent: 2em">import net.sf.jasperreports.engine.JasperPrint;</p>
<p style="text-indent: 2em">import net.sf.jasperreports.engine.JasperReport;</p>
<p style="text-indent: 2em">import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;</p>
<p style="text-indent: 2em">import net.sf.jasperreports.engine.design.JasperDesign;</p>
<p style="text-indent: 2em">import net.sf.jasperreports.engine.xml.JRXmlLoader;</p>
<p style="text-indent: 2em">import net.sf.jasperreports.engine.JasperExportManager;</p>
<p style="text-indent: 2em">import org.hibernate.HibernateException;</p>
<p style="text-indent: 2em">import org.hibernate.MappingException;</p>
<p style="text-indent: 2em">import org.hibernate.Session;</p>
<p style="text-indent: 2em">import org.hibernate.SessionFactory;</p>
<p style="text-indent: 2em">import org.hibernate.cfg.Configuration;</p>
<p style="text-indent: 2em">public class Simple1 {</p>
<p style="text-indent: 2em">public static void main(String args[]){</p>
<p style="text-indent: 2em">&nbsp;&nbsp; String sampleReportFile=new String("reports/sampleReport.jrxml");</p>
<p style="text-indent: 2em">&nbsp;&nbsp; //Hibernate Result Set Holder.</p>
<p style="text-indent: 2em">&nbsp;&nbsp; List bowlerInfo=null;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; try{</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //Configure the Hibernate session</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; Configuration cfg=new Configuration();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; cfg.addResource("hibernate-mapping.xml");</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; SessionFactory sessions=cfg.buildSessionFactory();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //Open the Hibernate Session</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; Session session=sessions.openSession();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //Returns all SampleData records.</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //Simple POJO object.</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; bowlerInfo=session.createQuery("from SampleData").list();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //Fill the parameters</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; HashMap parameters=new HashMap();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; parameters.put("ReportTitle","Bowling Scores");</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; parameters.put("NoOfGames", new Integer(3));</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //Load the sample report file from the XML file</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //into the JasperDesign object.</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; JasperDesign design=JRXmlLoader.load(sampleReportFile);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //Compile the Report in Memory storing it in a JasperReport object</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //no .jasper report file is created.</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; JasperReport report=new JasperCompileManager().compileReport(design);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //Fill the report using the JRBeanCollectionDataSource passed</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //a Hibernate query result set.</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; JasperPrint print=JasperFillManager.fillReport(report,parameters,new JRBeanCollectionDataSource(bowlerInfo));</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //Export to PDF file.</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; JasperExportManager.exportReportToPdfFile(print,"simpleHibernatExample.pdf");</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; //Close the Hibernate Session.</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; session.close();&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; }catch(JRException jre){</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; jre.printStackTrace();</p>
<p style="text-indent: 2em">&nbsp;&nbsp; }catch(MappingException me){</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; me.printStackTrace();</p>
<p style="text-indent: 2em">&nbsp;&nbsp; }catch(HibernateException he){</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; he.printStackTrace();</p>
<p style="text-indent: 2em">&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">}</p>
<p style="text-indent: 2em">}</p>
<p style="text-indent: 2em">当Hibernate检索返回集合类型的对象时，使用JRBeanCollection接口可将数据通过Hibernate的POJO（Plain Old Java Object）实例映射到报表域中，使用JRXmlLoader.load(templateName)方法加载报表模板，最后通过JasperFillManager方法将数据填入模板中。</p>
<p style="text-indent: 2em">本例使用JasperExportManager.exportReportToPdfFile()方法将报表输出为PDF格式。JasperReports提供的net.sf.jasperreports.engine.JRExporter接口可以方便的将报表输出为PDF、XLS、CSV、RTF、HTML或者XML格式，目前以PDF和EXCEL格式较为通用。</p>
<p style="text-indent: 2em">4、总结</p>
<p style="text-indent: 2em">在JasperReports中使用了Hibernate以后，如果随业务更换数据源的话，只需要更好Hibernate的映射文件，极大提高了代码的可重用性，同时由于Hibernate本身对于查询的优化，也能很好的提高整个应用的效率，尽可能的节省开发时间。</p>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;转载自: <a title="JasperReports+iReport在eclipse中的使用" href="http://blog.163.com/meijuan_520/blog/static/85281982007717112120791/">JasperReports+iReport在eclipse中的使用</a> 
<img src ="http://www.blogjava.net/kxx129/aggbug/191421.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2008-04-08 11:52 <a href="http://www.blogjava.net/kxx129/archive/2008/04/08/191421.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>I/O流的设计（Java的InputStream/OuputStream和Reader/Writer的C++实现）(转)</title><link>http://www.blogjava.net/kxx129/archive/2007/08/25/139241.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Sat, 25 Aug 2007 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2007/08/25/139241.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/139241.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2007/08/25/139241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/139241.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/139241.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: I/O流的设计C++通用框架的设计 作者：naven1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I/O流介绍I/O流，即输入/输出流（Input/Output Stream），是软件框架中的核心系统。对程序设计语言设计者来说，设计一个令人满意的I/O系统，是件极艰巨的任务，也是不可缺少的基础设施。C++的标...&nbsp;&nbsp;<a href='http://www.blogjava.net/kxx129/archive/2007/08/25/139241.html'>阅读全文</a><img src ="http://www.blogjava.net/kxx129/aggbug/139241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2007-08-25 11:39 <a href="http://www.blogjava.net/kxx129/archive/2007/08/25/139241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自动登录实现助记</title><link>http://www.blogjava.net/kxx129/archive/2007/07/26/132579.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Thu, 26 Jul 2007 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2007/07/26/132579.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/132579.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2007/07/26/132579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/132579.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/132579.html</trackback:ping><description><![CDATA[&nbsp;
<p><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>生成</span><span>auto login key</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Id = Random String</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cookie autoLogin = new Cookie(&#8220;autoLogin&#8221; , id);</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;autoLogin set</span><span>有效期限</span></p>
&nbsp;
<p><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>自动登录</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Request.getCookies[]</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取</span><span>auto login key.</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检索自动登录管理表&#8230;&#8230;</span></p>
<img src ="http://www.blogjava.net/kxx129/aggbug/132579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2007-07-26 16:46 <a href="http://www.blogjava.net/kxx129/archive/2007/07/26/132579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Apache的Digester来解析XML文档</title><link>http://www.blogjava.net/kxx129/archive/2007/06/07/122656.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Thu, 07 Jun 2007 09:26:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2007/06/07/122656.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/122656.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2007/06/07/122656.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/122656.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/122656.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.&nbsp;&nbsp;&nbsp;&nbsp; 概述解析XML文档方面有不少的方法，也有不少的工具包可用，这里介绍的是来自Apache Jakarta的Digester，使用其解析XML文件非常方便而不需要过多的关心底层的具体解析过程。Digester最早出现在Struts中，后来随着Struts的发展以及其的公用性而被提到commens中独自立项，其底层实现的是SAX解析。当前版本...&nbsp;&nbsp;<a href='http://www.blogjava.net/kxx129/archive/2007/06/07/122656.html'>阅读全文</a><img src ="http://www.blogjava.net/kxx129/aggbug/122656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2007-06-07 17:26 <a href="http://www.blogjava.net/kxx129/archive/2007/06/07/122656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Log4j简明手册(转)</title><link>http://www.blogjava.net/kxx129/archive/2007/06/06/122296.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Wed, 06 Jun 2007 01:58:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2007/06/06/122296.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/122296.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2007/06/06/122296.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/122296.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/122296.html</trackback:ping><description><![CDATA[<h1><font size=3><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>概述</span></font></h1>
<p><span>本文主要描述</span><span>Log4j</span><span>的</span><span>API</span><span>的唯一特性和它的设计原理。</span><span>Log4j</span><span>是一个基于许多作者的开放源码的项目。它允许开发员以任意的间隔来控制日志的输出。它通过设在外部的配置文件而达到运行时灵活的设置。最重要的是，</span><span>Log4j</span><span>有一个平稳的学习曲线。注意：根据来自用户的反馈判断，它很容易使人上瘾。</span></p>
<p>&nbsp;<font size=3><strong><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>导言</span></strong></font></p>
<p><span>几乎所有的大型应用程序都包括它的自己的日志和跟踪</span><span>API</span><span>。顺应这个规则，</span><span>E.U. SEMPER </span><span>项目决定写它自己的跟踪</span><span>PAI</span><span>。这是</span><span>1996</span><span>年初。在无数次加强，几次变形和许多工作后，那个</span><span>API</span><span>变成了如今的</span><span>Log4j</span><span>，一个流行的</span><span>java</span><span>日志包。这个包以</span><span>Apache Software License</span><span>协议发布，一个成熟的开放源吗协议。最新的</span><span>Log4j</span><span>版本，包括全部的源码，</span><span>class</span><span>文件和文档，你可以在</span><span>http://jakarta.apache.org/Log4j/</span><span>上找到。顺便，</span><span>Log4j</span><span>已经给</span><span>C, C++, C#, Python, Ruby, and Eiffel </span><span>语言都提供了接口。</span></p>
<p>&nbsp;<span>为了调试而插入日志输出到代码里是一个低技术成分的方法，但它可能也是唯一的方法，因为调试器并不是一直可用或者可以适应的，尤其对于多线程的分布使式的大型程序而言。</span></p>
<p>&nbsp;<span>经验指出调试是软件开发周期中一个重要的组成部分。</span></p>
<p><span>Log4j</span><span>拥有几个优点：</span></p>
<p><span>首先，它提供关于运行程序的准确的环境。一旦代码被插入，不需要人工干预就可以产生调试信息。</span></p>
<p><span>其次，日志输出可以被有计划的保存在永久媒体中以便日后研究。</span></p>
<p><span>另外，除了在开发周期中，一个充分详尽的日志包可以被用来作为以后的统计工具。</span></p>
<p>&nbsp;<span>Log4j</span><span>当然还有它的缺点，它可能减慢程序。如果太详细，它可能导致屏幕盲目滚动。排除这些情况，</span><span>Log4j</span><span>是可靠的，快速的，可以扩展的。因为日志很少是一个应用程序的主要目的</span><span>, </span><span>设计者们正努力使得</span><span>Log4j API</span><span>学习和使用简单化。</span></p>
<p><font size=4><strong>&nbsp;<span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>日志类别、输出源和布局</span></strong></font></p>
<p><span>Log4j</span><span>有三个主要的组件：日志类别（</span><span>Loggers</span><span>）、输出源（</span><span> Appenders</span><span>）和布局（</span><span>Layouts</span><span>）。这三种类型</span><span>的组件一起工作使得开发员可以根据信息的类型和级别记录它们，并且在运行时控制这些信息的输出格式和位置。</span></p>
<p>&nbsp;<font size=3><span>3.1<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>日志类别的层次结构</span><span>(Loggers)</span></font></p>
<p><span>Log4j</span><span>首要的相对于简单的使用</span><span>System.out.println()</span><span>方法的优点是基于它的在禁止一些特定的信息输出的同时不妨碍其它信息的输出的能力。这个能力源自于日志命名空间，也就是说，所有日志声明的空间，它根据一些开发员选择的公式而分类。以前的观察引导我们选择类别作为包的中心概念。然而，自从</span><span>Log4j</span><span>的</span><span>1.2</span><span>版本，</span><span>Logger</span><span>类被</span><span>Catalog</span><span>类所取代，对于那些熟悉</span><span>Log4j</span><span>以前版本的人来说，</span><span>Logger</span><span>类可以被想象成仅仅是</span><span>Category </span><span>类的别名。</span></p>
<p>&nbsp;<span>Loggers </span><span>被指定为实体，</span><span>Logger</span><span>的名字是大小写敏感的，它们遵循以下的命名</span></p>
<p><span>规则：</span></p>
<p><span>&#178;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>命名继承</span></p>
<p><span>如果类别的名称（后面加一个点）是其子类别名称的前缀，则它就是另一个类别的祖辈。</span></p>
<p><span>如果一个类别</span><span>(Logger)</span><span>和它的子类别之间没有其它的继承关系，我们就称之为</span><span>parent</span><span>与</span><span>child</span><span>的关系。</span></p>
<p>&nbsp;<span>例如，类别</span><span>"com.foo"</span><span>是类别</span><span>"com.foo.Bar"</span><span>的parent。相似的，</span><span>"java"</span><span>是</span><span>"java.util"</span><span>的parent，是</span><span>"java.util.Vector"</span><span>的父辈。</span><span>.</span><span>这个命名规则应该被大多数的开发员所熟悉。</span></p>
<p>&nbsp;<span>根</span><span>(root) </span><span>类别位于</span><span>logger</span><span>继承结构的最上层。它有两种例外：</span></p>
<p><span>1.</span><span>它一直存在</span></p>
<p><span>2.</span><span>它不能根据名称而获得。</span>&nbsp;</p>
<p><span>调用类的静态方法</span><span>Logger.getRootLogger</span><span>可以得到它。其它所有的</span><span>Logger</span><span>可以通过静态方法</span><span>Logger.getLogger</span><span>而得到它们自己的实例。这个方法取希望的</span><span>Logger</span><span>名作为参数。</span><span>Logger</span><span>的一些基本的方法示例如下：</span></p>
<p>&nbsp;<span>&nbsp;package org.apache.Log4j;</span></p>
<p><span><span>&nbsp;&nbsp;</span></span><span>&nbsp;public Logger class {</span></p>
<p><span><span>&nbsp;&nbsp;</span></span><span><span>&nbsp;&nbsp;&nbsp; </span>// Creation &amp; retrieval methods:</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>public static Logger getRootLogger();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>public static Logger getLogger(String name);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>// printing methods:</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>public void debug(Object message);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>public void info(Object message);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>public void warn(Object message);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>public void error(Object message);</span></p>
<p>&nbsp;<span>&nbsp;// generic printing method:</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>public void log(Level l, Object message);</span></p>
<p><span>}</span></p>
<p>&nbsp;<span>Loggers</span><span>可以被分配的级别。所有级别的集合包括：</span></p>
<p><span>DEBUG</span></p>
<p><span>INFO</span></p>
<p><span>WARN</span></p>
<p><span>ERROR</span></p>
<p><span>FATAL</span></p>
<p>&nbsp;<span>它们被定义于</span><span>org.apache.Log4j.Level </span><span>类。虽然我们不鼓励，但是你们可以通过继承</span><span>Level</span><span>类来定义你们自己的级别。我们随后将介绍一个比较好的方法。</span></p>
<p>&nbsp;<span>如果一个</span><span>Logger</span><span>没有被分配一个级别，那么它将从一个被分配了级别的最接近它的ancestor哪里继承。</span></p>
<p><span>正规的说：</span></p>
<p>&nbsp;<span>&#178;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>级别继承</span></p>
<p><span>对于一个给定的</span><span>Logger C</span><span>，它的继承的级别等于从</span><span>C</span><span>开始上溯到的第一个拥有非空级别的</span><span>Logger</span><span>的级别。</span></p>
<p>&nbsp;<span>为了保证所有的</span><span>Logger</span><span>最终能够继承到一个级别，根</span><span>Logger</span><span>通常有一个已经定义了的级别。</span></p>
<p>&nbsp;<span>以下四个表中的数据演示了根据以上规则得到的结果。</span></p>
<p>&nbsp;
<table cellPadding=0 border=1>
    <tbody>
        <tr>
            <td>
            <p align=center><span>类别名</span></p>
            </td>
            <td>
            <p align=center><span>分配的级别</span></p>
            </td>
            <td>
            <p align=center><span>继承的级别</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>root</span></p>
            </td>
            <td>
            <p><span>Proot</span></p>
            </td>
            <td>
            <p><span>Proot</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>X </span></p>
            </td>
            <td>
            <p><span>none</span></p>
            </td>
            <td>
            <p><span>Proot</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>X.Y </span></p>
            </td>
            <td>
            <p><span>none</span></p>
            </td>
            <td>
            <p><span>Proot</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>X.Y.Z</span></p>
            </td>
            <td>
            <p><span>none</span></p>
            </td>
            <td>
            <p><span>Proot</span></p>
            </td>
        </tr>
        <tr>
            <td colSpan=3>
            <p align=center><span>Example 1</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;<span>在例子</span><span>1</span><span>中，只有根</span><span>Logger</span><span>定义了一个级别，它的级别的值</span><span>--"Proot"</span><span>被所有其它的</span><span>Loggers X, X.Y, </span><span>和</span><span>X.Y.Z</span><span>所继承。</span></p>
<p>&nbsp;
<table cellPadding=0 border=1>
    <tbody>
        <tr>
            <td>
            <p align=center><strong><span>类别名</span></strong><strong></strong></p>
            </td>
            <td>
            <p align=center><strong><span>分配的级别</span></strong><strong></strong></p>
            </td>
            <td>
            <p align=center><strong><span>继承的级别</span></strong><strong></strong></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>root</span></p>
            </td>
            <td>
            <p><span>Proot</span></p>
            </td>
            <td>
            <p><span>Proot</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>X </span></p>
            </td>
            <td>
            <p><span>Px</span></p>
            </td>
            <td>
            <p><span>Px</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>X.Y </span></p>
            </td>
            <td>
            <p><span>Pxy</span></p>
            </td>
            <td>
            <p><span>Pxy</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>X.Y.Z</span></p>
            </td>
            <td>
            <p><span>Pxyz</span></p>
            </td>
            <td>
            <p><span>Pxyz</span></p>
            </td>
        </tr>
        <tr>
            <td colSpan=3>
            <p align=center><span>Example 2</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;<span>在例子</span><span>2</span><span>中，所有的</span><span>Logger</span><span>都有一个被分配的级别值，所以它们不需要级别继承。</span></p>
<p>&nbsp;
<table cellPadding=0 border=1>
    <tbody>
        <tr>
            <td>
            <p align=center><strong><span>类别名</span></strong><strong></strong></p>
            </td>
            <td>
            <p align=center><strong><span>分配的级别</span></strong><strong></strong></p>
            </td>
            <td>
            <p align=center><strong><span>继承的级别</span></strong><strong></strong></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>root</span></p>
            </td>
            <td>
            <p><span>Proot</span></p>
            </td>
            <td>
            <p><span>Proot</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>X </span></p>
            </td>
            <td>
            <p><span>Px</span></p>
            </td>
            <td>
            <p><span>Px</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>X.Y </span></p>
            </td>
            <td>
            <p><span>none</span></p>
            </td>
            <td>
            <p><span>Px</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>X.Y.Z</span></p>
            </td>
            <td>
            <p><span>Pxyz</span></p>
            </td>
            <td>
            <p><span>Pxyz</span></p>
            </td>
        </tr>
        <tr>
            <td colSpan=3>
            <p align=center><span>Example 3</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;<span>在例子</span><span>3</span><span>中，根</span><span>Logger</span><span>，以及</span><span>X</span><span>和</span><span>X.Y.Z</span><span>被分别分配了级别</span><span>Proot</span><span>，</span><span>Px</span><span>和</span><span>Pxyz</span><span>。</span><span>Logger X.Y</span><span>从它的parent X继承了级别值Px。</span></p>
<p>&nbsp;
<table cellPadding=0 border=1>
    <tbody>
        <tr>
            <td>
            <p align=center><strong><span>类别名</span></strong><strong></strong></p>
            </td>
            <td>
            <p align=center><strong><span>分配的级别</span></strong><strong></strong></p>
            </td>
            <td>
            <p align=center><strong><span>继承的级别</span></strong><strong></strong></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>root</span></p>
            </td>
            <td>
            <p><span>Proot</span></p>
            </td>
            <td>
            <p><span>Proot</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>X </span></p>
            </td>
            <td>
            <p><span>Px</span></p>
            </td>
            <td>
            <p><span>Px</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>X.Y </span></p>
            </td>
            <td>
            <p><span>none</span></p>
            </td>
            <td>
            <p><span>Px</span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>X.Y.Z</span></p>
            </td>
            <td>
            <p><span>none</span></p>
            </td>
            <td>
            <p><span>Px</span></p>
            </td>
        </tr>
        <tr>
            <td colSpan=3>
            <p align=center><span>Example 4</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;<span>在例子</span><span>4</span><span>中，根</span><span>Logger</span><span>和</span><span>X</span><span>被分别分配了级别</span><span>"Proot"</span><span>和</span><span>"Px"</span><span>，</span><span>Logger X.Y </span><span>和</span><span> X.Y.Z</span><span>从被分配了级别的最接近它们的ancestor </span><span>X</span><span>那里得到继承。</span></p>
<p>&nbsp;<span>我们需要通过调用</span><span>Logger</span><span>的输出的实例方法之一来实现日志请求。这些输出的方法是</span><span>debug, info, warn, error, fatal </span><span>和</span><span> log.</span></p>
<p>&nbsp;<span>通过定义输出方法来区分日志的请求的级别。例如，如果</span><span>c</span><span>是一个</span><span>Logger</span><span>的实例，那么声明</span><span> c.info </span><span>就是一个</span><span>INFO</span><span>级别的日志请求。</span></p>
<p>&nbsp;<span>如果一个日志的请求的级别高于或等于日志的级别那么它就能被<em>启用</em>。反之，将被<em>禁用</em>。一个没有被安排级别的</span><span>Logger</span><span>将从它的父辈中得到继承。这个规则总结如下。</span></p>
<p>&nbsp;<span>&#178;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>基本的选择规则</span></p>
<p><span>假如在一个级别为</span><span>q</span><span>的</span><span>Logger</span><span>中发生一个级别为</span><span>p</span><span>的日志请求，如果</span><span>p&gt;=q,</span><span>那么请求将被<em>启用</em>。</span></p>
<p>&nbsp;<span>这是</span><span>Log4j</span><span>的核心原则。它假设级别是有序的。对于标准级别，我们定义</span><span>DEBUG &lt; INFO &lt; WARN &lt; ERROR &lt; FATAL. </span></p>
<p>&nbsp;<span>以下是关于这条规则的一个例子。</span></p>
<p>&nbsp;<span><span>&nbsp;&nbsp; </span>// get a logger instance named "com.foo"</span></p>
<p><span><span>&nbsp;&nbsp; </span>Logger&nbsp;logger = Logger.getLogger("com.foo");</span></p>
<p>&nbsp;<span><span>&nbsp;&nbsp; </span>// Now set its level. Normally you do not need to set the </span></p>
<p><span><span>&nbsp;&nbsp; </span>// level of a logger progamitcally. This is usually done </span></p>
<p><span><span>&nbsp;&nbsp; </span>// in configuration files.</span></p>
<p><span><span>&nbsp;&nbsp; </span>cat.setLevel(Level.INFO);</span></p>
<p>&nbsp;<span>&nbsp;Logger barlogger = Logger.getLogger("com.foo.Bar");</span></p>
<p><span>&nbsp;</span><span><span>&nbsp;&nbsp; </span>// This request is enabled, because WARN &gt;= INFO.</span></p>
<p><span><span>&nbsp;&nbsp; </span>logger.warn("Low fuel level.");</span></p>
<p><span><span>&nbsp;&nbsp;</span></span><span><span>&nbsp;&nbsp; </span>// This request is disabled, because DEBUG &lt; INFO.</span></p>
<p><span><span>&nbsp;&nbsp; </span>logger.debug("Starting search for nearest gas station."); </span></p>
<p><span>&nbsp;</span><span><span>&nbsp;&nbsp; </span>// The logger instance barlogger, named "com.foo.Bar",</span></p>
<p><span><span>&nbsp;&nbsp; </span>// will inherit its level from the logger named </span></p>
<p><span><span>&nbsp;&nbsp; </span>// "com.foo" Thus, the following request is enabled </span></p>
<p><span><span>&nbsp;&nbsp; </span>// because INFO &gt;= INFO.&nbsp;</span></p>
<p><span><span>&nbsp;&nbsp; </span>barlogger.info("Located nearest gas station."); </span></p>
<p>&nbsp;<span><span>&nbsp;&nbsp; </span>// This request is disabled, because DEBUG &lt; INFO.</span></p>
<p><span><span>&nbsp;&nbsp; </span>barlogger.debug("Exiting gas station search"); </span></p>
<p>&nbsp;<span>调用</span><span>getLogger</span><span>方法将返回一个同名的</span><span>Logger</span><span>对象的实例。</span></p>
<p>&nbsp;<span>例如，</span></p>
<p><span><span>&nbsp;&nbsp; </span>Categoty x = Logger.getLogger("wombat");</span></p>
<p><span><span>&nbsp;&nbsp; </span>Categoty y = Logger.getLogger("wombat");</span></p>
<p><span>&nbsp;</span><span>x</span><span>和</span><span>y</span><span>参照的是同一个</span><span>Logger</span><span>对象。</span></p>
<p>&nbsp;<span>这样我们就可以先定义一个</span><span>Logger</span><span>，然后在代码的其它地方不需传参就可以重新得到我们已经定义了的</span><span>Logger</span><span>的实例</span><span>.</span></p>
<p><span>同基本的生物学理论</span><span>--</span><span>父先于子相反，</span><span>Log4j </span><span>的</span><span>loggers</span><span>可以以任何顺序创造和配置。特别是，一个后实例化的</span><span>"</span><span>p</span><span>arent"logger</span><span>能够找到并且连接它的子</span><span>logger</span><span>。</span></p>
<p>&nbsp;<span>配置</span><span>Log4j</span><span>的环境通常在一个应用程序被初始化的时候进行，最好的方法是通过读一个配置文件。这个方法我们将简短介绍。</span></p>
<p>&nbsp;<span>Log4j</span><span>使得通过软件组件命名</span><span>logger</span><span>很容易。我们可以通过</span><span>Logger</span><span>的静态的初始化方法在每一个类里定义一个</span><span>logger</span><span>，令</span><span>logger</span><span>的名字等于类名的全局名，而实现logger的命名。这是一个实效的简单的定义一个</span><span>logger</span><span>的</span><span>方法。因为日志输出带有产生日志的类的名字，这个命名策略使得我们更容易定位到一个日志信息的来源。虽然普通，但却是命名</span><span>logger</span><span>的常用策略之一。</span><span>Log4j</span><span>没有限制定义</span><span>logger</span><span>的可能。开发员可以自由的按照它们的意愿定义</span><span>logger</span><span>的名称。</span></p>
<p>&nbsp;<span>然而，以类的所在位置来命名</span><span>Logger</span><span>好象是目前已知的最好方法。</span></p>
<p>&nbsp;<font size=3><span>3.2<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>输出源（</span><span>Appenders</span><span>）和布局（</span><span>Layouts</span><span>）</span></font></p>
<p><span>&nbsp;</span><span>有选择的能用或者禁用日志请求仅仅是</span><span>Log4j</span><span>的一部分功能。</span><span>Log4j</span><span>允许日志请求被输出到多个输出源。用</span><span>Log4j</span><span>的话说，一个输出源被称做一个</span><span>Appender. </span><span>。</span><span>Appender</span><span>包括</span><span>console</span><span>（控制台）</span><span>, files</span><span>（文件）</span><span>, GUI components</span><span>（图形的组件）</span><span>, remote socket servers</span><span>（</span><span>socket </span><span>服务）</span><span>, JMS</span><span>（</span><span>java</span><span>信息服务）</span><span>, NT Event Loggers</span><span>（</span><span>NT</span><span>的事件日志）</span><span>, and remote UNIX Syslog daemons</span><span>（远程</span><span>UNIX</span><span>的后台日志服务）。它也可以做到异步记录。</span></p>
<p>&nbsp;<span>一个</span><span>logger</span><span>可以设置超过一个的</span><span>appender</span><span>。</span></p>
<p>&nbsp;<span>用</span><span>addAppender </span><span>方法添加一个</span><span>appender</span><span>到一个给定的</span><span>logger</span><span>。对于一个给定的</span><span>logger</span><span>它每个生效的日志请求都被转发到该</span><span>logger</span><span>所有的</span><span>appender</span><span>上和该</span><span>logger</span><span>的父辈</span><span>logger</span><span>的</span><span>appender</span><span>上。换句话说，</span><span>appender</span><span>自动从它的父辈获得继承。举例来说，如果一个根</span><span>logger</span><span>拥有一个</span><span>console appender</span><span>，那么所有生效的日志请求至少会被输出到</span><span>console</span><span>上。如果一个名为</span><span>C</span><span>的</span><span>logger</span><span>有一个</span><span>file</span><span>类型的</span><span>appender</span><span>，那么它就会对它自己以及所有它的子</span><span>logger</span><span>生效。我们也可以通过设置</span><span>appender</span><span>的</span><span>additivity flag </span><span>为</span><span>false</span><span>，来重载</span><span>appender</span><span>的默认行为，以便继承的属性不在生效。</span></p>
<p>&nbsp;&nbsp;<span>调节输出源（</span><span>appender）</span><span>添加性的规则如下。</span></p>
<p>&nbsp;<span>输出源的可<span>添加性（<span>Appender Additivity ）</span></span></span></p>
<p><span>一个名为</span><span>C</span><span>的</span><span>logger</span><span>的日志定义的输出将延续到它自身以及它的ancestor </span><span><font face=宋体></font>logger</span><span>的</span><span>appenders</span><span>。这就是术语</span><span>"appender additivity"</span><span>的含义。</span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></span></p>
<p><span>然而，</span><span>logger C</span><span>的一个</span><span>ancestor logger P</span><span>，它的附加标志被设为</span><span>false</span><span>，那么</span><span>C</span><span>的输出将被定位到所有</span><span>C</span><span>的</span><span>appender</span><span>，以及从它开始上溯到</span><span>P</span><span>的所有ancestor </span><span>logger的appender</span><span>。</span></p>
<p><span>Loggers</span><span>的附加标记（</span><span>additivity flag</span><span>）默认为</span><span>true</span><span>。</span></p>
<p>&nbsp;<span>下表是一个例子。</span></p>
<div align=center>
<table cellPadding=0 border=1>
    <tbody>
        <tr>
            <td>
            <p align=center><strong><span>Logger<br>Name </span></strong><strong></strong></p>
            </td>
            <td>
            <p align=center><strong><span>Added<br>Appenders </span></strong><strong></strong></p>
            </td>
            <td>
            <p align=center><strong><span>Additivity<br>Flag </span></strong><strong></strong></p>
            </td>
            <td>
            <p align=center><strong><span>Output Targets </span></strong><strong></strong></p>
            </td>
            <td>
            <p align=center><strong><span>Comment </span></strong><strong></strong></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>root </span></p>
            </td>
            <td>
            <p><span>A1 </span></p>
            </td>
            <td>
            <p><span>not applicable </span></p>
            </td>
            <td>
            <p><span>A1 </span></p>
            </td>
            <td>
            <p><span>The root logger is anonymous but can be accessed with the Logger.getRootLogger() method. There is no default appender attached to root. </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>x </span></p>
            </td>
            <td>
            <p><span>A-x1, A-x2 </span></p>
            </td>
            <td>
            <p><span>true </span></p>
            </td>
            <td>
            <p><span>A1, A-x1, A-x2 </span></p>
            </td>
            <td>
            <p><span>Appenders of "x" and root. </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>x.y </span></p>
            </td>
            <td>
            <p><span>none </span></p>
            </td>
            <td>
            <p><span>true </span></p>
            </td>
            <td>
            <p><span>A1, A-x1, A-x2 </span></p>
            </td>
            <td>
            <p><span>Appenders of "x" and root. </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>x.y.z </span></p>
            </td>
            <td>
            <p><span>A-xyz1 </span></p>
            </td>
            <td>
            <p><span>true </span></p>
            </td>
            <td>
            <p><span>A1, A-x1, A-x2, A-xyz1 </span></p>
            </td>
            <td>
            <p><span>Appenders in "x.y.z", "x" and root. </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>security </span></p>
            </td>
            <td>
            <p><span>A-sec </span></p>
            </td>
            <td>
            <p><span>false</span><span> </span></p>
            </td>
            <td>
            <p><span>A-sec </span></p>
            </td>
            <td>
            <p><span>No appender accumulation since the additivity flag is set to </span><code><span>false</span></code><span>. </span></p>
            </td>
        </tr>
        <tr>
            <td>
            <p><span>security.access </span></p>
            </td>
            <td>
            <p><span>none </span></p>
            </td>
            <td>
            <p><span>true </span></p>
            </td>
            <td>
            <p><span>A-sec </span></p>
            </td>
            <td>
            <p><span>Only appenders of "security" because the additivity flag in "security" is set to </span><code><span>false</span></code><span>. </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p>&nbsp;<span>经常，用户希望自定义不但输出源，而且定义输出格式。这个是通过在一个</span><span>appender</span><span>上附加一个</span><span>layout</span><span>来完成的。</span><span>layout</span><span>是负责根据用户的希望来格式化日志请求。而</span><span>appender</span><span>是负责发送格式化的输出到它的目的地。</span><span>PatternLayout，作为<span>Log4j</span></span><span>标准版</span><span>中的一部分，让用户指以类似<span>C</span><span>语言的</span><span>printf</span><span>方法的格式来指定</span>日志的输出格式</span><span>。</span></p>
<p><span>例如，转化模式为</span><span>"%r [%t] %-5p %c - %m%n" </span><span>的</span><span>PatternLayout </span><span>将输出类似如下的信息：</span></p>
<p><span>176 [main] INFO&nbsp;org.foo.Bar - Located nearest gas station.</span></p>
<p><span>第一个栏位是自从程序开始后消逝的毫秒数。</span></p>
<p><span>第二个栏位是做出日志的线程。</span></p>
<p><span>第三个栏位是</span><span>log</span><span>的级别。</span></p>
<p><span>第四个栏位是日志请求相关的</span><span>logger</span><span>的名字。而</span><span>"-"</span><span>后的文字是信息的表述。</span></p>
<p><span>Log4j</span><span>将根据用户定义的公式来修饰日志信息的内容。例如，如果你经常需要记录</span><span>Oranges</span><span>，一个在你当前的项目被用到的对象类型，那么你可以注册一个</span><span>OrangeRenderer </span><span>，它将在一个<span>orange</span><span>需要被记录时</span>被调用</span><span>。</span></p>
<p><span>对象渲染类似的类的结构继承。例如，假设</span><span>oranges</span><span>是</span><span>fruits</span><span>，如果你注册了一个</span><span>FruitRenderer</span><span>，</span><span>所有的水果包括</span><span>oranges</span><span>将被</span><span>FruitRenderer</span><span>所渲染。除非你注册了一个</span><span>orange</span><span>。</span></p>
<p>&nbsp;<span>对象渲染必须实现</span><span>ObjectRenderer</span><span>接口。</span></p>
<img src ="http://www.blogjava.net/kxx129/aggbug/122296.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2007-06-06 09:58 <a href="http://www.blogjava.net/kxx129/archive/2007/06/06/122296.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Log4J 最佳实践之全能配置文件(转）</title><link>http://www.blogjava.net/kxx129/archive/2007/06/06/122295.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Wed, 06 Jun 2007 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2007/06/06/122295.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/122295.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2007/06/06/122295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/122295.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/122295.html</trackback:ping><description><![CDATA[LOG4J的配置之简单使它遍及于越来越多的应用中了：Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了， <br><br><br><br>log4j.rootLogger=DEBUG,CONSOLE,A1,im <br>log4j.addivity.org.apache=true <br><br><br><br>#&nbsp;应用于控制台 <br><br>log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender <br>log4j.appender.Threshold=DEBUG <br>log4j.appender.CONSOLE.Target=System.out <br>log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout <br>log4j.appender.CONSOLE.layout.ConversionPattern=[framework]&nbsp;%d&nbsp;-&nbsp;%c&nbsp;-%-4r&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;%x&nbsp;-&nbsp;%m%n <br>#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]&nbsp;n%c[CATEGORY]%n%m[MESSAGE]%n%n <br><br><br>#应用于文件 <br><br>log4j.appender.FILE=org.apache.log4j.FileAppender <br>log4j.appender.FILE.File=file.log <br>log4j.appender.FILE.Append=false <br>log4j.appender.FILE.layout=org.apache.log4j.PatternLayout <br>log4j.appender.FILE.layout.ConversionPattern=[framework]&nbsp;%d&nbsp;-&nbsp;%c&nbsp;-%-4r&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;%x&nbsp;-&nbsp;%m%n <br>#&nbsp;Use&nbsp;this&nbsp;layout&nbsp;for&nbsp;LogFactor&nbsp;5&nbsp;analysis <br><br><br><br>#&nbsp;应用于文件回滚 <br><br>log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender <br>log4j.appender.ROLLING_FILE.Threshold=ERROR <br>log4j.appender.ROLLING_FILE.File=rolling.log <br>log4j.appender.ROLLING_FILE.Append=true <br>log4j.appender.ROLLING_FILE.MaxFileSize=10KB <br>log4j.appender.ROLLING_FILE.MaxBackupIndex=1 <br>log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout <br>log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework]&nbsp;%d&nbsp;-&nbsp;%c&nbsp;-%-4r&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;%x&nbsp;-&nbsp;%m%n <br><br><br>#应用于socket <br>log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender <br>log4j.appender.SOCKET.RemoteHost=localhost <br>log4j.appender.SOCKET.Port=5001 <br>log4j.appender.SOCKET.LocationInfo=true <br>#&nbsp;Set&nbsp;up&nbsp;for&nbsp;Log&nbsp;Facter&nbsp;5 <br>log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout <br>log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n <br><br><br>#&nbsp;Log&nbsp;Factor&nbsp;5&nbsp;Appender <br>log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender <br>log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 <br><br><br><br>#&nbsp;发送日志给邮件 <br><br>log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender <br>log4j.appender.MAIL.Threshold=FATAL <br>log4j.appender.MAIL.BufferSize=10 <br>log4j.appender.MAIL.From=web@www.wuset.com <br>log4j.appender.MAIL.SMTPHost=www.wusetu.com <br>log4j.appender.MAIL.Subject=Log4J&nbsp;Message <br>log4j.appender.MAIL.To=web@www.wusetu.com <br>log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout <br>log4j.appender.MAIL.layout.ConversionPattern=[framework]&nbsp;%d&nbsp;-&nbsp;%c&nbsp;-%-4r&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;%x&nbsp;-&nbsp;%m%n <br><br><br><br>#&nbsp;用于数据库 <br>log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender <br>log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test <br>log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver <br>log4j.appender.DATABASE.user=root <br>log4j.appender.DATABASE.password= <br>log4j.appender.DATABASE.sql=INSERT&nbsp;INTO&nbsp;LOG4J&nbsp;(Message)&nbsp;VALUES&nbsp;('[framework]&nbsp;%d&nbsp;-&nbsp;%c&nbsp;-%-4r&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;%x&nbsp;-&nbsp;%m%n') <br>log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout <br>log4j.appender.DATABASE.layout.ConversionPattern=[framework]&nbsp;%d&nbsp;-&nbsp;%c&nbsp;-%-4r&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;%x&nbsp;-&nbsp;%m%n <br><br><br>log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender <br>log4j.appender.A1.File=SampleMessages.log4j <br>log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' <br>log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout <br><br>#自定义Appender <br><br>log4j.appender.im&nbsp;=&nbsp;net.cybercorlin.util.logger.appender.IMAppender <br><br>log4j.appender.im.host&nbsp;=&nbsp;mail.cybercorlin.net <br>log4j.appender.im.username&nbsp;=&nbsp;username <br>log4j.appender.im.password&nbsp;=&nbsp;password <br>log4j.appender.im.recipient&nbsp;=&nbsp;corlin@cybercorlin.net <br><br>log4j.appender.im.layout=org.apache.log4j.PatternLayout <br>log4j.appender.im.layout.ConversionPattern&nbsp;=[framework]&nbsp;%d&nbsp;-&nbsp;%c&nbsp;-%-4r&nbsp;[%t]&nbsp;%-5p&nbsp;%c&nbsp;%x&nbsp;-&nbsp;%m%n 
<img src ="http://www.blogjava.net/kxx129/aggbug/122295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2007-06-06 09:55 <a href="http://www.blogjava.net/kxx129/archive/2007/06/06/122295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ThreadLocal的使用说明</title><link>http://www.blogjava.net/kxx129/archive/2007/04/12/110076.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Thu, 12 Apr 2007 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2007/04/12/110076.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/110076.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2007/04/12/110076.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/110076.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/110076.html</trackback:ping><description><![CDATA[早在Java 1.2推出之时，Java平台中就引入了一个新的支持：java.lang.ThreadLocal，给我们在编写多线程程序时提供了一种新的选择。使用这个工具类可以很简洁地编写出优美的多线程程序，虽然ThreadLocal非常有用，但是似乎现在了解它、使用它的朋友还不多。 <br><br>　　ThreadLocal是什么<br><br>　　ThreadLocal是什么呢？其实ThreadLocal并非是一个线程的本地实现版本，它并不是一个Thread，而是thread local variable（线程局部变量）。也许把它命名为ThreadLocalVar更加合适。线程局部变量（ThreadLocal）其实的功用非常简单，就是为每一个使用该变量的线程都提供一个变量值的副本，是每一个线程都可以独立地改变自己的副本，而不会和其它线程的副本冲突。从线程的角度看，就好像每一个线程都完全拥有该变量。线程局部变量并不是Java的新发明，在其它的一些语言编译器实现（如IBM XL FORTRAN）中，它在语言的层次提供了直接的支持。因为Java中没有提供在语言层次的直接支持，而是提供了一个ThreadLocal的类来提供支持，所以，在Java中编写线程局部变量的代码相对比较笨拙，这也许是线程局部变量没有在Java中得到很好的普及的一个原因吧。<br><br>　　ThreadLocal的设计<br><br>　　首先看看ThreadLocal的接口：<br><br>　　Object get() ; // 返回当前线程的线程局部变量副本&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected Object initialValue(); // 返回该线程局部变量的当前线程的初始值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void set(Object value); // 设置当前线程的线程局部变量副本的值<br><br>　　ThreadLocal有3个方法，其中值得注意的是initialValue()，该方法是一个protected的方法，显然是为了子类重写而特意实现的。该方法返回当前线程在该线程局部变量的初始值，这个方法是一个延迟调用方法，在一个线程第1次调用get()或者set(Object)时才执行，并且仅执行1次。ThreadLocal中的确实实现直接返回一个null：<br><br>protected Object initialValue() { return null; } <br><br>　　ThreadLocal是如何做到为每一个线程维护变量的副本的呢？其实实现的思路很简单，在ThreadLocal类中有一个Map，用于存储每一个线程的变量的副本。比如下面的示例实现：<br><br>public class ThreadLocal<br>{<br>　private Map values = Collections.synchronizedMap(new HashMap());<br>　public Object get()<br>　{<br>　　Thread curThread = Thread.currentThread(); <br>　　Object o = values.get(curThread); <br>　　if (o == null &amp;&amp; !values.containsKey(curThread))<br>　　{<br>　　　o = initialValue();<br>　　　values.put(curThread, o); <br>　　}<br>　　return o; <br>　}<br><br>　public void set(Object newValue)<br>　{<br>　　values.put(Thread.currentThread(), newValue);<br>　}<br><br>　public Object initialValue()<br>　{<br>　　return null; <br>　}<br>} <br><br>　　当然，这并不是一个工业强度的实现，但JDK中的ThreadLocal的实现总体思路也类似于此。<br><br>　　ThreadLocal的使用<br><br>　　如果希望线程局部变量初始化其它值，那么需要自己实现ThreadLocal的子类并重写该方法，通常使用一个内部匿名类对ThreadLocal进行子类化，比如下面的例子，SerialNum类为每一个类分配一个序号：<br><br>public class SerialNum <br>{<br>　// The next serial number to be assigned<br><br>　private static int nextSerialNum = 0; <br>　private static ThreadLocal serialNum = new ThreadLocal() <br>　{<br>　　protected synchronized Object initialValue() <br>　　{<br>　　　return new Integer(nextSerialNum++);<br>　　}<br>　};<br><br>　public static int get() <br>　{<br>　　return ((Integer) (serialNum.get())).intValue(); <br>　}<br>} <br><br>　　SerialNum类的使用将非常地简单，因为get()方法是static的，所以在需要获取当前线程的序号时，简单地调用：<br><br>int serial = SerialNum.get(); <br><br>　　即可。<br><br>　　在线程是活动的并且ThreadLocal对象是可访问的时，该线程就持有一个到该线程局部变量副本的隐含引用，当该线程运行结束后，该线程拥有的所以线程局部变量的副本都将失效，并等待垃圾收集器收集。<br><br>　　ThreadLocal与其它同步机制的比较<br><br>　　ThreadLocal和其它同步机制相比有什么优势呢？ThreadLocal和其它所有的同步机制都是为了解决多线程中的对同一变量的访问冲突，在普通的同步机制中，是通过对象加锁来实现多个线程对同一变量的安全访问的。这时该变量是多个线程共享的，使用这种同步机制需要很细致地分析在什么时候对变量进行读写，什么时候需要锁定某个对象，什么时候释放该对象的锁等等很多。所有这些都是因为多个线程共享了资源造成的。ThreadLocal就从另一个角度来解决多线程的并发访问，ThreadLocal会为每一个线程维护一个和该线程绑定的变量的副本，从而隔离了多个线程的数据，每一个线程都拥有自己的变量副本，从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象，在编写多线程代码时，可以把不安全的整个变量封装进ThreadLocal，或者把该对象的特定于线程的状态封装进ThreadLocal。<br><br>　　由于ThreadLocal中可以持有任何类型的对象，所以使用ThreadLocal get当前线程的值是需要进行强制类型转换。但随着新的Java版本（1.5）将模版的引入，新的支持模版参数的ThreadLocal&lt;T&gt;类将从中受益。也可以减少强制类型转换，并将一些错误检查提前到了编译期，将一定程度地简化ThreadLocal的使用。<br><br>　　总结<br><br>　　当然ThreadLocal并不能替代同步机制，两者面向的问题领域不同。同步机制是为了同步多个线程对相同资源的并发访问，是为了多个线程之间进行通信的有效方式；而ThreadLocal是隔离多个线程的数据共享，从根本上就不在多个线程之间共享资源（变量），这样当然不需要对多个线程进行同步了。所以，如果你需要进行多个线程之间进行通信，则使用同步机制；如果需要隔离多个线程之间的共享冲突，可以使用ThreadLocal，这将极大地简化你的程序，使程序更加易读、简洁。<br><br>引自:http://junhao.wacky.cn/threas,606459.html 
<img src ="http://www.blogjava.net/kxx129/aggbug/110076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2007-04-12 09:44 <a href="http://www.blogjava.net/kxx129/archive/2007/04/12/110076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>由List.contains(Object, obj)想到的</title><link>http://www.blogjava.net/kxx129/archive/2007/01/24/95673.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Wed, 24 Jan 2007 02:03:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2007/01/24/95673.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/95673.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2007/01/24/95673.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/95673.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/95673.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;昨天在开发的时候，碰到这样一个问题：我有一个ArrayList&lt;ArtistEntity&gt;的对象artistList，每次在加入对象时，我都对加入的对象artistEntity进行了判断，如果artistList不包含artistEntity，才进行加入：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_40_75_Open_Image onclick="this.style.display='none'; Codehighlighter1_40_75_Open_Text.style.display='none'; Codehighlighter1_40_75_Closed_Image.style.display='inline'; Codehighlighter1_40_75_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_40_75_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_40_75_Closed_Text.style.display='none'; Codehighlighter1_40_75_Open_Image.style.display='inline'; Codehighlighter1_40_75_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">&nbsp;(</span> <span style="COLOR: #000000">!</span> <span style="COLOR: #000000">artistList.contains(artistEntity))&nbsp;</span> <span id=Codehighlighter1_40_75_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_40_75_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;artistList.add(artistEntity);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span> </span></div>
<p>&nbsp;&nbsp;&nbsp;但运行的结果并不是如开始设计的那样，页面显示表明artistList包含了两个相同的ArtistEntity对象，这是什么原因呢？<br>&nbsp;&nbsp;&nbsp;我看了一下jdk关于这段的源代码：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_4_276_Open_Image onclick="this.style.display='none'; Codehighlighter1_4_276_Open_Text.style.display='none'; Codehighlighter1_4_276_Closed_Image.style.display='inline'; Codehighlighter1_4_276_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_4_276_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4_276_Closed_Text.style.display='none'; Codehighlighter1_4_276_Open_Image.style.display='inline'; Codehighlighter1_4_276_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top> <span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span> <span id=Codehighlighter1_4_276_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span> <span id=Codehighlighter1_4_276_Open_Text><span style="COLOR: #008000">/**</span> <span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Returns&nbsp;&lt;tt&gt;true&lt;/tt&gt;&nbsp;if&nbsp;this&nbsp;list&nbsp;contains&nbsp;the&nbsp;specified&nbsp;element.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span> <span style="COLOR: #808080">@param</span> <span style="COLOR: #008000">&nbsp;elem&nbsp;element&nbsp;whose&nbsp;presence&nbsp;in&nbsp;this&nbsp;List&nbsp;is&nbsp;to&nbsp;be&nbsp;tested.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span> <span style="COLOR: #808080">@return</span> <span style="COLOR: #008000">&nbsp;&nbsp;&lt;code&gt;true&lt;/code&gt;&nbsp;if&nbsp;the&nbsp;specified&nbsp;element&nbsp;is&nbsp;present;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;code&gt;false&lt;/code&gt;&nbsp;otherwise.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">*/</span> </span><span style="COLOR: #000000"><br><img id=Codehighlighter1_319_353_Open_Image onclick="this.style.display='none'; Codehighlighter1_319_353_Open_Text.style.display='none'; Codehighlighter1_319_353_Closed_Image.style.display='inline'; Codehighlighter1_319_353_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_319_353_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_319_353_Closed_Text.style.display='none'; Codehighlighter1_319_353_Open_Image.style.display='inline'; Codehighlighter1_319_353_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">boolean</span> <span style="COLOR: #000000">&nbsp;contains(Object&nbsp;elem)&nbsp;</span> <span id=Codehighlighter1_319_353_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_319_353_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;indexOf(elem)&nbsp;</span> <span style="COLOR: #000000">&gt;=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <br><img id=Codehighlighter1_360_720_Open_Image onclick="this.style.display='none'; Codehighlighter1_360_720_Open_Text.style.display='none'; Codehighlighter1_360_720_Closed_Image.style.display='inline'; Codehighlighter1_360_720_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_360_720_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_360_720_Closed_Text.style.display='none'; Codehighlighter1_360_720_Open_Image.style.display='inline'; Codehighlighter1_360_720_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span id=Codehighlighter1_360_720_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span> <span id=Codehighlighter1_360_720_Open_Text><span style="COLOR: #008000">/**</span> <span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Searches&nbsp;for&nbsp;the&nbsp;first&nbsp;occurence&nbsp;of&nbsp;the&nbsp;given&nbsp;argument,&nbsp;testing&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;for&nbsp;equality&nbsp;using&nbsp;the&nbsp;&lt;tt&gt;equals&lt;/tt&gt;&nbsp;method.&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span> <span style="COLOR: #808080">@param</span> <span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;elem&nbsp;&nbsp;&nbsp;an&nbsp;object.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span> <span style="COLOR: #808080">@return</span> <span style="COLOR: #008000">&nbsp;&nbsp;the&nbsp;index&nbsp;of&nbsp;the&nbsp;first&nbsp;occurrence&nbsp;of&nbsp;the&nbsp;argument&nbsp;in&nbsp;this<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list;&nbsp;returns&nbsp;&lt;tt&gt;-1&lt;/tt&gt;&nbsp;if&nbsp;the&nbsp;object&nbsp;is&nbsp;not&nbsp;found.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span> <span style="COLOR: #808080">@see</span> <span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object#equals(Object)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">*/</span> </span><span style="COLOR: #000000"><br><img id=Codehighlighter1_758_977_Open_Image onclick="this.style.display='none'; Codehighlighter1_758_977_Open_Text.style.display='none'; Codehighlighter1_758_977_Closed_Image.style.display='inline'; Codehighlighter1_758_977_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_758_977_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_758_977_Closed_Text.style.display='none'; Codehighlighter1_758_977_Open_Image.style.display='inline'; Codehighlighter1_758_977_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;indexOf(Object&nbsp;elem)&nbsp;</span> <span id=Codehighlighter1_758_977_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_758_977_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_779_862_Open_Image onclick="this.style.display='none'; Codehighlighter1_779_862_Open_Text.style.display='none'; Codehighlighter1_779_862_Closed_Image.style.display='inline'; Codehighlighter1_779_862_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_779_862_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_779_862_Closed_Text.style.display='none'; Codehighlighter1_779_862_Open_Image.style.display='inline'; Codehighlighter1_779_862_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">&nbsp;(elem&nbsp;</span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">)&nbsp;</span> <span id=Codehighlighter1_779_862_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_779_862_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">for</span> <span style="COLOR: #000000">&nbsp;(</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;i&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;&nbsp;i&nbsp;</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">&nbsp;size;&nbsp;i</span> <span style="COLOR: #000000">++</span> <span style="COLOR: #000000">)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">&nbsp;(elementData[i]</span> <span style="COLOR: #000000">==</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;i;<br><img id=Codehighlighter1_869_959_Open_Image onclick="this.style.display='none'; Codehighlighter1_869_959_Open_Text.style.display='none'; Codehighlighter1_869_959_Closed_Image.style.display='inline'; Codehighlighter1_869_959_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_869_959_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_869_959_Closed_Text.style.display='none'; Codehighlighter1_869_959_Open_Image.style.display='inline'; Codehighlighter1_869_959_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">else</span> <span style="COLOR: #000000">&nbsp;</span> <span id=Codehighlighter1_869_959_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_869_959_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">for</span> <span style="COLOR: #000000">&nbsp;(</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;i&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;&nbsp;i&nbsp;</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">&nbsp;size;&nbsp;i</span> <span style="COLOR: #000000">++</span> <span style="COLOR: #000000">)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">&nbsp;(elem.equals(elementData[i]))<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;i;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">-</span> <span style="COLOR: #000000">1</span> <span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span></div>
&nbsp;&nbsp;&nbsp;这时会直接调用Object对象的equals进行对象比较，而当此方法被重写时，通常有必要重写 <tt>hashCode</tt> 方法，以维护 <tt>hashCode</tt> 方法的常规协定，该协定声明相等对象必须具有相等的哈希码。而我没有重写，因此就导致了这里的问题了。<br>&nbsp;&nbsp;&nbsp;修正：直接利用Eclipse重写,右键/源代码/生成hashCode()和equals(),选择要包括在hashCode()和equals()方法中的字段:
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_1_57_Open_Image onclick="this.style.display='none'; Codehighlighter1_1_57_Open_Text.style.display='none'; Codehighlighter1_1_57_Closed_Image.style.display='inline'; Codehighlighter1_1_57_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1_57_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1_57_Closed_Text.style.display='none'; Codehighlighter1_1_57_Open_Image.style.display='inline'; Codehighlighter1_1_57_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1_57_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_1_57_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="COLOR: #808080">@see</span><span style="COLOR: #008000">&nbsp;java.lang.Object#hashCode()<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;@Override<br><img id=Codehighlighter1_93_229_Open_Image onclick="this.style.display='none'; Codehighlighter1_93_229_Open_Text.style.display='none'; Codehighlighter1_93_229_Closed_Image.style.display='inline'; Codehighlighter1_93_229_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_93_229_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_93_229_Closed_Text.style.display='none'; Codehighlighter1_93_229_Open_Image.style.display='inline'; Codehighlighter1_93_229_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;hashCode()&nbsp;</span><span id=Codehighlighter1_93_229_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_93_229_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;PRIME&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">31</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;PRIME&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;result&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;((artstCd&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;:&nbsp;artstCd.hashCode());<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;result;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_233_318_Open_Image onclick="this.style.display='none'; Codehighlighter1_233_318_Open_Text.style.display='none'; Codehighlighter1_233_318_Closed_Image.style.display='inline'; Codehighlighter1_233_318_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_233_318_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_233_318_Closed_Text.style.display='none'; Codehighlighter1_233_318_Open_Image.style.display='inline'; Codehighlighter1_233_318_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_233_318_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_233_318_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="COLOR: #808080">@param</span><span style="COLOR: #008000">&nbsp;obj<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="COLOR: #808080">@see</span><span style="COLOR: #008000">&nbsp;java.lang.Object#equals(java.lang.Object)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;@Override<br><img id=Codehighlighter1_366_692_Open_Image onclick="this.style.display='none'; Codehighlighter1_366_692_Open_Text.style.display='none'; Codehighlighter1_366_692_Closed_Image.style.display='inline'; Codehighlighter1_366_692_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_366_692_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_366_692_Closed_Text.style.display='none'; Codehighlighter1_366_692_Open_Image.style.display='inline'; Codehighlighter1_366_692_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000">&nbsp;equals(Object&nbsp;obj)&nbsp;</span><span id=Codehighlighter1_366_692_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_366_692_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;obj)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(obj&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(getClass()&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;obj.getClass())<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;ArtistEntity&nbsp;other&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(ArtistEntity)&nbsp;obj;<br><img id=Codehighlighter1_564_616_Open_Image onclick="this.style.display='none'; Codehighlighter1_564_616_Open_Text.style.display='none'; Codehighlighter1_564_616_Closed_Image.style.display='inline'; Codehighlighter1_564_616_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_564_616_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_564_616_Closed_Text.style.display='none'; Codehighlighter1_564_616_Open_Image.style.display='inline'; Codehighlighter1_564_616_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(artstCd&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_564_616_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_564_616_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(other.artstCd&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">artstCd.equals(other.artstCd))<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
这样就好了。<br>或者，在加入artistEntity对象，比较artistEntity的key值。我这里是另外用一个ArrayList&lt;String&gt; artistCodeList存放artistEntity的key值，如果artistCodeList不包含待判断ArtistEntity的key时，才将artistEntity加入artistList:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;当アーティスト情報列表中不包含时才加入</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_85_181_Open_Image onclick="this.style.display='none'; Codehighlighter1_85_181_Open_Text.style.display='none'; Codehighlighter1_85_181_Closed_Image.style.display='inline'; Codehighlighter1_85_181_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_85_181_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_85_181_Closed_Text.style.display='none'; Codehighlighter1_85_181_Open_Image.style.display='inline'; Codehighlighter1_85_181_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">artistCodeList.contains(artistEntity.getArtstCd()))&nbsp;</span><span id=Codehighlighter1_85_181_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_85_181_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;artistCodeList.add(artistEntity.getArtstCd());<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;artistList.add(artistEntity);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
&nbsp; 
<img src ="http://www.blogjava.net/kxx129/aggbug/95673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2007-01-24 10:03 <a href="http://www.blogjava.net/kxx129/archive/2007/01/24/95673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于struts中tld 文件里配置详解</title><link>http://www.blogjava.net/kxx129/archive/2007/01/13/93558.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Sat, 13 Jan 2007 02:17:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2007/01/13/93558.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/93558.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2007/01/13/93558.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/93558.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/93558.html</trackback:ping><description><![CDATA[这是<strong>struts-bean.tld 中write的配置:</strong><br>&lt;tag&gt;<br>&lt;name&gt;write&lt;/name&gt;<br>&lt;tagclass&gt;org.apache.struts.taglib.bean.WriteTag&lt;/tagclass&gt;<br>&lt;bodycontent&gt;empty&lt;/bodycontent&gt;<br>&lt;attribute&gt;<br>&lt;name&gt;bundle&lt;/name&gt;<br>&lt;required&gt;false&lt;/required&gt;<br>&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;<br>&lt;/attribute&gt;<br>&lt;attribute&gt;<br>&lt;name&gt;filter&lt;/name&gt;<br>&lt;required&gt;false&lt;/required&gt;<br>&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;<br>&lt;/attribute&gt;<br>&lt;attribute&gt;<br>&lt;name&gt;format&lt;/name&gt;<br>&lt;required&gt;false&lt;/required&gt;<br>&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;<br>&lt;/attribute&gt;<br>&lt;attribute&gt;<br>&lt;name&gt;formatKey&lt;/name&gt;<br>&lt;required&gt;false&lt;/required&gt;<br>&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;<br>&lt;/attribute&gt;<br>&lt;attribute&gt;<br>&lt;name&gt;ignore&lt;/name&gt;<br>&lt;required&gt;false&lt;/required&gt;<br>&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;<br>&lt;/attribute&gt;<br>&lt;attribute&gt;<br>&lt;name&gt;locale&lt;/name&gt;<br>&lt;required&gt;false&lt;/required&gt;<br>&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;<br>&lt;/attribute&gt;<br>&lt;attribute&gt;<br>&lt;name&gt;name&lt;/name&gt;<br>&lt;required&gt;true&lt;/required&gt;<br>&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;<br>&lt;/attribute&gt;<br>&lt;attribute&gt;<br>&lt;name&gt;property&lt;/name&gt;<br>&lt;required&gt;false&lt;/required&gt;<br>&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;<br>&lt;/attribute&gt;<br>&lt;attribute&gt;<br>&lt;name&gt;scope&lt;/name&gt;<br>&lt;required&gt;false&lt;/required&gt;<br>&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;<br>&lt;/attribute&gt;<br>&lt;/tag&gt;<br>&lt;/taglib&gt;<br><br><br>其中:<br>&lt;name&gt;write&lt;/name&gt;：这个Tag的名字<br>&lt;tagclass&gt;org.apache.struts.taglib.bean.WriteTag&lt;/tagclass&gt;：这个Tag是由那个类实现的（这个class可以在struts.jar包中找到）<br>&lt;bodycontent&gt;empty&lt;/bodycontent&gt;：这个Tag可以直接结尾，不需要填写内容<br>&nbsp;&nbsp;&nbsp;这里<strong><font style="BACKGROUND-COLOR: #a0ffff">bodycontent</font></strong>有三个可选值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;标签体由其他jsp元素组成&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果其有jsp元素，那么标签会先解释，然后将元素的实际值传入。比如标签体里含有&lt;%=attributeName%&gt;这样子的jsp元素，此时标签会按attributeName的实际值是什么就传入什么。这个是最常用的一个。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;empty &nbsp; 标签体<strong>必须</strong>为空&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在引用这个Tag的时候，可以&lt;bean:write bundle="attributeName" /&gt;，而不必&lt;bean:write bundle="attributeName" &gt;&lt;/bean:write&gt;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tagdependent &nbsp; 由标签解释，不带jsp转换&nbsp;<br>&lt;attribute&gt; &lt;/attribute&gt;这里标识的是这个Tag的一个参数<br>&lt;name&gt;bundle&lt;/name&gt;这个参数的名字<br>&lt;required&gt;false&lt;/required&gt;这个参数是否是必填相<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果为true则必须写这个参数，否则会报错<br>&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;是说这个标签的值可以写入<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rtexprvalue:"RUN-TIME EXPRESSION VALUE",是否可以动态赋值,在jsp中如value="&lt;%=attributeName%&gt;" 
<img src ="http://www.blogjava.net/kxx129/aggbug/93558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2007-01-13 10:17 <a href="http://www.blogjava.net/kxx129/archive/2007/01/13/93558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js共通报错</title><link>http://www.blogjava.net/kxx129/archive/2006/11/09/76809.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Thu, 09 Nov 2006 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2006/11/09/76809.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/76809.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2006/11/09/76809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/76809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/76809.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;最近一个项目应日本客户的需求，我们在其中添加了一个共通报错的模块，对前后台的各种提示信息进行收集，并进行统一的处理，显示给系统的用户。<br>&nbsp;&nbsp;&nbsp;这个模块，主要思想就是利用前台顶层页面的一个js数组，将提示信息都收集起来，然后再按照要求进行显示。前台的收集肯定就不用说了，后台的收集我这里是将后台的提示信息先保存在request里面，到达页面后再利用标签转存到js数组里，最后进行统一的呈现。这个过程中由于js经验的不足，走了一些弯路，因此把它记录下来，作为以后继续学习的基础。<br>&nbsp;&nbsp;&nbsp;这里是开始调试的一些代码：<br>//添加錯誤message打印到頁面<br>function showMsgWindow(obj){<br>&nbsp;var pagePath = window.top.TGlobals.webRoot + "/pages/common/msgShow.jsp";<br>&nbsp;showModelessDialog(pagePath,obj,"dialogTop:200px;dialogLeft:200px;dialogHeight:400px;dialogWidth:700px;status:no;edge:sunken; ");<br>}</p>
<p>//定义Message数据结构<br>function msgObj(msgname, msgkey, msgvalue) {<br>&nbsp;this.msgname = msgname;<br>&nbsp;this.msgkey = msgkey;<br>&nbsp;this.msgvalue = msgvalue;<br>&nbsp;<br>&nbsp;msgObj.prototype.getname = function() {<br>&nbsp;&nbsp;return this.msgname;<br>&nbsp;}<br>&nbsp;<br>&nbsp;msgObj.prototype.getkey = function() {<br>&nbsp;&nbsp;return this.msgkey;<br>&nbsp;}<br>&nbsp;<br>&nbsp;msgObj.prototype.getvalue = function() {<br>&nbsp;&nbsp;return this.msgvalue;<br>&nbsp;}<br>}</p>
<p>//去空<br>function zNull(str) {<br>&nbsp;if (str.length &lt; 1) {<br>&nbsp;&nbsp;str = "&amp;nbsp";<br>&nbsp;}<br>&nbsp;return str;<br>}</p>
<p>function errorMsgWindow(){<br>&nbsp;var obj = window.top.errorMsg;<br>&nbsp;if (obj.length &gt; 0) {<br>&nbsp;&nbsp;showMsgWindow(obj);<br>&nbsp;&nbsp;clearErrorMessage();<br>&nbsp;&nbsp;return false;<br>&nbsp;}<br>&nbsp;return true;<br>}</p>
<p>//根据参数对Message进行初始化<br>function pushErrorMessage(){<br>&nbsp;var strobj = new msgObj();</p>
<p>&nbsp;if (arguments.length &gt;= 3) {&nbsp;&nbsp;<br>&nbsp;&nbsp;strobj = new msgObj(zNull(arguments[0]), zNull(arguments[1]), zNull(arguments[2]));<br>&nbsp;} else if (arguments.length == 2) {<br>&nbsp;&nbsp;strobj = new msgObj(zNull(arguments[0]), zNull(arguments[1]), "&amp;nbsp");<br>&nbsp;} else {<br>&nbsp;&nbsp;return false;<br>&nbsp;}<br>&nbsp;window.top.errorMsg.push(strobj);<br>}</p>
<p>function clearErrorMessage(){<br>&nbsp;window.top.errorMsg = new Array();<br>}<br>&nbsp;&nbsp;&nbsp;事实证明这里有几个地方是有点问题的，一般调用好像不会出现，但用的范围广一些就会有感觉了。</p>
<img src ="http://www.blogjava.net/kxx129/aggbug/76809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2006-11-09 11:11 <a href="http://www.blogjava.net/kxx129/archive/2006/11/09/76809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Window平台的WSAD5版本中如何更改默认的工作区</title><link>http://www.blogjava.net/kxx129/archive/2006/10/13/74960.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Fri, 13 Oct 2006 05:30:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2006/10/13/74960.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/74960.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2006/10/13/74960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/74960.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/74960.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IBM<sup>&#174;</sup> WebSphere<sup>&#174;</sup> Studio Application Developer Version 5.1.2 for Windows<sup>&#174;</sup>&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于项目需要，我们这次的项目将在IBM的WebSphere&nbsp;&nbsp;Studio&nbsp;&nbsp;Application&nbsp;&nbsp;Developer(以下简称WSAD)中进行开发，以前用惯了eclipse，突然让我们转的用WSAD还真有点不太爽的啊，这不开始用的试随便设置的一个工作空间，到了正式用时要换过来却怎么也换不过来了。查帮助，上百度终于找到了，原来跟Eclipse还真有点不一样：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在默认情况下，WSAD&nbsp;&nbsp;5在启动的时候会弹出一个提示窗口让用户选择工作区。如果，如果你选中了窗口下方的&#8220;将此工作空间用作缺省值并且不再显示此对话框&#8221;，等下一次再运行WSAD的时候再再想更换工作区就没那么好办了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解答：&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;在WebSphere&nbsp;&nbsp;Studio&nbsp;&nbsp;Application&nbsp;&nbsp;Developer&nbsp;&nbsp;5中想要更改默认的工作区可以有以下的3种方式进行：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;方法一：用命令行方式启动并指定所用的工作区&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;1.&nbsp;&nbsp;打开命令行窗口，进入wsappdev.exe所在的目录(wsappdev.exe应该在WSAD的安装路径下)&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;2.&nbsp;&nbsp;执行命令：wsappdev.exe&nbsp;&nbsp;-data&nbsp;&nbsp;&lt;workdirectory&gt;，其中&lt;workdirectory&gt;是需要使用的工作区目录。假设要指定的工作区路径为C:\workbentch,那么命令就应该写成：wsappdev.exe&nbsp;&nbsp;-data&nbsp;&nbsp;C:\workbentch<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;方法二：用命令行方式启动并弹出提示窗口让用户选择工作区&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;1.&nbsp;&nbsp;打开命令行窗口，进入wsappdev.exe所在的目录&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;2.&nbsp;&nbsp;执行命令：wsappdev.exe&nbsp;&nbsp;-setworkspace<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;方法三：通过更改配置文件让WSAD启动的时候弹出一个提示窗口让用户选择工作区&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;1.&nbsp;&nbsp;用文本编辑器打开wsappdev.ini文件&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;2.&nbsp;&nbsp;在&#8220;[Environment&nbsp;&nbsp;Variables]&#8221;的上方添加一行&#8220;SetWorkSpace=true&#8221;，保存。wsappdev.ini文件会有类似如下的内容：&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;[Settings]&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;DefaultWorkspace=&lt;My&nbsp;&nbsp;Documents&gt;\IBM\wsappdev51\workspace&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;ProductName=IBM&nbsp;&nbsp;WebSphere&nbsp;&nbsp;Studio&nbsp;&nbsp;Application&nbsp;&nbsp;Developer&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;Version=5.1.1&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;Full=Yes&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;KeyName=wsappdev510&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;VMArgs=-Xj9&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;LUMProductID=1&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;LUMProductVersion=5.1.1&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;Website=www.ibm.com/websphere/developer/zones/studio/appdev/&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;SetWorkSpace=true&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;[Environment&nbsp;&nbsp;Variables]&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;3.关闭wsappdev.ini文件，通过菜单或者直接双击wsappdev.exe文件再次启动WSAD的时候，就会弹出一个提示窗口让用户选择工作区。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;终于解决了，为了下次再别忘记了，特记下来！ 
<img src ="http://www.blogjava.net/kxx129/aggbug/74960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2006-10-13 13:30 <a href="http://www.blogjava.net/kxx129/archive/2006/10/13/74960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j配置相对路径实现日志记录</title><link>http://www.blogjava.net/kxx129/archive/2006/10/10/74280.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Tue, 10 Oct 2006 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2006/10/10/74280.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/74280.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2006/10/10/74280.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/74280.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/74280.html</trackback:ping><description><![CDATA[从网上简单搜索了一下，发现有三种介绍的方法。总结在这里<br>1.
<p>解决的办法自然是想办法用相对路径代替绝对路径，其实log4j的FileAppender本身就有这样的机制，如：</p>
<p>log4j.appender.logfile.File=${WORKDIR}/logs/app.log</p>
<p>其中&#8220;${WORKDIR}/&#8221;是个变量，会被System Property中的&#8220;WORKDIR&#8221;的值代替。这样，我们就可以在log4j加载配置文件之前，先用System.setProperty设置好根路径。</p>
<p>在 没有发现这个技巧之前，为了解决这个问题，我曾自己扩展了log4j的RollingFileAppender类，其他的FileAppender同样道 理。扩展的方法，就是用一个子类去覆盖setFile方法，这个方法在log4j读取配置文件生成appender的时候调用，传入的就是配置文件中的路 径，这样我就可以按照自己的想法在路径前面加上根路径了。<br></p>
<p>2.<br></p>
<pre>可以使用环境变量<br>log4j.appender.R=org.apache.log4j.RollingFileAppender <br>log4j.appender.R.File=${catalina.base}/logs/logs_tomcat.log <br>log4j.appender.R.MaxFileSize=10KB<br><br><br><br><br><br><br>3.具体实现:<br><br><span id=BlogViewId dragover="true">
<div>一般在我们开发项目过程中,log4j日志输出路径固定到某个文件夹,这样如果我换一个环境,日志路径又需要重新修改,比较不方便,目前我采用了动态改变日志路径方法来实现相对路径保存日志文件</div>
<br></span> (1).在项目启动时,装入初始化类:&nbsp;<span id=BlogViewId dragover="true"><br>
<div>public class Log4jInit extends HttpServlet {<br>&nbsp;&nbsp;&nbsp; static Logger logger = Logger.getLogger(Log4jInit.class);</div>
<br>
<div>&nbsp;&nbsp;&nbsp; public Log4jInit() {<br>&nbsp;&nbsp;&nbsp; }</div>
<br>
<div>&nbsp;&nbsp;&nbsp; public void init(ServletConfig config) throws ServletException {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String prefix = config.getServletContext().getRealPath("/");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String file = config.getInitParameter("log4j");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filePath = prefix + file;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Properties props = new Properties();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileInputStream istream = new FileInputStream(filePath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.load(istream);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; istream.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //toPrint(props.getProperty("log4j.appender.file.File"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String logFile = prefix + props.getProperty("log4j.appender.file.File");//设置路径<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.setProperty("log4j.appender.file.File",logFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PropertyConfigurator.configure(props);//装入log4j配置信息<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; toPrint("Could not read configuration file [" + filePath + "].");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; toPrint("Ignoring configuration file [" + filePath + "].");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div>
<br>
<div>&nbsp;&nbsp;&nbsp; }</div>
<br>
<div>&nbsp;&nbsp;&nbsp; public static void toPrint(String content) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(content);<br>&nbsp;&nbsp;&nbsp; }</div>
<br>
<div>}</div>
<br>
<div>(2).Web.xml中的配置</div>
<br>
<div>&lt;servlet&gt;<br>&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;log4j-init&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;Log4jInit&lt;/servlet-class&gt;<br>&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;log4j&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;WEB-INF/classes/log4j.properties&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br>&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br>&nbsp; &lt;/servlet&gt;<br><br>最后决定 在项目中选择第二种比较方便</div>
</span></pre>
<img src ="http://www.blogjava.net/kxx129/aggbug/74280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2006-10-10 13:18 <a href="http://www.blogjava.net/kxx129/archive/2006/10/10/74280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XPath 教程(好东东难求，不敢不粘出来)</title><link>http://www.blogjava.net/kxx129/archive/2006/09/19/70591.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Tue, 19 Sep 2006 10:02:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2006/09/19/70591.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/70591.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2006/09/19/70591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/70591.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/70591.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: （整理自：http://www.zvon.org/xxl/XPathTutorial/General_chi/examples.html） 简介 &nbsp; XPath由W3C的 XPath 1.0 标准 描述.本教程通过实例来展示XPath的一些特性. 你可以从以下内容开始:1。基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始, 那么该路径就表示到一个元...&nbsp;&nbsp;<a href='http://www.blogjava.net/kxx129/archive/2006/09/19/70591.html'>阅读全文</a><img src ="http://www.blogjava.net/kxx129/aggbug/70591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2006-09-19 18:02 <a href="http://www.blogjava.net/kxx129/archive/2006/09/19/70591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XPath学习教程(转载)</title><link>http://www.blogjava.net/kxx129/archive/2006/09/19/70552.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Tue, 19 Sep 2006 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2006/09/19/70552.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/70552.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2006/09/19/70552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/70552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/70552.html</trackback:ping><description><![CDATA[<p class=title>(本文原址:http://blog.csdn.net/linqingfeng/archive/2006/05/02/705230.aspx)<br>Xpath介绍<br><small><font size=3>翻译：Linyupark / 2006-03-24</font></small></p>
<div class=content>
<p class=intro>XPath is a language for finding information in an XML document. XPath is used to navigate through elements and attributes in an XML document.<br>Xpath是一种能够在XML文档中寻找信息的语言。它通过XML文档中的元素和属性来进行导航。 </p>
<hr>
<h2><font size=3>What You Should Already Know<br>你应具备的知识</font> </h2>
<p>Before you continue you should have a basic understanding of the following:<br>在你继续前你应该具备以下知识的基础：</p>
<ul>
    <li>HTML / XHTML
    <li>XML / XML Namespaces[命名空间] </li>
</ul>
<hr>
<h2><font size=3>What is XPath?<br>什么是XPath?</font> </h2>
<ul>
    <li>XPath is a syntax for defining parts of an XML document<br>XPath 是针对XML文档部分内容定义的语法
    <li>XPath uses path expressions to navigate in XML documents<br>XPath 使用路径表达式在XML文档中导航
    <li>XPath contains a library of standard functions<br>XPath 包含了一系列标准函数
    <li>XPath is a major element in XSLT<br>XPath 在XSLT当中是一个主要的元素
    <li>XPath is a W3C Standard<br>XPath是W3C标准 </li>
</ul>
<hr>
<h2><font size=3>XPath Path Expressions<br>XPath 路径表达式</font> </h2>
<p>XPath uses path expressions to select nodes or node-sets in an XML document. These path expressions look very much like the expressions you see when you work with a traditional computer file system.<br>XPath 使用路径表达式来选择XML文档中的nodes(节)或是node-set(节集)。这些路径表达式看上去与你平时所见的传统计算机文件系统路径非常地相似。</p>
<hr>
<h2><font size=3>XPath Standard Functions<br>XPath 标准函数</font> </h2>
<p>XPath includes over 100 built-in functions. There are functions for string values, numeric values, date and time comparison, node and QName manipulation, sequence manipulation, Boolean values, and more.<br>XPath包含了数量超过100的内置函数。这些函数针对字符串值，数字值，日期和时间比较，节操作，顺序操作，布尔值，等等。 </p>
<hr>
<h2><font size=3>XPath is Used in XSLT<br>XPath被用在XSLT</font> </h2>
<p>XPath is a major element in the XSLT standard. Without XPath knowledge you will not be able to create XSLT documents.<br>在XSLT标准中XPath是主要的元素。没有XPath知识你将很难建立XSLT文档。</p>
<p>XQuery and XPointer are both built on XPath expressions. XQuery 1.0 and XPath 2.0 share the same data model and support the same functions and operators. <br>XQuery和XPointer都建立于XPath表达式。XQuery 1.0 和 XPath 2.0共享相同的数据模型并支持相同的函数和操作</p>
<hr>
<h2><font size=3>XPath is a W3C Standard<br>XPath是W3C标准</font> </h2>
<p>XPath became a W3C Recommendation 16. November 1999.<br>XPat于1999年11月16日成为W3C的推荐标准</p>
<p>XPath was designed to be used by XSLT, XPointer and other XML parsing software.<br>XPath被设计成为用语XSLT,XPoniter以及其他XML解析的软件。</p>
<div id=record>
<p class=title>XPath Nodes(节)<br><small><font size=3>翻译：Linyupark / 2006-03-24</font></small></p>
<div class=content>
<p class=intro>In XPath, there are seven kinds of nodes: element, attribute, text, namespace, processing-instruction, comment, and document (root) nodes.<br>在XPath中有七种nodes(节)：元素，属性，文字，命名空间，处理说明，注释，和文档(根)节。</p>
<hr>
<h2><font size=3>XPath Terminology<br>XPath术语</font> </h2>
<h3><font size=3>Nodes/节</font> </h3>
<p>In XPath, there are seven kinds of nodes: element, attribute, text, namespace, processing-instruction, comment, and document (root) nodes. XML documents are treated as trees of nodes. The root of the tree is called the document node (or root node).<br>XML文档被视为数状的节。树的根部被称为文档的节(或根节)。</p>
<p>Look at the following XML document:<br>观察下面的XML文档：</p>
<pre>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</pre>
<pre>&lt;bookstore&gt;</pre>
<pre>&lt;book&gt;<br>  &lt;title lang="en"&gt;Harry Potter&lt;/title&gt;<br>  &lt;author&gt;J K. Rowling&lt;/author&gt; <br>  &lt;year&gt;2005&lt;/year&gt;<br>  &lt;price&gt;29.99&lt;/price&gt;<br>&lt;/book&gt;</pre>
<pre>&lt;/bookstore&gt;</pre>
<p>Example of nodes in the XML document above:<br>上面举例的XML文档的节有：</p>
<pre>&lt;bookstore&gt;  (document node)</pre>
<pre>&lt;author&gt;J K. Rowling&lt;/author&gt;  (element node)</pre>
<pre>lang="en"  (attribute node)</pre>
<h3><font size=3>Atomic values<br>原子值</font> </h3>
<p>Atomic values are nodes with no children or parent.<br>原子值是那些没有子或父的节（无上下关系）。</p>
<p>Example of atomic values:<br>举例中的原子值：</p>
<pre>J K. Rowling</pre>
<pre>"en"</pre>
<h3><font size=3>Items<br>项目</font> </h3>
<p>Items are atomic values or nodes.<br>项目是原子值或节。</p>
<hr>
<h2><font size=3>Relationship of Nodes<br>节之间的关系</font> </h2>
<h3><font size=3>Parent/父</font> </h3>
<p>Each element and attribute has one parent.<br>每个元素和属性有一父亲。</p>
<p>In the following example; the book element is the parent of the title, author, year, and price:<br>下面的举例中：book元素是title，author，year和price的父亲</p>
<pre>&lt;book&gt;<br>  &lt;title&gt;Harry Potter&lt;/title&gt;<br>  &lt;author&gt;J K. Rowling&lt;/author&gt;<br>  &lt;year&gt;2005&lt;/year&gt;<br>  &lt;price&gt;29.99&lt;/price&gt;<br>&lt;/book&gt;</pre>
<h3><font size=3>Children/子</font> </h3>
<p>Element nodes may have zero, one or more children.<br>元素节可能有0个或多个子</p>
<p>In the following example; the title, author, year, and price elements are all children of the book element:<br>下面的举例中：title,author,year和price元素都是book元素的子元素</p>
<pre>&lt;book&gt;<br>  &lt;title&gt;Harry Potter&lt;/title&gt;<br>  &lt;author&gt;J K. Rowling&lt;/author&gt;<br>  &lt;year&gt;2005&lt;/year&gt;<br>  &lt;price&gt;29.99&lt;/price&gt;<br>&lt;/book&gt;</pre>
<h3><font size=3>Siblings/兄</font> </h3>
<p>Nodes that have the same parent.<br>指那些有相同父的</p>
<p>In the following example; the title, author, year, and price elements are all siblings:<br>下面的举例中title, author, year, 和 price元素都为兄弟</p>
<pre>&lt;book&gt;<br>  &lt;title&gt;Harry Potter&lt;/title&gt;<br>  &lt;author&gt;J K. Rowling&lt;/author&gt;<br>  &lt;year&gt;2005&lt;/year&gt;<br>  &lt;price&gt;29.99&lt;/price&gt;<br>&lt;/book&gt;</pre>
<h3><font size=3>Ancestors/祖</font> </h3>
<p>A node's parent, parent's parent, etc.<br>节的父，父的父....都为祖</p>
<p>In the following example; the ancestors of the title element are the book element and the bookstore element:<br>下面的举例中：book元素和bookstore元素都为title元素的祖元素</p>
<pre>&lt;bookstore&gt;</pre>
<pre>&lt;book&gt;<br>  &lt;title&gt;Harry Potter&lt;/title&gt;<br>  &lt;author&gt;J K. Rowling&lt;/author&gt;<br>  &lt;year&gt;2005&lt;/year&gt;<br>  &lt;price&gt;29.99&lt;/price&gt;<br>&lt;/book&gt;</pre>
<pre>&lt;/bookstore&gt;</pre>
<h3><font size=3>Descendants/孙</font> </h3>
<p>A node's children, children's children, etc.<br>节的子，子的子...都为孙</p>
<p>In the following example; descendants of the bookstore element are the book, title, author, year, and price elements:<br>下面的举例中：bookstore元素的孙有book,title,author,year以及price元素</p>
<pre>&lt;bookstore&gt;</pre>
<pre>&lt;book&gt;<br>  &lt;title&gt;Harry Potter&lt;/title&gt;<br>  &lt;author&gt;J K. Rowling&lt;/author&gt;<br>  &lt;year&gt;2005&lt;/year&gt;<br>  &lt;price&gt;29.99&lt;/price&gt;<br>&lt;/book&gt;</pre>
<pre>&lt;/bookstore&gt;</pre>
</div>
</div>
</div>
<br>
<p class=title>XPath语法<br><small><font size=3>翻译：Linyupark / 2006-03-24</font></small></p>
<p class=intro>XPath uses path expressions to select nodes or node-sets in an XML document. The node is selected by following a path or steps.<br>XPath使用路径表达式来选择XML文档的节或是节集。顺着路径或步骤来选择节。</p>
<hr>
<h2><font size=3>The XML Example Document<br>XML实例文档</font> </h2>
<p>We will use the following XML document in the examples below.<br>举例中我们将使用下面的XML文档</p>
<pre>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</pre>
<pre>&lt;bookstore&gt;</pre>
<pre>&lt;book&gt;<br>  &lt;title lang="eng"&gt;Harry Potter&lt;/title&gt;<br>  &lt;price&gt;29.99&lt;/price&gt;<br>&lt;/book&gt;</pre>
<pre>&lt;book&gt;<br>  &lt;title lang="eng"&gt;Learning XML&lt;/title&gt;<br>  &lt;price&gt;39.95&lt;/price&gt;<br>&lt;/book&gt;</pre>
<pre>&lt;/bookstore&gt;<br></pre>
<br>
<hr>
<h2><font size=3>Selecting Nodes<br>选择节</font> </h2>
<p>XPath uses path expressions to select nodes in an XML document. The node is selected by following a path or steps. The most useful path expressions are listed below:<br>一些非常有用的路径表达式： </p>
<table class=ex id=table1 cellSpacing=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width="20%"><strong>表达式</strong> </td>
            <td vAlign=top><strong>描述</strong> </td>
        </tr>
        <tr>
            <td vAlign=top><em>nodename</em> </td>
            <td vAlign=top>Selects all child nodes of the node[选择所有目前节的子节]</td>
        </tr>
        <tr>
            <td vAlign=top>/</td>
            <td vAlign=top>Selects from the root node[从根节进行选择]</td>
        </tr>
        <tr>
            <td vAlign=top>//</td>
            <td vAlign=top>Selects nodes in the document from the current node that match the selection no matter where they are [选择文档中相吻合的节而不管其在文档的何处]</td>
        </tr>
        <tr>
            <td vAlign=top>.</td>
            <td vAlign=top>Selects the current node[选择当前节]</td>
        </tr>
        <tr>
            <td vAlign=top>..</td>
            <td vAlign=top>Selects the parent of the current node[当前节的父节]</td>
        </tr>
        <tr>
            <td vAlign=top>@</td>
            <td vAlign=top>Selects attributes[选择属性]</td>
        </tr>
    </tbody>
</table>
<h3><font size=3>Examples<br>实例</font> </h3>
<p>In the table below we have listed some path expressions and the result of the expressions:<br>下面我们所列举的表格有路径表达式以及其结果：</p>
<table class=ex id=table34 cellSpacing=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width="30%"><strong>路径表达式</strong> </td>
            <td vAlign=top><strong>结果</strong> </td>
        </tr>
        <tr>
            <td vAlign=top>bookstore</td>
            <td vAlign=top>Selects all the child nodes of the bookstore element[选择所有bookstore元素的子节]</td>
        </tr>
        <tr>
            <td vAlign=top>/bookstore</td>
            <td vAlign=top>Selects the root element bookstore
            <p><strong>Note:</strong> If the path starts with a slash ( / ) it always represents an absolute path to an element!</p>
            [选择了bookstore的根元素。注意：如果路径的开始为(/)那此路径一定是到该元素的绝对路径]</td>
        </tr>
        <tr>
            <td vAlign=top>bookstore/book</td>
            <td vAlign=top>Selects all book elements that are children of bookstore[选择了所有在bookstore的子元素book元素所包含的所有元素（其实就为bookstore里book元素所包含的元素）]</td>
        </tr>
        <tr>
            <td vAlign=top>//book</td>
            <td vAlign=top>Selects all book elements no matter where they are in the document[选择所有为book元素的内容而不管book元素处于何处(有不同的父也没关系)]</td>
        </tr>
        <tr>
            <td vAlign=top>bookstore//book</td>
            <td vAlign=top>Selects all book elements that are descendant of the bookstore element, no matter where they are under the bookstore element[在bookstore元素内所有含有book元素的元素内容（只要book元素的祖元素为bookstore元素那都符合条件）]</td>
        </tr>
        <tr>
            <td vAlign=top>//@lang</td>
            <td vAlign=top>Selects all attributes that are named lang[选择所有属性名为lang的属性]</td>
        </tr>
    </tbody>
</table>
<br>
<hr>
<h2><font size=3>Predicates<br>谓语</font> </h2>
<p>Predicates are used to find a specific node or a node that contains a specific value.<br>谓语用来指定明确的节所含有的特殊的值</p>
<p>Predicates are always embedded in square brackets.<br>谓语被嵌入在中括号</p>
<h3><font size=3>Examples<br>举例</font> </h3>
<p>In the table below we have listed some path expressions with predicates and the result of the expressions:<br>下面的表格列举了一些使用了谓语的路径表达式以及其产生的结果：</p>
<table class=ex id=table35 cellSpacing=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width="50%"><strong>路径表达式</strong> </td>
            <td vAlign=top><strong>结果</strong> </td>
        </tr>
        <tr>
            <td vAlign=top>/bookstore/book[1] </td>
            <td vAlign=top>Selects the first book element that is the child of the bookstore element[选择了bookstore里的第一个book元素]</td>
        </tr>
        <tr>
            <td vAlign=top>/bookstore/book[last()]</td>
            <td vAlign=top>Selects the last book element that is the child of the bookstore element[选择bookstore里最后一个book元素]</td>
        </tr>
        <tr>
            <td vAlign=top>/bookstore/book[last()-1]</td>
            <td vAlign=top>Selects the last but one book element that is the child of the bookstore element[bookstore中倒数第二个book元素]</td>
        </tr>
        <tr>
            <td vAlign=top>/bookstore/book[position()&lt;3]</td>
            <td vAlign=top>Selects the first two book elements that are children of the bookstore element[在bookstore中前两个book元素]</td>
        </tr>
        <tr>
            <td vAlign=top>//title[@lang]</td>
            <td vAlign=top>Selects all the title elements that have an attribute named lang[选择所有含有lang属性的title元素]</td>
        </tr>
        <tr>
            <td vAlign=top>//title[@lang='eng']</td>
            <td vAlign=top>Selects all the title elements that have an attribute named lang with a value of 'eng'[选择所有含有lang属性并且值为eng的title元素]</td>
        </tr>
        <tr>
            <td vAlign=top>/bookstore/book[price&gt;35.00]</td>
            <td vAlign=top>Selects all the book elements of the bookstore element that have a price element with a value greater than 35.00[选择所有bookstore中book元素里price元素内容大于35.00的book元素]</td>
        </tr>
        <tr>
            <td vAlign=top>/bookstore/book[price&gt;35.00]/title</td>
            <td vAlign=top>Selects all the title elements of the book elements of the bookstore element that have a price element with a value greater than 35.00[选择bookstore中book的子元素title，并且其兄弟元素price的内容得大于35.00]</td>
        </tr>
    </tbody>
</table>
<br>
<hr>
<h2><font size=3>Selecting Unknown Nodes<br>选择未知的节</font> </h2>
<p>XPath wildcards can be used to select unknown XML elements.<br>XPath的通配符可以用来选择未知的XML元素</p>
<table class=ex id=table12 cellSpacing=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width="20%"><strong>通配符</strong> </td>
            <td vAlign=top><strong>描述</strong> </td>
        </tr>
        <tr>
            <td vAlign=top>*</td>
            <td vAlign=top>Matches any element node[相吻合的所有元素节]</td>
        </tr>
        <tr>
            <td vAlign=top>@*</td>
            <td vAlign=top>Matches any attribute node[相吻合的所有属性节]</td>
        </tr>
        <tr>
            <td vAlign=top>node()</td>
            <td vAlign=top>Matches any node of any kind[吻合任何类型的节]</td>
        </tr>
    </tbody>
</table>
<h3><font size=3>Examples实例</font> </h3>
<p>In the table below we have listed some path expressions and the result of the expressions:<br>下面的表格我们将列举一些路径表达式以及它们的结果</p>
<table class=ex id=table36 cellSpacing=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width="30%"><strong>路径表达式</strong> </td>
            <td vAlign=top><strong>结果</strong> </td>
        </tr>
        <tr>
            <td vAlign=top>/bookstore/*</td>
            <td vAlign=top>Selects all the child nodes of the bookstore element[选择所有bookstore的子节]</td>
        </tr>
        <tr>
            <td vAlign=top>//*</td>
            <td vAlign=top>Selects all elements in the document[选择所有文档中的元素]</td>
        </tr>
        <tr>
            <td vAlign=top>//title[@*]</td>
            <td vAlign=top>Selects all title elements which have any attribute[选择元素为title并且其含有属性]</td>
        </tr>
    </tbody>
</table>
<br>
<hr>
<h2><font size=3>Selecting Several Paths<br>选择数个路径</font> </h2>
<p>By using the | operator in an XPath expression you can select several paths.<br>通过在XPath中使用 | 你可以选择数个路径</p>
<h3><font size=3>Examples<br>实例</font> </h3>
<p>In the table below we have listed some path expressions and the result of the expressions:<br>下面的表格我们会列举一些路径表达式以及其结果：</p>
<table class=ex id=table37 cellSpacing=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width="40%"><strong>路径表达</strong> </td>
            <td vAlign=top><strong>结果</strong> </td>
        </tr>
        <tr>
            <td vAlign=top>//book/title | //book/price</td>
            <td vAlign=top>Selects all the title AND price elements of all book elements[选择所有book里title和price元素]</td>
        </tr>
        <tr>
            <td vAlign=top>//title | //price</td>
            <td vAlign=top>Selects all the title AND price elements in the document[选择所有title和price元素]</td>
        </tr>
        <tr>
            <td vAlign=top>/bookstore/book/title | //price</td>
            <td vAlign=top>Selects all the title elements of the book element of the bookstore element AND all the price elements in the document[选择所有book里的title元素和所有price元素]</td>
        </tr>
    </tbody>
</table>
<br><br>
<p class=title>XPath 轴<br><small><font size=3>翻译：Linyupark / 2006-03-24</font></small></p>
<h2><font size=3>The XML Example Document<br>XML举例文档</font> </h2>
<p>We will use the following XML document in the examples below.<br>我么将使用该XML文档进行下面的举例说明</p>
<pre>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</pre>
<pre>&lt;bookstore&gt;</pre>
<pre>&lt;book&gt;<br>  &lt;title lang="eng"&gt;Harry Potter&lt;/title&gt;<br>  &lt;price&gt;29.99&lt;/price&gt;<br>&lt;/book&gt;</pre>
<pre>&lt;book&gt;<br>  &lt;title lang="eng"&gt;Learning XML&lt;/title&gt;<br>  &lt;price&gt;39.95&lt;/price&gt;<br>&lt;/book&gt;</pre>
<pre>&lt;/bookstore&gt;<br></pre>
<br>
<hr>
<h2><font size=3>XPath Axes<br>XPath轴</font> </h2>
<p>An axis defines a node-set relative to the current node.<br>轴定义了相对于当前节的节集</p>
<table class=ex id=table1 cellSpacing=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width="38%"><strong>轴名</strong> </td>
            <td vAlign=top width="62%"><strong>结果</strong> </td>
        </tr>
        <tr>
            <td vAlign=top>ancestor</td>
            <td vAlign=top>Selects all ancestors (parent, grandparent, etc.) of the current node[选择了当前节的所有祖（父，祖父，等等）]</td>
        </tr>
        <tr>
            <td vAlign=top>ancestor-or-self</td>
            <td vAlign=top>Selects all ancestors (parent, grandparent, etc.) of the current node and the current node itself[选择当前节的所有祖并且还有当前节自己]</td>
        </tr>
        <tr>
            <td vAlign=top>attribute</td>
            <td vAlign=top>Selects all attributes of the current node[选择所有当前节的属性]</td>
        </tr>
        <tr>
            <td vAlign=top>child</td>
            <td vAlign=top>Selects all children of the current node[选择所有当前节的子]</td>
        </tr>
        <tr>
            <td vAlign=top>descendant</td>
            <td vAlign=top>Selects all descendants (children, grandchildren, etc.) of the current node[选择所有当前节的孙（子，孙子，等等）]</td>
        </tr>
        <tr>
            <td vAlign=top>descendant-or-self</td>
            <td vAlign=top>Selects all descendants (children, grandchildren, etc.) of the current node and the current node itself[选择当前节的所有孙以及它本身]</td>
        </tr>
        <tr>
            <td vAlign=top>following</td>
            <td vAlign=top>Selects everything in the document after the closing tag of the current node[选择所有在关闭当前节标签后的所有内容]</td>
        </tr>
        <tr>
            <td vAlign=top>following-sibling</td>
            <td vAlign=top>Selects all siblings after the current node[选择所有当前节后的兄]</td>
        </tr>
        <tr>
            <td vAlign=top>namespace</td>
            <td vAlign=top>Selects all namespace nodes of the current node[选择所有当前节的命名空间]</td>
        </tr>
        <tr>
            <td vAlign=top>parent</td>
            <td vAlign=top>Selects the parent of the current node[选择当前节的父]</td>
        </tr>
        <tr>
            <td vAlign=top>preceding</td>
            <td vAlign=top>Selects everything in the document that is before the start tag of the current node[选择当前节之前的所有内容]</td>
        </tr>
        <tr>
            <td vAlign=top>preceding-sibling</td>
            <td vAlign=top>Selects all siblings before the current node[选择所有当前节之前的兄]</td>
        </tr>
        <tr>
            <td vAlign=top>self</td>
            <td vAlign=top>Selects the current node[选择当前节]</td>
        </tr>
    </tbody>
</table>
<br>
<hr>
<h2><font size=3>Location Path Expression<br>路径表达试定位</font> </h2>
<p>A location path can be absolute or relative.<br>定位路径可以是绝对的也可以是相对的</p>
<p>An absolute location path starts with a slash ( / ) and a relative location path does not. In both cases the location path consists of one or more steps, each separated by a slash:<br>绝对定位的路径由(/)开始，而相对定位就不这样。定位的路径由一个或多个步骤所组成，每部分由(/)相分隔：</p>
<pre>An absolute location path:</pre>
<pre>/step/step/...</pre>
<pre>A relative location path:</pre>
<pre>step/step/...</pre>
<p>Each step is evaluated against the nodes in the current node-set.<br>在当前的节集中每步的赋值是逆向的</p>
<p>A step consists of:</p>
<ul>
    <li>an axis (defines the tree-relationship between the selected nodes and the current node)
    <li>a node-test (identifies a node within an axis)[在轴中鉴定节]
    <li>zero or more predicates (to further refine the selected node-set)[0个或多个谓语可以来更好的选择节] </li>
</ul>
<p>The syntax for a location step is:<br>定位的语法</p>
<pre>axisname::nodetest[predicate]</pre>
<h3><font size=3>Examples<br>实例</font> </h3>
<table cellSpacing=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width="38%"><strong>Example</strong> </td>
            <td vAlign=top width="62%"><strong>结果</strong> </td>
        </tr>
        <tr>
            <td vAlign=top>child::book</td>
            <td vAlign=top>Selects all book nodes that are children of the current node[选择当前节点下所有为book的子节点]</td>
        </tr>
        <tr>
            <td vAlign=top>attribute::lang</td>
            <td vAlign=top>Selects the lang attribute of the current node[选择当前节点下所有属性为lang的内容]</td>
        </tr>
        <tr>
            <td vAlign=top>child::*</td>
            <td vAlign=top>Selects all children of the current node[选择当前节下所有的子节]</td>
        </tr>
        <tr>
            <td vAlign=top>attribute::*</td>
            <td vAlign=top>Selects all attributes of the current node[选择当前节所有的属性]</td>
        </tr>
        <tr>
            <td vAlign=top>child::text()</td>
            <td vAlign=top>Selects all text child nodes of the current node[选择当前节点所有子节点的文字]</td>
        </tr>
        <tr>
            <td vAlign=top>child::node()</td>
            <td vAlign=top>Selects all child nodes of the current node[选择所有当前节点的子节点]</td>
        </tr>
        <tr>
            <td vAlign=top>descendant::book</td>
            <td vAlign=top>Selects all book descendants of the current node[选择当前节点所有为book的孙节点]</td>
        </tr>
        <tr>
            <td vAlign=top>ancestor::book</td>
            <td vAlign=top>Selects all book ancestors of the current node[选择所有当前祖节点为book的节点]</td>
        </tr>
        <tr>
            <td vAlign=top>ancestor-or-self::book</td>
            <td vAlign=top>Selects all book ancestors of the current node - and the current as well if it is a book node[当前节点和其祖节点为book的节点]</td>
        </tr>
        <tr>
            <td vAlign=top>child::*/child::price</td>
            <td vAlign=top>Selects all price grandchildren of the current node[当前节点所有含price的孙子节点]</td>
        </tr>
    </tbody>
</table>
<br>
<p class=title>XPath运算符<br><small><font size=3>翻译：无 / 2006-03-24</font></small></p>
<p class=intro>An XPath expression returns either a node-set, a string, a Boolean, or a number.</p>
<hr>
<h2><font size=3>XPath Operators</font> </h2>
<p>Below is a list of the operators that can be used in XPath expressions:</p>
<table class=ex cellSpacing=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width="15%"><strong>Operator</strong> </td>
            <td vAlign=top width="30%"><strong>Description</strong> </td>
            <td vAlign=top width="30%"><strong>Example</strong> </td>
            <td vAlign=top width="25%"><strong>Return value</strong> </td>
        </tr>
        <tr>
            <td vAlign=top>|</td>
            <td vAlign=top>Computes two node-sets</td>
            <td vAlign=top>//book | //cd</td>
            <td vAlign=top>Returns a node-set with all book and cd elements</td>
        </tr>
        <tr>
            <td vAlign=top>+</td>
            <td vAlign=top>Addition</td>
            <td vAlign=top>6 + 4</td>
            <td vAlign=top>10</td>
        </tr>
        <tr>
            <td vAlign=top>-</td>
            <td vAlign=top>Subtraction</td>
            <td vAlign=top>6 - 4</td>
            <td vAlign=top>2</td>
        </tr>
        <tr>
            <td vAlign=top>*</td>
            <td vAlign=top>Multiplication</td>
            <td vAlign=top>
            <p>6 * 4</p>
            </td>
            <td vAlign=top>24</td>
        </tr>
        <tr>
            <td vAlign=top>div</td>
            <td vAlign=top>Division</td>
            <td vAlign=top>8 div 4</td>
            <td vAlign=top>2</td>
        </tr>
        <tr>
            <td vAlign=top>=</td>
            <td vAlign=top>Equal</td>
            <td vAlign=top>price=9.80</td>
            <td vAlign=top>true if price is 9.80<br>false if price is 9.90</td>
        </tr>
        <tr>
            <td vAlign=top>!=</td>
            <td vAlign=top>Not equal</td>
            <td vAlign=top>price!=9.80</td>
            <td vAlign=top>true if price is 9.90<br>false if price is 9.80</td>
        </tr>
        <tr>
            <td vAlign=top>&lt;</td>
            <td vAlign=top>Less than</td>
            <td vAlign=top>price&lt;9.80</td>
            <td vAlign=top>true if price is 9.00<br>false if price is 9.80</td>
        </tr>
        <tr>
            <td vAlign=top>&lt;=</td>
            <td vAlign=top>Less than or equal to</td>
            <td vAlign=top>price&lt;=9.80</td>
            <td vAlign=top>true if price is 9.00<br>false if price is 9.90</td>
        </tr>
        <tr>
            <td vAlign=top>&gt;</td>
            <td vAlign=top>Greater than</td>
            <td vAlign=top>price&gt;9.80</td>
            <td vAlign=top>true if price is 9.90<br>false if price is 9.80</td>
        </tr>
        <tr>
            <td vAlign=top>&gt;=</td>
            <td vAlign=top>Greater than or equal to</td>
            <td vAlign=top>price&gt;=9.80</td>
            <td vAlign=top>true if price is 9.90<br>false if price is 9.70</td>
        </tr>
        <tr>
            <td vAlign=top>or</td>
            <td vAlign=top>or</td>
            <td vAlign=top>price=9.80 or price=9.70</td>
            <td vAlign=top>true if price is 9.80<br>false if price is 9.50</td>
        </tr>
        <tr>
            <td vAlign=top>and</td>
            <td vAlign=top>and </td>
            <td vAlign=top>price&gt;9.00 and price&lt;9.90</td>
            <td vAlign=top>true if price is 9.80<br>false if price is 8.50</td>
        </tr>
        <tr>
            <td vAlign=top>mod</td>
            <td vAlign=top>Modulus (division remainder)</td>
            <td vAlign=top>5 mod 2</td>
            <td vAlign=top>1</td>
        </tr>
    </tbody>
</table>
<br>
<div id=record>
<p class=title>XPath实例<br><small><font size=3>翻译：Linyupark / 2006-03-24</font></small></p>
<div class=content>
<p class=intro>Let's try to learn some basic XPath syntax by looking at some examples.<br>让我们来尝试通过观察一些实例来学习基础的XPath语法</p>
<hr>
<h2><font size=3>The XML Example Document</font> </h2>
<p>We will use the following XML document in the examples below.<br>我们将使用下面这个XML文档来进行实例</p>
<p>"books.xml":</p>
<pre>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</pre>
<pre>&lt;bookstore&gt;</pre>
<pre>&lt;book category="COOKING"&gt;<br>  &lt;title lang="en"&gt;Everyday Italian&lt;/title&gt;<br>  &lt;author&gt;Giada De Laurentiis&lt;/author&gt;<br>  &lt;year&gt;2005&lt;/year&gt;<br>  &lt;price&gt;30.00&lt;/price&gt;<br>&lt;/book&gt;</pre>
<pre>&lt;book category="CHILDREN"&gt;<br>  &lt;title lang="en"&gt;Harry Potter&lt;/title&gt;<br>  &lt;author&gt;J K. Rowling&lt;/author&gt;<br>  &lt;year&gt;2005&lt;/year&gt;<br>  &lt;price&gt;29.99&lt;/price&gt;<br>&lt;/book&gt;</pre>
<pre>&lt;book category="WEB"&gt;<br>  &lt;title lang="en"&gt;XQuery Kick Start&lt;/title&gt;<br>  &lt;author&gt;James McGovern&lt;/author&gt;<br>  &lt;author&gt;Per Bothner&lt;/author&gt;<br>  &lt;author&gt;Kurt Cagle&lt;/author&gt;<br>  &lt;author&gt;James Linn&lt;/author&gt;<br>  &lt;author&gt;Vaidyanathan Nagarajan&lt;/author&gt;<br>  &lt;year&gt;2003&lt;/year&gt;<br>  &lt;price&gt;49.99&lt;/price&gt;<br>&lt;/book&gt;</pre>
<pre>&lt;book category="WEB"&gt;<br>  &lt;title lang="en"&gt;Learning XML&lt;/title&gt;<br>  &lt;author&gt;Erik T. Ray&lt;/author&gt;<br>  &lt;year&gt;2003&lt;/year&gt;<br>  &lt;price&gt;39.95&lt;/price&gt;<br>&lt;/book&gt;</pre>
<pre>&lt;/bookstore&gt;</pre>
<p><a href="http://www.netvtm.com/w3s/xpath/books.xml" target=_blank>View the "books.xml" file in your browser</a>.</p>
<hr>
<h2><font size=3>Selecting Nodes<br>选择节点</font> </h2>
<p>We will use the Microsoft XMLDOM object to load the XML document and the selectNodes() function to select nodes from the XML document:<br>我们使用了XMLDOM对象来加载XML文档并用selectNode()函数来进行XML文档上节点的选择：</p>
<pre>set xmlDoc=CreateObject("Microsoft.XMLDOM")<br>xmlDoc.async="false"<br>xmlDoc.load("books.xml")</pre>
<pre>xmlDoc.selectNodes(<em>path expression</em>)</pre>
<br>
<hr>
<h2><font size=3>Select all book Nodes<br>选择所有book节点</font> </h2>
<p>The following example selects all the book nodes under the bookstore element:<br>下面这个实例就会选择所有bookstore元素以下的book节点：</p>
<pre>xmlDoc.selectNodes("/bookstore/book")</pre>
<p><a href="http://www.netvtm.com/w3s/xpath/tryit.asp?filename=try_xpath_select_cdnodes" target=_blank>如果你有IE5以上的版本你可以自己来做一下</a>.</p>
<hr>
<h2><font size=3>Select the First book Node<br>选择第一个book节点</font> </h2>
<p>The following example selects only the first book node under the bookstore element:</p>
<pre>xmlDoc.selectNodes("/bookstore/book[0]")</pre>
<p><a href="http://www.netvtm.com/w3s/xpath/tryit.asp?filename=try_xpath_select_cdnodes_first" target=_blank>If you have IE 5 or higher you can try it yourself</a>.</p>
<p><strong>Note:</strong> IE 5 and 6 has implemented that [0] should be the first node, but according to the W3C standard it should have been [1]!!</p>
<hr>
<h2><font size=3>Select the prices<br>选择prices</font> </h2>
<p>The following example selects the text from all the price nodes:</p>
<pre>xmlDoc.selectNodes("/bookstore/book/price/text()") </pre>
<p><a href="http://www.netvtm.com/w3s/xpath/tryit.asp?filename=try_xpath_select_pricenodes_text" target=_blank>If you have IE 5 or higher you can try it yourself</a>.</p>
<hr>
<h2><font size=3>Selecting price Nodes with Price&gt;35<br>选择price大于35的price节点</font> </h2>
<p>The following example selects all the price nodes with a price higher than 35:</p>
<pre>xmlDoc.selectNodes("/bookstore/book[price&gt;35]/price") </pre>
<p><a href="http://www.netvtm.com/w3s/xpath/tryit.asp?filename=try_xpath_select_pricenodes_35" target=_blank>If you have IE 5 or higher you can try it yourself</a>.</p>
<hr>
<h2><font size=3>Selecting title Nodes with Price&gt;35<br>选择Price大于35的title节点</font> </h2>
<p>The following example selects all the title nodes&nbsp;with a price higher than 35:</p>
<pre>xmlDoc.selectNodes("/bookstore/book[price&gt;35]/title") </pre>
<p><a href="http://www.netvtm.com/w3s/xpath/tryit.asp?filename=try_xpath_select_pricenodes_high" target=_blank>If you have IE 5 or higher you can try it yourself</a>.<br></p>
</div>
</div>
<img src ="http://www.blogjava.net/kxx129/aggbug/70552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2006-09-19 16:19 <a href="http://www.blogjava.net/kxx129/archive/2006/09/19/70552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>请求转发 请求重定向 包含</title><link>http://www.blogjava.net/kxx129/archive/2006/09/07/68050.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Thu, 07 Sep 2006 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2006/09/07/68050.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/68050.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2006/09/07/68050.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/68050.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/68050.html</trackback:ping><description><![CDATA[java&nbsp; jsp学了几年了，今天突然发现这些最基础的东西都还没有弄清楚，赶紧抽点时间把它记下来，以便以后复习！<br>1、请求转发<br>&nbsp;&nbsp;&nbsp;请求转发允许把请求转发给同一应用程序中的其他Web组件。这种技术通常用于Web应用控制层的Servlet流程控制器，它检查HTTP请求数据，并将请求转发到合适的目标组件，目标组件执行具体的请求处理具体的请求处理操作，并生成响应结果。<br>
<center><img height=384 alt=o_1.JPG src="http://www.blogjava.net/images/blogjava_net/kxx129/14928/o_1.JPG" width=512 align=center border=0></center><br>&nbsp;&nbsp;&nbsp;Servlet类使用javax.servlet.RequestDispatcher.forward()方法来转发它所收到的HTTP请求。转发目标组件将处理该请求并生成响应结果，或者将请求继续转发到另一个组件。最初请求的ServletRequest和ServletResponse对象被传递给转发目标组件，这使得目标组件可以访问整个请求上下文。值得注意的是，只能把请求转发给同一Web应用中的组件，而不能转发给其他Web应用的组件。<br>&nbsp;&nbsp;&nbsp;如果当前的Servlet组件要把请求转发给一个JSP组件，如hello.jsp，可以在Servlet的service()方法中执行以下代码：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestDispatcher rd = request.getRequestDispatcher("hello.jsp");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Forward to requested URL<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rd.forward(request, response);<br>&nbsp;&nbsp;&nbsp;在JSP页面中，可以使用&lt;jsp:forward&gt;标签来转发请求，例如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;jsp:forward page="hello.jsp"&gt;<br>&nbsp;&nbsp;&nbsp;对于请求转发，转发的源组件和目标组件共享request范围内的共享数据。<br>2、URL重定向<br>&nbsp;&nbsp;&nbsp;请求重定向类似于请求转发，但也有一些重要区别：<br>Web组件可以将请求重定向到任一URL，而不仅仅是同一应用中的URL。<br>重定向的源组件和目标组件之间不共用同一个HttpServletRequest对象，因此不能共享request范围内的共享数据。<br>
<center><img height=384 alt=o_2.JPG src="http://www.blogjava.net/images/blogjava_net/kxx129/14928/o_2.JPG" width=512 border=0></center><br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;如果当前应用的Servlet组件要把请求转发给URL"<a href="http://jakarta.apache.org/struts">http://jakarta.apache.org/struts</a>"，可以在Servlet的service()方法中执行以下代码：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font size=3><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">response.sendRedirect(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://jakarta.apache.org/struts</span><span style="COLOR: #000000">"</span></font><span style="COLOR: #000000">);<br>
<center><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></center></span></div>
&nbsp;&nbsp;&nbsp;HttpServletResponse的sendRedirect()方法向浏览器返回包含重定向的信息，浏览器根据这一信息迅速发出一个新HTTP请求，请求访问重定向目标组件。<br>3、包含<br>&nbsp;&nbsp;&nbsp;包含关系允许一个Web组件聚集来自同一个应用中其他Web组件的输出数据，并使用被聚集的数据来创建响应结果。这种技术通常用于模板处理器，它可以控制网页的布局。模板中每个页面区域的内容来自不同的URL，从而组成单个页面。这种技术能够为应用程序提供一致的外观和感觉。包含关系的源组件和目标组件共用同一个HttpServletRequest对象，因此它们共享request范围内的共享数据。<br>
<center><img height=384 alt=o_3.JPG src="http://www.blogjava.net/images/blogjava_net/kxx129/14928/o_3.JPG" width=553 border=0></center><br>&nbsp;&nbsp;&nbsp;Servlet类使用javax.servlet.RequestDispatcher.include()方法包含其他的Web组件。例如，如果当前的Servlet组件包含了三个JSP文件：header.jsp、main.jsp和footer.jsp，则可以在Servlet的service()方法中执行以下代码：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font size=3><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></font><font size=3><span style="COLOR: #000000">RequestDispatcher&nbsp;rd;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>rd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;req.getRequestDispatcher(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/header.jsp</span><span style="COLOR: #000000">"</span></font><font size=3><span style="COLOR: #000000">)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>rd.include(req,res);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>rd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;req.getRequestDispatcher(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/main.jsp</span><span style="COLOR: #000000">"</span></font><font size=3><span style="COLOR: #000000">)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>rd.include(req,res);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>rd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;req.getRequestDispatcher(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/footer.jsp</span><span style="COLOR: #000000">"</span></font><span style="COLOR: #000000"><font size=3>)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>rd.include(req,res);</font></span></div>
&nbsp;&nbsp;&nbsp;在JSP文件中，可以通过&lt;include&gt;指令来包含其他的Web资源，例如：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font size=3><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">@&nbsp;include&nbsp;file</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">header.jsp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%&gt;</span></font><span style="COLOR: #000000"><br><font size=3><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></font></span><font size=3><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">@&nbsp;include&nbsp;file</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">main.jsp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%&gt;</span></font><span style="COLOR: #000000"><br><font size=3><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></font></span><font size=3><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">@&nbsp;include&nbsp;file</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">footer.jsp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%&gt;</span></font><span style="COLOR: #000000"><br><font size=3><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></font></span></div>
&nbsp;&nbsp;&nbsp;&lt;来自孙卫琴----精通 Struts ：基于 MVC 的 JavaWeb 设计与开发&gt; 
<img src ="http://www.blogjava.net/kxx129/aggbug/68050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2006-09-07 17:42 <a href="http://www.blogjava.net/kxx129/archive/2006/09/07/68050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中反射的使用</title><link>http://www.blogjava.net/kxx129/archive/2006/09/05/67798.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Tue, 05 Sep 2006 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2006/09/05/67798.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/67798.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2006/09/05/67798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/67798.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/67798.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所用方法：</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span lang=EN-US>1</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</span> <span lang=EN-US>java.lang.Class.getMethod(String name, Class... parameterTypes) throws NoSuchMethodException, SecurityException</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String name</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">——待反射的目标方法</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Class... parameterTypes</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">——待反射的目标方法的参数类型的列表</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span lang=EN-US>2</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</span> <span lang=EN-US>java.lang.reflect.Method.invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Object obj</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">——待调用反射方法的宿主对象</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Object... args</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">——传入待调用反射方法参数的列表</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用说明：</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">待反射类</span> <span lang=EN-US>PersonService.java</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（其中有两个同名方法）</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_0_72_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_72_Open_Text.style.display='none'; Codehighlighter1_0_72_Closed_Image.style.display='inline'; Codehighlighter1_0_72_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_0_72_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_72_Closed_Text.style.display='none'; Codehighlighter1_0_72_Open_Image.style.display='inline'; Codehighlighter1_0_72_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top> <span id=Codehighlighter1_0_72_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span> <span id=Codehighlighter1_0_72_Open_Text><span style="COLOR: #008000">/**</span> <span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> <br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;</span> <span style="COLOR: #808080">@author</span> <span style="COLOR: #008000">&nbsp;kxx129<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;</span> <span style="COLOR: #808080">@version</span> <span style="COLOR: #008000">&nbsp;1.0.0&nbsp;2006-7-24<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;</span> <span style="COLOR: #808080">@since</span> <span style="COLOR: #008000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</span> <span style="COLOR: #008000">*/</span> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <br><img id=Codehighlighter1_102_525_Open_Image onclick="this.style.display='none'; Codehighlighter1_102_525_Open_Text.style.display='none'; Codehighlighter1_102_525_Closed_Image.style.display='inline'; Codehighlighter1_102_525_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_102_525_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_102_525_Closed_Text.style.display='none'; Codehighlighter1_102_525_Open_Image.style.display='inline'; Codehighlighter1_102_525_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top> </span><span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">&nbsp;PersonService&nbsp;</span> <span id=Codehighlighter1_102_525_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_102_525_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_161_302_Open_Image onclick="this.style.display='none'; Codehighlighter1_161_302_Open_Text.style.display='none'; Codehighlighter1_161_302_Closed_Image.style.display='inline'; Codehighlighter1_161_302_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_161_302_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_161_302_Closed_Text.style.display='none'; Codehighlighter1_161_302_Open_Image.style.display='inline'; Codehighlighter1_161_302_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;String&nbsp;PersonTest(Person&nbsp;person)&nbsp;</span> <span id=Codehighlighter1_161_302_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_161_302_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;person.setName(person.getName()&nbsp;</span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">has&nbsp;been&nbsp;detected!</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;person.getName()&nbsp;</span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000">&nbsp;person.getRole();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> <br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_377_519_Open_Image onclick="this.style.display='none'; Codehighlighter1_377_519_Open_Text.style.display='none'; Codehighlighter1_377_519_Closed_Image.style.display='inline'; Codehighlighter1_377_519_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_377_519_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_377_519_Closed_Text.style.display='none'; Codehighlighter1_377_519_Open_Image.style.display='inline'; Codehighlighter1_377_519_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;String&nbsp;PersonTest(Person&nbsp;person,&nbsp;Person&nbsp;person2)&nbsp;</span> <span id=Codehighlighter1_377_519_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_377_519_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;person.setName(person.getName()&nbsp;</span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">has&nbsp;been&nbsp;detected!</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;person.getName()&nbsp;</span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000">&nbsp;person2.getName();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> <br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span> </span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left>调用实例</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">》》调用目标为了调用</span> <span lang=EN-US>obj</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象的</span> <span lang=EN-US>methodName</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，这两个值一般作为参数传入</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #000000">Object&nbsp;obj&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000">&nbsp;PersonService();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_66_115_Open_Image onclick="this.style.display='none'; Codehighlighter1_66_115_Open_Text.style.display='none'; Codehighlighter1_66_115_Closed_Image.style.display='inline'; Codehighlighter1_66_115_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_66_115_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_66_115_Closed_Text.style.display='none'; Codehighlighter1_66_115_Open_Image.style.display='inline'; Codehighlighter1_66_115_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>String&nbsp;methodName</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">PersonTest</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">;</span> <span id=Codehighlighter1_66_115_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span> <span id=Codehighlighter1_66_115_Open_Text><span style="COLOR: #008000">/*</span> <span style="COLOR: #008000">一般反射时这个obj和methodName是不知道的，这里这样直接声名纯粹为了简化，方便实现</span> <span style="COLOR: #008000">*/</span> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>java.lang.reflect.Method&nbsp;m;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_161_188_Open_Image onclick="this.style.display='none'; Codehighlighter1_161_188_Open_Text.style.display='none'; Codehighlighter1_161_188_Closed_Image.style.display='inline'; Codehighlighter1_161_188_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_161_188_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_161_188_Closed_Text.style.display='none'; Codehighlighter1_161_188_Open_Image.style.display='inline'; Codehighlighter1_161_188_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>Class[]&nbsp;cls&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span id=Codehighlighter1_161_188_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_161_188_Open_Text><span style="COLOR: #000000">{Person.</span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">,&nbsp;Person.</span> <span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">}</span> </span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_207_224_Open_Image onclick="this.style.display='none'; Codehighlighter1_207_224_Open_Text.style.display='none'; Codehighlighter1_207_224_Closed_Image.style.display='inline'; Codehighlighter1_207_224_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_207_224_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_207_224_Closed_Text.style.display='none'; Codehighlighter1_207_224_Open_Image.style.display='inline'; Codehighlighter1_207_224_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>Object[]&nbsp;arg&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span id=Codehighlighter1_207_224_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_207_224_Open_Text><span style="COLOR: #000000">{person2,&nbsp;person&nbsp;}</span> </span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_232_737_Open_Image onclick="this.style.display='none'; Codehighlighter1_232_737_Open_Text.style.display='none'; Codehighlighter1_232_737_Closed_Image.style.display='inline'; Codehighlighter1_232_737_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_232_737_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_232_737_Closed_Text.style.display='none'; Codehighlighter1_232_737_Open_Image.style.display='inline'; Codehighlighter1_232_737_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span> <span style="COLOR: #0000ff">try</span> <span style="COLOR: #000000">&nbsp;</span> <span id=Codehighlighter1_232_737_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_232_737_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;obj.getClass().getMethod(methodName,&nbsp;cls);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_304_642_Open_Image onclick="this.style.display='none'; Codehighlighter1_304_642_Open_Text.style.display='none'; Codehighlighter1_304_642_Closed_Image.style.display='inline'; Codehighlighter1_304_642_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_304_642_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_304_642_Closed_Text.style.display='none'; Codehighlighter1_304_642_Open_Image.style.display='inline'; Codehighlighter1_304_642_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span> <span id=Codehighlighter1_304_642_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span> <span id=Codehighlighter1_304_642_Open_Text><span style="COLOR: #008000">/*</span> <span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(m.getName());<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(m.getReturnType().getName().toUpperCase());<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&lt;m.getGenericParameterTypes().length;&nbsp;i++){<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(m.getGenericParameterTypes()[i].toString());<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> <span style="COLOR: #008000">*/</span> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> <br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(String.valueOf(m.invoke(obj,&nbsp;arg)));<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_767_884_Open_Image onclick="this.style.display='none'; Codehighlighter1_767_884_Open_Text.style.display='none'; Codehighlighter1_767_884_Closed_Image.style.display='inline'; Codehighlighter1_767_884_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_767_884_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_767_884_Closed_Text.style.display='none'; Codehighlighter1_767_884_Open_Image.style.display='inline'; Codehighlighter1_767_884_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">catch</span> <span style="COLOR: #000000">&nbsp;(SecurityException&nbsp;e)&nbsp;</span> <span id=Codehighlighter1_767_884_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_767_884_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span> <span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_918_1035_Open_Image onclick="this.style.display='none'; Codehighlighter1_918_1035_Open_Text.style.display='none'; Codehighlighter1_918_1035_Closed_Image.style.display='inline'; Codehighlighter1_918_1035_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_918_1035_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_918_1035_Closed_Text.style.display='none'; Codehighlighter1_918_1035_Open_Image.style.display='inline'; Codehighlighter1_918_1035_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">catch</span> <span style="COLOR: #000000">&nbsp;(NoSuchMethodException&nbsp;e)&nbsp;</span> <span id=Codehighlighter1_918_1035_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_918_1035_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span> <span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_1072_1189_Open_Image onclick="this.style.display='none'; Codehighlighter1_1072_1189_Open_Text.style.display='none'; Codehighlighter1_1072_1189_Closed_Image.style.display='inline'; Codehighlighter1_1072_1189_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1072_1189_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1072_1189_Closed_Text.style.display='none'; Codehighlighter1_1072_1189_Open_Image.style.display='inline'; Codehighlighter1_1072_1189_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">catch</span> <span style="COLOR: #000000">&nbsp;(IllegalArgumentException&nbsp;e)&nbsp;</span> <span id=Codehighlighter1_1072_1189_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_1072_1189_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span> <span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_1224_1341_Open_Image onclick="this.style.display='none'; Codehighlighter1_1224_1341_Open_Text.style.display='none'; Codehighlighter1_1224_1341_Closed_Image.style.display='inline'; Codehighlighter1_1224_1341_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1224_1341_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1224_1341_Closed_Text.style.display='none'; Codehighlighter1_1224_1341_Open_Image.style.display='inline'; Codehighlighter1_1224_1341_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">catch</span> <span style="COLOR: #000000">&nbsp;(IllegalAccessException&nbsp;e)&nbsp;</span> <span id=Codehighlighter1_1224_1341_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_1224_1341_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span> <span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_1379_1496_Open_Image onclick="this.style.display='none'; Codehighlighter1_1379_1496_Open_Text.style.display='none'; Codehighlighter1_1379_1496_Closed_Image.style.display='inline'; Codehighlighter1_1379_1496_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1379_1496_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1379_1496_Closed_Text.style.display='none'; Codehighlighter1_1379_1496_Open_Image.style.display='inline'; Codehighlighter1_1379_1496_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">catch</span> <span style="COLOR: #000000">&nbsp;(InvocationTargetException&nbsp;e)&nbsp;</span> <span id=Codehighlighter1_1379_1496_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_1379_1496_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span> <span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left>代码说明：</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在实例中待调用方法的参数类型列表，参数列表如下</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><strong style="mso-bidi-font-weight: normal"><span lang=EN-US>Class[] cls = {Person.class, Person.class};<o:p></o:p></span> </strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><strong style="mso-bidi-font-weight: normal"><span lang=EN-US>Object[] arg = {person2, person };<o:p></o:p></span> </strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所以是调用的</span> <span lang=EN-US>PersonService</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的</span> <span lang=EN-US>public String PersonTest(Person person, Person person2)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，如果这里换成</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><strong style="mso-bidi-font-weight: normal"><span lang=EN-US>Class[] cls = {Person.class };<o:p></o:p></span> </strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><strong style="mso-bidi-font-weight: normal"><span lang=EN-US>Object[] arg = { person };<o:p></o:p></span> </strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则会调用</span> <span lang=EN-US>public String PersonTest(Person person)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法。</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当然如果参数类型列表换成</span> <strong style="mso-bidi-font-weight: normal"><span lang=EN-US>Class[] cls = {String.class };<o:p></o:p></span> </strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则必然在</span> <strong style="mso-bidi-font-weight: normal"><span lang=EN-US>getMethod(methodName, cls)</span> </strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处抛出</span> <u><span lang=EN-US style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: navy; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white">NoSuchMethodException</span> </u><u><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></u></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果参数类型与参数不对应：</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><strong style="mso-bidi-font-weight: normal"><span lang=EN-US>Class[] cls = {Person.class };<o:p></o:p></span> </strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><strong style="mso-bidi-font-weight: normal"><span lang=EN-US>Object[] arg = {</span> </strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8220;</span> <span lang=EN-US>String</span> </strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8221;</span> <span lang=EN-US>};<o:p></o:p></span> </strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则也必然在</span> <strong style="mso-bidi-font-weight: normal"><span lang=EN-US>invoke(obj, arg)</span> </strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处抛出</span> <u><span lang=EN-US style="FONT-SIZE: 10pt; BACKGROUND: white; COLOR: navy; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt; mso-highlight: white">IllegalArgumentException</span> </u><u><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt"><o:p></o:p></span></u></p>
<img src ="http://www.blogjava.net/kxx129/aggbug/67798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2006-09-05 14:13 <a href="http://www.blogjava.net/kxx129/archive/2006/09/05/67798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript 中的键盘事件</title><link>http://www.blogjava.net/kxx129/archive/2006/09/05/67777.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Tue, 05 Sep 2006 04:39:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2006/09/05/67777.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/67777.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2006/09/05/67777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/67777.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/67777.html</trackback:ping><description><![CDATA[控制Enter按键的使用<br>1.在语言块中使用<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_30_127_Open_Image onclick="this.style.display='none'; Codehighlighter1_30_127_Open_Text.style.display='none'; Codehighlighter1_30_127_Closed_Image.style.display='inline'; Codehighlighter1_30_127_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_30_127_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_30_127_Closed_Text.style.display='none'; Codehighlighter1_30_127_Open_Image.style.display='inline'; Codehighlighter1_30_127_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">script&nbsp;</span><span style="COLOR: #ff0000">language</span><span style="COLOR: #0000ff">="javascript"</span><span style="COLOR: #0000ff">&gt;</span><span id=Codehighlighter1_30_127_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_30_127_Open_Text><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">function</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&nbsp;handle()<br><img id=Codehighlighter1_49_98_Open_Image onclick="this.style.display='none'; Codehighlighter1_49_98_Open_Text.style.display='none'; Codehighlighter1_49_98_Closed_Image.style.display='inline'; Codehighlighter1_49_98_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_49_98_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_49_98_Closed_Text.style.display='none'; Codehighlighter1_49_98_Open_Image.style.display='inline'; Codehighlighter1_49_98_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span id=Codehighlighter1_49_98_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_49_98_Open_Text><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">if</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">(event.keyCode</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">==</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">13</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">)<br><img id=Codehighlighter1_75_96_Open_Image onclick="this.style.display='none'; Codehighlighter1_75_96_Open_Text.style.display='none'; Codehighlighter1_75_96_Closed_Image.style.display='inline'; Codehighlighter1_75_96_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_75_96_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_75_96_Closed_Text.style.display='none'; Codehighlighter1_75_96_Open_Image.style.display='inline'; Codehighlighter1_75_96_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_75_96_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_75_96_Open_Text><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.close();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>document.onkeydown</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">handle;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">script</span><span style="COLOR: #0000ff">&gt;</span></div>
<br>2.在body的使用<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&#8230;&#8230;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">body&nbsp;</span><span style="COLOR: #ff0000">style</span><span style="COLOR: #0000ff">="back-groundcolor:white;margin-left:20px;margin-right:20px;margin-top:10px;margin-bottom:0px"</span><span style="COLOR: #ff0000">&nbsp;onkeydown</span><span style="COLOR: #0000ff">="if&nbsp;(window.event.keyCode==13)self.close();"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&#8230;&#8230;</span></div>
<br>3.在form标签中使用<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&#8230;&#8230;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">form&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="form1"</span><span style="COLOR: #ff0000">&nbsp;onkeydown&nbsp;</span><span style="COLOR: #0000ff">=&nbsp;"if&nbsp;(window.event.keyCode&nbsp;==&nbsp;13)confirmClick('save');"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&#8230;&#8230;</span></div>
<p><br>ENTER键可以让光标移到下一个输入框 <br>&lt;input onkeydown="if(event.keyCode==13)event.keyCode=9" &gt; &lt;br&gt;</p>
<p>只能是中文&lt;input onkeyup="value=value.replace(/[ -~]/g,'')" onkeydown="if(event.keyCode==13)event.keyCode=9"&gt; &lt;br&gt;</p>
<p>屏蔽输入法&lt;input style="ime-mode:disabled" onkeydown="if(event.keyCode==13)event.keyCode=9"&gt; &lt;br&gt;</p>
<p>只能输入英文和数字&lt;input onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" onkeydown="if(event.keyCode==13)event.keyCode=9"&gt; &lt;br&gt;</p>
<p>只能是数字&lt;input onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"&gt;&lt;br&gt;</p>
<p>只能显示，不能修改&lt;input readonly value="只能显示，不能修改"&gt;</p>
<img src ="http://www.blogjava.net/kxx129/aggbug/67777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2006-09-05 12:39 <a href="http://www.blogjava.net/kxx129/archive/2006/09/05/67777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习笔记:ServletContext接口</title><link>http://www.blogjava.net/kxx129/archive/2006/09/04/67515.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Mon, 04 Sep 2006 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2006/09/04/67515.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/67515.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2006/09/04/67515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/67515.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/67515.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安装在服务器中的每一个特定URL名字空间（又叫虚拟目录比如，/myWeb）下的所有Servlet，JSP，JavaBean等Web部件的集合构成一个Web应用，每一个Web应用（同一JVM），容器都会有一个背景对象，而javax.servlet.ServletContext接口就提供了访问这个背景对象的途径。你可以通过一个Servlet实例的getServletContext方法得到该Servlet运行其中的这个背景对象。从这个背景对象中你可以访问如下信息或资源：<br>
<ul>
    <li>初始化参数&nbsp;&nbsp;&nbsp;&nbsp;
    <li>存储在背景中的对象&nbsp;&nbsp;
    <li>与本背景关联的各种资源&nbsp;&nbsp;&nbsp;&nbsp;
    <li>日志</li>
</ul>
<p>可以调用ServletContext.getInitParameterNames()返回一个初始化参数的枚举对象（java.util.Enumeration），或直接指定一个参数名来得到特定的参数值：ServletContext.getInitParameter(String&nbsp;name)。<br>另外，在Servlet的背景中还可以存放与特定名字绑定的任意类型的对象，比如：</p>
<p class=codeStyle>&nbsp;context.setAttribute(<strong><a href="http://www.javaresearch.org:88/source/jdk142/java/lang/String.java.html" target=_blank><font class=classLink><u>String</u></font></a></strong>&nbsp;name,&nbsp;<strong><a href="http://www.javaresearch.org:88/source/jdk142/java/lang/Object.java.html" target=_blank><font class=classLink><u>Object</u></font></a></strong>&nbsp;object); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将把object对象绑定到名字name，存放在Servlet背景中，可供同一背景中的其他Servlet共享。其他Servlet可以通过context.getAttribute(String&nbsp;name)，得到一个背景中的对象，或通过context.removeAttribute(String&nbsp;name)在背景中移除一个对象。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个特定资源的URL可以通过调用ServletContext.getResource(String&nbsp;path)得到，这儿的path参数必须以/开始，将被解析为相对于当前Servlet背景的根的相对路径。这个方法有别于基于类加载器的java.lang.Class.getResource方法。如果你通过ServletContext.getResource方法请求了一个.jsp页面，你得到的将是JSP的源码，要得到执行结果，可以使用RequestDispatcher对象的include方法。你也可以直接以输入流的形式得到资源，<br></p>
<p class=codeStyle>&nbsp;<strong><font color=#0000ff>public</font></strong>&nbsp;<font color=#ff0000>InputStream</font>&nbsp;getResourceAsStream(<strong><a href="http://www.javaresearch.org:88/source/jdk142/java/lang/String.java.html" target=_blank><font class=classLink><u>String</u></font></a></strong>&nbsp;path);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletContext提供了日志的支持，你可以简单的通过调用ServletContext.log(String&nbsp;msg)，或ServletContext.log(String&nbsp;msg,Throwable&nbsp;throwable)方法，向底层的Servlet日志记录写入日志信息，后者还可写入异常信息和throwable的跟踪栈。<br><strong>学习笔记：ServletContext接口</strong> &nbsp;&nbsp;(http://www.51dibs.com/article_view.asp?id=10471)</p>
<img src ="http://www.blogjava.net/kxx129/aggbug/67515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2006-09-04 09:57 <a href="http://www.blogjava.net/kxx129/archive/2006/09/04/67515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts struts-config.xml 配置</title><link>http://www.blogjava.net/kxx129/archive/2006/09/01/67133.html</link><dc:creator>泰仔在线</dc:creator><author>泰仔在线</author><pubDate>Fri, 01 Sep 2006 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/kxx129/archive/2006/09/01/67133.html</guid><wfw:comment>http://www.blogjava.net/kxx129/comments/67133.html</wfw:comment><comments>http://www.blogjava.net/kxx129/archive/2006/09/01/67133.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/kxx129/comments/commentRss/67133.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kxx129/services/trackbacks/67133.html</trackback:ping><description><![CDATA[<div class=entry-title style="CURSOR: hand" onclick=resize(this)><font size=3>作为Java web应用的四个知名配置文件,这里花了两天时间完成了这个struts-config.xml文件的常用配置详解.不求最全,但求实用.希望能给大家带来方便.</font> </div>
<div class=entry-body>
<div>&nbsp;</div>
<div>关键字:Struts struts-config.xml 配置</div>
<div>&nbsp;</div>
<div>以下是一份完整的struts-config.xml文件,配置元素的说明详见注释.</div>
<div>&nbsp;</div>
<div>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;!DOCTYPE struts-config PUBLIC<br>&nbsp;"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"<br>&nbsp;"<a href="http://jakarta.apache.org/struts/dtds/struts-config.dtd"><font color=#0083fa>http://jakarta.apache.org/struts/dtds/struts-config.dtd</font></a>"&gt;</div>
<div>&lt;!-- struts-config.xml中的元素必须按照上述doc指令中的dtd文档定义顺序书写，本例即遵从了dtd定义顺序 --&gt;</div>
<div>&lt;!-- struts-config是整个xml的根元素，其他元素必须被包含其内 --&gt;<br>&lt;struts-config&gt;</div>
<div>&nbsp;&lt;!--<br>&nbsp;&nbsp;名称:data-sources<br>&nbsp;&nbsp;描述：data-sources元素定义了web App所需要使用的数据源<br>&nbsp;&nbsp;数量：最多一个<br>&nbsp;&nbsp;子元素:data-source<br>&nbsp;--&gt;<br>&nbsp;&lt;data-sources&gt;<br>&nbsp;&nbsp;&lt;!--<br>&nbsp;&nbsp;&nbsp;名称：data-source<br>&nbsp;&nbsp;&nbsp;描述：data-source元素定义了具体的数据源<br>&nbsp;&nbsp;&nbsp;数量：任意多个<br>&nbsp;&nbsp;&nbsp;属性：<br>&nbsp;&nbsp;&nbsp;&nbsp;@key：当需要配置多个数据源时，相当于数据源的名称，用来数据源彼此间进行区别<br>&nbsp;&nbsp;&nbsp;&nbsp;@type：可以使用的数据源实现的类，一般来自如下四个库<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Poolman，开放源代码软件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Expresso，Jcorporate<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JDBC Pool，开放源代码软件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBCP，Jakarta<br>&nbsp;&nbsp;--&gt;<br>&nbsp;&nbsp;&lt;data-source key="firstOne" type="org.apache.commons.dbcp.BasicDataSource"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;!--<br>&nbsp;&nbsp;&nbsp;&nbsp;名称：set-property<br>&nbsp;&nbsp;&nbsp;&nbsp;描述：用来设定数据源的属性<br>&nbsp;&nbsp;&nbsp;&nbsp;属性：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@autoCommit:是否自动提交&nbsp;可选值：true/false<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@description:数据源描述<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@driverClass:数据源使用的类<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@maxCount:最大数据源连接数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@minCount:最小数据源连接数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@user:数据库用户<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@password:数据库密码<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@url:数据库url<br>&nbsp;&nbsp;&nbsp;--&gt;<br>&nbsp;&nbsp;&nbsp;&lt;set-property property="autoCommit" value="true"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;set-property property="description" value="Hello!"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;set-property property="driverClass" value="com.mysql.jdbc.Driver"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;set-property property="maxCount" value="10"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;set-property property="minCount" value="2"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;set-property property="user" value="root"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;set-property property="password" value=""/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;set-property property="url" value="jdbc:mysql://localhost:3306/helloAdmin"/&gt;<br>&nbsp;&nbsp;&lt;/data-source&gt;<br>&nbsp;&lt;/data-sources&gt;<br>&nbsp;<br>&nbsp;&lt;!--<br>&nbsp;&nbsp;名称：form-beans<br>&nbsp;&nbsp;描述：用来配置多个ActionForm Bean<br>&nbsp;&nbsp;数量：最多一个<br>&nbsp;&nbsp;子元素：form-bean<br>&nbsp;--&gt;<br>&nbsp;&lt;form-beans&gt;<br>&nbsp;&nbsp;&lt;!--<br>&nbsp;&nbsp;&nbsp;名称：form-bean<br>&nbsp;&nbsp;&nbsp;描述：用来配置ActionForm Bean<br>&nbsp;&nbsp;&nbsp;数量：任意多个<br>&nbsp;&nbsp;&nbsp;子元素：form-property<br>&nbsp;&nbsp;&nbsp;属性：<br>&nbsp;&nbsp;&nbsp;&nbsp;@className：指定与form-bean元素相对应的配置类，一般默认使用org.apaceh.struts.config.FormBeanConfig，如果自定义，则必须继承 FormBeanConfig<br>&nbsp;&nbsp;&nbsp;&nbsp;@name：必备属性！为当前form-bean制定一个全局唯一的标识符，使得在整个Struts框架内，可以通过该标识符来引用这个ActionForm Bean。<br>&nbsp;&nbsp;&nbsp;&nbsp;@type：必备属性！指明实现当前ActionForm Bean的完整类名。<br>&nbsp;&nbsp;--&gt;<br>&nbsp;&nbsp;&lt;form-bean name="Hello" type="myPack.Hello"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;!--<br>&nbsp;&nbsp;&nbsp;&nbsp;名称：form-property<br>&nbsp;&nbsp;&nbsp;&nbsp;描述：用来设定ActionForm Bean的属性<br>&nbsp;&nbsp;&nbsp;&nbsp;数量：根据实际需求而定，例如，ActionForm Bean对应的一个登陆Form中有两个文本框，name和password，ActionForm Bean中也有这两个字段，则此处编写两个form-property来设定属性<br>&nbsp;&nbsp;&nbsp;&nbsp;属性：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@className：指定与form-property相对应的配置类，默认是org.apache.struts.config.FormPropertyConfig，如果自定义，则必须继承FormPropertyConfig类<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@name：所要设定的ActionForm Bean的属性名称<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@type：所要设定的ActionForm Bean的属性值的类<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@initial：当前属性的初值<br>&nbsp;&nbsp;&nbsp;--&gt;<br>&nbsp;&nbsp;&nbsp;&lt;form-property name="name" type="java.lang.String"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;form-property name="number" type="java.lang.Iteger" initial="18"/&gt;<br>&nbsp;&nbsp;&lt;/form-bean&gt;<br>&nbsp;&lt;/form-beans&gt;<br>&nbsp;<br>&nbsp;&lt;!--<br>&nbsp;&nbsp;名称：global-exceptions<br>&nbsp;&nbsp;描述：处理异常<br>&nbsp;&nbsp;数量：最多一个<br>&nbsp;&nbsp;子元素：exception<br>&nbsp;--&gt;<br>&nbsp;&lt;global-exceptions&gt;<br>&nbsp;&nbsp;&lt;!--<br>&nbsp;&nbsp;&nbsp;名称：exception<br>&nbsp;&nbsp;&nbsp;描述：具体定义一个异常及其处理<br>&nbsp;&nbsp;&nbsp;数量：任意多个<br>&nbsp;&nbsp;&nbsp;属性：<br>&nbsp;&nbsp;&nbsp;&nbsp;@className:指定对应exception的配置类，默认为org.apache.struts.config.ExceptionConfig<br>&nbsp;&nbsp;&nbsp;&nbsp;@handler:指定异常处理类，默认为org.apache.struts.action.ExceptionHandler<br>&nbsp;&nbsp;&nbsp;&nbsp;@key:指定在Resource Bundle种描述该异常的消息key<br>&nbsp;&nbsp;&nbsp;&nbsp;@path:指定当发生异常时，进行转发的路径<br>&nbsp;&nbsp;&nbsp;&nbsp;@scope:指定ActionMessage实例存放的范围，默认为request，另外一个可选值是session<br>&nbsp;&nbsp;&nbsp;&nbsp;@type:必须要有！指定所需要处理异常类的名字。<br>&nbsp;&nbsp;&nbsp;&nbsp;@bundle:指定资源绑定<br>&nbsp;&nbsp;--&gt;<br>&nbsp;&nbsp;&lt;exception<br>&nbsp;&nbsp; key=""hello.error<br>&nbsp;&nbsp; path="/error.jsp"<br>&nbsp;&nbsp; scope="session"<br>&nbsp;&nbsp; type="hello.HandleError"/&gt;<br>&nbsp;&lt;/global-exceptions&gt;<br>&nbsp;<br>&nbsp;&lt;!--<br>&nbsp;&nbsp;名称：global-forwards<br>&nbsp;&nbsp;描述：定义全局转发<br>&nbsp;&nbsp;数量：最多一个<br>&nbsp;&nbsp;子元素：forward<br>&nbsp;--&gt;<br>&nbsp;&lt;global-forwards&gt;<br>&nbsp;&nbsp;&lt;!--<br>&nbsp;&nbsp;&nbsp;名称：forward<br>&nbsp;&nbsp;&nbsp;描述：定义一个具体的转发<br>&nbsp;&nbsp;&nbsp;数量：任意多个<br>&nbsp;&nbsp;&nbsp;属性：<br>&nbsp;&nbsp;&nbsp;&nbsp;@className:指定和forward元素对应的配置类，默认为org.apache.struts.action.ActionForward<br>&nbsp;&nbsp;&nbsp;&nbsp;@contextRelative:如果为true，则指明使用当前上下文，路径以&#8220;/&#8221;开头，默认为false<br>&nbsp;&nbsp;&nbsp;&nbsp;@name:必须配有！指明转发路径的唯一标识符<br>&nbsp;&nbsp;&nbsp;&nbsp;@path:必须配有！指明转发或者重定向的URI。必须以"/"开头。具体配置要与contextRelative相应。<br>&nbsp;&nbsp;&nbsp;&nbsp;@redirect:为true时，执行重定向操作，否则执行请求转发。默认为false<br>&nbsp;&nbsp;--&gt;<br>&nbsp;&nbsp;&lt;forward name="A" path="/a.jsp"/&gt;<br>&nbsp;&nbsp;&lt;forward name="B" path="/hello/b.do"/&gt;<br>&nbsp;&lt;/global-forwards&gt;<br>&nbsp;<br>&nbsp;&lt;!--<br>&nbsp;&nbsp;名称：action-mappings<br>&nbsp;&nbsp;描述：定义action集合<br>&nbsp;&nbsp;数量：最多一个<br>&nbsp;&nbsp;子元素：action<br>&nbsp;--&gt;<br>&nbsp;&lt;action-mappings&gt;<br>&nbsp;&nbsp;&lt;!--<br>&nbsp;&nbsp;&nbsp;名称：action<br>&nbsp;&nbsp;&nbsp;描述：定义了从特定的请求路径到相应的Action类的映射<br>&nbsp;&nbsp;&nbsp;数量：任意多个<br>&nbsp;&nbsp;&nbsp;子元素：exception,forward（二者均为局部量）<br>&nbsp;&nbsp;&nbsp;属性：<br>&nbsp;&nbsp;&nbsp;&nbsp;@attribute:制定与当前Action相关联的ActionForm Bean在request和session范围内的名称（key）<br>&nbsp;&nbsp;&nbsp;&nbsp;@className:与Action元素对应的配置类。默认为org.apache.struts.action.ActionMapping<br>&nbsp;&nbsp;&nbsp;&nbsp;@forward:指名转发的URL路径<br>&nbsp;&nbsp;&nbsp;&nbsp;@include:指名包含的URL路径<br>&nbsp;&nbsp;&nbsp;&nbsp;@input:指名包含输入表单的URL路径，表单验证失败时，请求会被转发到该URL中<br>&nbsp;&nbsp;&nbsp;&nbsp;@name:指定和当前Acion关联的ActionForm Bean的名字。该名称必须在form-bean元素中定义过。<br>&nbsp;&nbsp;&nbsp;&nbsp;@path:指定访问Action的路径，以"/"开头，没有扩展名<br>&nbsp;&nbsp;&nbsp;&nbsp;@parameter:为当前的Action配置参数，可以在Action的execute()方法中，通过调用ActionMapping的getParameter()方法来获取参数<br>&nbsp;&nbsp;&nbsp;&nbsp;@roles:指定允许调用该Aciton的安全角色。多个角色之间用逗号分割。处理请求时，RequestProcessor会根据该配置项来决定用户是否有调用该Action的权限<br>&nbsp;&nbsp;&nbsp;&nbsp;@scope:指定ActionForm Bean的存在范围，可选值为request和session。默认为session<br>&nbsp;&nbsp;&nbsp;&nbsp;@type:指定Action类的完整类名<br>&nbsp;&nbsp;&nbsp;&nbsp;@unknown:值为true时，表示可以处理用户发出的所有无效的Action URL。默认为false<br>&nbsp;&nbsp;&nbsp;&nbsp;@validate:指定是否要先调用ActionForm Bean的validate()方法。默认为true<br>&nbsp;&nbsp;&nbsp;注意：如上属性中，forward/include/type三者相斥，即三者在同一Action配置中只能存在一个。<br>&nbsp;&nbsp;--&gt;<br>&nbsp;&nbsp;&lt;action path="/search"<br>&nbsp;&nbsp;&nbsp;type="addressbook.actions.SearchAction"<br>&nbsp;&nbsp;&nbsp;name="searchForm"<br>&nbsp;&nbsp;&nbsp;scope="request"<br>&nbsp;&nbsp;&nbsp;validate="true"<br>&nbsp;&nbsp;&nbsp;input="/search.jsp"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;forward name="success" path="/display.jsp"/&gt;<br>&nbsp;&nbsp;&lt;/action&gt;&nbsp;&nbsp;<br>&nbsp;&lt;/action-mappings&gt;<br>&nbsp;<br>&nbsp;&lt;!--<br>&nbsp;&nbsp;名称：controller<br>&nbsp;&nbsp;描述：用于配置ActionServlet<br>&nbsp;&nbsp;数量：最多一个<br>&nbsp;&nbsp;属性：<br>&nbsp;&nbsp;&nbsp;@bufferSize:指定上传文件的输入缓冲的大小.默认为4096<br>&nbsp;&nbsp;&nbsp;@className:指定当前控制器的配置类.默认为org.apache.struts.config.ControllerConfig<br>&nbsp;&nbsp;&nbsp;@contentType:指定相应结果的内容类型和字符编码<br>&nbsp;&nbsp;&nbsp;@locale:指定是否把Locale对象保存到当前用户的session中,默认为false<br>&nbsp;&nbsp;&nbsp;@processorClass:指定负责处理请求的Java类的完整类名.默认org.apache.struts.action.RequestProcessor<br>&nbsp;&nbsp;&nbsp;@tempDir:指定文件上传时的临时工作目录.如果没有设置,将才用Servlet容器为web应用分配的临时工作目录.<br>&nbsp;&nbsp;&nbsp;@nochache:true时,在相应结果中加入特定的头参数:Pragma&nbsp;,Cache-Control,Expires防止页面被存储在可数浏览器的缓存中,默认为false<br>&nbsp;--&gt;<br>&nbsp;&lt;controller <br>&nbsp;&nbsp;contentType="text/html;charset=UTF-8"<br>&nbsp;&nbsp;locale="true"<br>&nbsp;&nbsp;processorClass="CustomRequestProcessor"&gt;<br>&nbsp;&lt;/controller&gt;</div>
<div>&nbsp;&lt;!--<br>&nbsp;&nbsp;名称:message-resources<br>&nbsp;&nbsp;描述:配置Resource Bundle.<br>&nbsp;&nbsp;数量:任意多个<br>&nbsp;&nbsp;属性:<br>&nbsp;&nbsp;&nbsp;@className:指定和message-resources对应的配置类.默认为org.apache.struts.config.MessageResourcesConfig<br>&nbsp;&nbsp;&nbsp;@factory:指定资源的工厂类,默认为org.apache.struts.util.PropertyMessageResourcesFactory<br>&nbsp;&nbsp;&nbsp;@key:<br>&nbsp;&nbsp;&nbsp;@null:<br>&nbsp;&nbsp;&nbsp;@parameter:<br>&nbsp;--&gt;<br>&nbsp;&lt;message-resources<br>&nbsp;&nbsp;null="false"<br>&nbsp;&nbsp;parameter="defaultResource"/&gt;<br>&nbsp;&lt;message-resources<br>&nbsp;&nbsp;key="images"<br>&nbsp;&nbsp;null="false"<br>&nbsp;&nbsp;parameter="ImageResources"/&gt;<br>&nbsp;&nbsp;<br>&nbsp;&lt;!--<br>&nbsp;&nbsp;名称:plug-in<br>&nbsp;&nbsp;描述:用于配置Struts的插件<br>&nbsp;&nbsp;数量:任意多个<br>&nbsp;&nbsp;子元素:set-property<br>&nbsp;&nbsp;属性:<br>&nbsp;&nbsp;&nbsp;@className:指定Struts插件类.此类必须实现org.apache.struts.action.PlugIn接口<br>&nbsp;--&gt;<br>&nbsp;&lt;plug-in<br>&nbsp;&nbsp;className="org.apache.struts.validator.ValidatorPlugIn"&gt;<br>&nbsp;&nbsp;&lt;!--<br>&nbsp;&nbsp;&nbsp;名称:set-property<br>&nbsp;&nbsp;&nbsp;描述:配置插件的属性<br>&nbsp;&nbsp;&nbsp;数量:任意多个<br>&nbsp;&nbsp;&nbsp;属性:<br>&nbsp;&nbsp;&nbsp;&nbsp;@property:插件的属性名称<br>&nbsp;&nbsp;&nbsp;&nbsp;@value:该名称所配置的值<br>&nbsp;&nbsp;--&gt;<br>&nbsp;&nbsp;&lt;set-property <br>&nbsp;&nbsp;&nbsp;property="pathnames"<br>&nbsp;&nbsp;&nbsp;value="/WEB-INF/validator-rules.xml,/WEB-INF/vlaidation.xml"/&gt;<br>&nbsp;&lt;/plug-in&gt;<br>&nbsp;<br>&lt;/struts-config&gt;</div>
</div>
<img src ="http://www.blogjava.net/kxx129/aggbug/67133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kxx129/" target="_blank">泰仔在线</a> 2006-09-01 16:09 <a href="http://www.blogjava.net/kxx129/archive/2006/09/01/67133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>