??xml version="1.0" encoding="utf-8" standalone="yes"?>国产成人亚洲综合,天堂亚洲国产中文在线,国产青草亚洲香蕉精品久久http://www.tkk7.com/jasonwbd/category/34741.htmlFirst know how, Second know why !zh-cnMon, 22 Sep 2008 20:14:43 GMTMon, 22 Sep 2008 20:14:43 GMT60使用 JFreeChart来创建基于web的图?/title><link>http://www.tkk7.com/jasonwbd/articles/230261.html</link><dc:creator>D于渊</dc:creator><author>D于渊</author><pubDate>Sun, 21 Sep 2008 07:00:00 GMT</pubDate><guid>http://www.tkk7.com/jasonwbd/articles/230261.html</guid><wfw:comment>http://www.tkk7.com/jasonwbd/comments/230261.html</wfw:comment><comments>http://www.tkk7.com/jasonwbd/articles/230261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jasonwbd/comments/commentRss/230261.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jasonwbd/services/trackbacks/230261.html</trackback:ping><description><![CDATA[<br /> <a >http://www.ibm.com/developerworks/cn/java/l-jfreechart/index.html</a><br /> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr valign="top"> <td width="100%"> <h1><span style="color: #808000">使用 JFreeChart来创建基于web的图?/span></h1> <span style="color: #808000"><img class="display-img" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="1" /></span></td> <td class="no-print" width="192"><span style="color: #808000"><img height="18" alt="developerWorks" src="http://www.ibm.com/developerworks/i/dw.gif" width="192" /></span></td> </tr> </tbody> </table> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr valign="top"> <td width="10"><span style="color: #808000"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></span></td> <td width="100%"> <table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0"> <tbody> <tr> <td width="10"><span style="color: #808000"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></span></td> <td> <table cellspacing="0" cellpadding="0" width="150" border="0"> <tbody> <tr> <td class="v14-header-1-small"><span style="color: #808000">文档选项</span></td> </tr> </tbody> </table> <table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td class="no-padding" width="150"> <table cellspacing="0" cellpadding="0" width="143" border="0"> <script language="JavaScript" type="text/javascript"> <!-- document.write('<tr valign="top"><td width="8"><img src="http://www.ibm.com/i/c.gif" width="8" height="1" alt="" /></td><td width="16"><img alt="打印机的版面设|成横向打印模式" height="16" src="http://www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3" /></td><td width="122"><p><strong><a class="smallplainlink" href="javascript:print()">打印本页</a></strong></p></td></tr>'); //--> </script> <tbody> <tr valign="top"> <td width="8"><span style="color: #808000"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" /></span></td> <td width="16"><span style="color: #808000"><img height="16" alt="打印机的版面设|成横向打印模式" src="http://www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3" /></span></td> <td width="122"> <p><strong><a class="smallplainlink" href="javascript:print()" cmimpressionsent="1"><span style="color: #808000">打印本页</span></a></strong></p> </td> </tr> <noscript></noscript> <form name="email" action="https://www.ibm.com/developerworks/secure/email-it.jsp" cm1="1"> <input type="hidden" value="WWW的发展得基于因特网的应用程序不再局限于静态或者简单的动态内Ҏ供。传l的一些以软g包Ş式发布应用程序例如报表系l等都在逐渐搬到因特|上。但是这两者之间有着天壤之别Q虽然对于数据获取、业务处理等斚w基本cMQ但是最大的差别在于用户界面。ؓ了能在web览器上昄要求用户界面使用HTML以及囄的方式来展现数据Q而传l的一些利用操作系l本w的控g来开发的用户界面无法适应琳琅满目的客LQ因此在q里也变得无能ؓ力。回到本文的题目上来Qؓ了创Z个可以在web览器上查看到图表一般有两种做法Q第一U就是用applet利用java本n对图形的支持来显CZ个图表;W二U就是直接在web服务器端生成好图表图片文件后发送给览器。第一U方式显然对于客L要求太高Q随着现在L览器放弃对JAVA的支持后Q这U方式只适合一些局域网的应用,而对于因特网的环境就昑־不太适合。因此我们下面将介绍一个JAVA的图表引擎JFreeChart用来产生ZWEB的图表? name="body" cM3 cm1="1" cm2="0" /><input type="hidden" value="使用 JFreeChart来创建基于web的图? name="subject" cM3 cm1="1" cm2="1" /><input type="hidden" value="cn" name="lang" cM3 cm1="1" cm2="2" /><span style="color: #808000"> <script language="JavaScript" type="text/javascript"> <!-- document.write('<tr valign="top"><td width="8"><img src="http://www.ibm.com/i/c.gif" width="8" height="1" alt="" /></td><td width="16"><img src="http://www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="此作为电子邮件发? /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><strong>此作为电子邮件发?/strong></a></p></td></tr>'); //--> </script></span> <tr valign="top"> <td width="8"><span style="color: #808000"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" /></span></td> <td width="16"><span style="color: #808000"><img height="16" alt="此作为电子邮件发? src="http://www.ibm.com/i/v14/icons/em.gif" width="16" vspace="3" /></span></td> <td width="122"> <p><a class="smallplainlink" href="javascript:document.email.submit();" cmimpressionsent="1"><strong><span style="color: #808000">此作为电子邮件发?/span></strong></a></p> </td> </tr> <noscript></noscript> </form> </tbody> </table> </td> </tr> </tbody> </table> <!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><!--end RESERVED FOR FUTURE USE INCLUDE FILES--><br /> </td> </tr> </tbody> </table> <p><span style="color: #808000">U别Q?初</span></p> <p><a cmimpressionsent="1"><span style="color: #808000">刘冬</span></a><span style="color: #808000"> (</span><a href="mailto:winter.lau@163.com?subject=使用 JFreeChart来创建基于web的图表&amp;amp;cc=winter.lau@163.com" cmimpressionsent="1"><span style="color: #808000">winter.lau@163.com</span></a><span style="color: #808000">), 软g工程? 珠v市创我科技发展有限公司<br /> </span></p> <p><span style="color: #808000">2003 q?9 ?08 ?/span></p> <blockquote><span style="color: #808000">WWW的发展得基于因特网的应用程序不再局限于静态或者简单的动态内Ҏ供。传l的一些以软g包Ş式发布应用程序例如报表系l等都在逐渐搬到因特|上。但是这两者之间有着天壤之别Q虽然对于数据获取、业务处理等斚w基本cMQ但是最大的差别在于用户界面。ؓ了能在web览器上昄要求用户界面使用HTML以及囄的方式来展现数据Q而传l的一些利用操作系l本w的控g来开发的用户界面无法适应琳琅满目的客LQ因此在q里也变得无能ؓ力。回到本文的题目上来Qؓ了创Z个可以在web览器上查看到图表一般有两种做法Q第一U就是用applet利用java本n对图形的支持来显CZ个图表;W二U就是直接在web服务器端生成好图表图片文件后发送给览器。第一U方式显然对于客L要求太高Q随着现在L览器放弃对JAVA的支持后Q这U方式只适合一些局域网的应用,而对于因特网的环境就昑־不太适合。因此我们下面将介绍一个JAVA的图表引擎JFreeChart用来产生ZWEB的图表?/span></blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES--> <p><a name="1"><span id="iymiwaa" class="atitle"><span style="color: #808000">JFreeChart目?/span></span></a></p> <p><span style="color: #808000">JFreeChart是开放源代码站点SourceForge.net上的一个JAVA目Q它主要用来各种各样的图表,q些图表包括Q饼图、柱状图(普通柱状图以及堆栈q?、线图、区域图、分布图、؜合图、甘特图以及一些A表盘{等。这些不同式L图表基本上可以满目前的要求。ؓ了减篇q本文主要介l前面三U类型的图表Q读者可以触cL通去开发其他样式的图表。下面几个是JFreeChart产生的这三种cd图表的结果: </span></p> <br /> <a name="N10049"><strong><span style="color: #808000">?</span></strong></a><br /> <span style="color: #808000"><img alt="" src="http://www.ibm.com/developerworks/cn/java/l-jfreechart/images/image001.gif" /> <br /> <br /> </span><a name="N10056"><strong><span style="color: #808000">?</span></strong></a><br /> <span style="color: #808000"><img alt="" src="http://www.ibm.com/developerworks/cn/java/l-jfreechart/images/image002.gif" /> <br /> <br /> </span><a name="N10063"><strong><span style="color: #808000">?</span></strong></a><br /> <span style="color: #808000"><img alt="" src="http://www.ibm.com/developerworks/cn/java/l-jfreechart/images/image003.gif" /> <br /> </span> <p><span style="color: #808000">上面的三个图都是表示四个季度的某个品的销量信息。在l箋下面节之前必须先准备好开发环境,因ؓ是基于WEB览器的图表展现Q因此需要一个Servlet引擎或者是J2EE应用服务器(例如WebSphereQTomcat{)。WEB环境的搭建就不篏赘了Q读者根据喜好自行安装。JFreeChart引擎本n需要到SourceForge.net上下载,地址如下Q?</span></p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"><span style="color: #808000">JFreeChart主页Q? </span><a cmimpressionsent="1"><span style="color: #808000">http://www.jfree.org/jfreechart/index.html</span></a> <span style="color: #808000">JFreeChart下蝲面Q? </span><a cmimpressionsent="1"><span style="color: #808000">http://sourceforge.net/projects/jfreechart/</span></a> <span style="color: #808000"> </span></pre> </td> </tr> </tbody> </table> <br /> <p><span style="color: #808000">下蝲的时候需要注意的是必M载两个文ӞJFreeChart以及Jcommon。目前最新配套版本是QJFreeChart 0.9.11 Jcommon 0.8.6 </span></p> <p><span style="color: #808000">q里有点W者在开发中遇见的问题需要注意的是:在用Eclipse开发的时候会报一个莫名其妙的错误Q错误可能指向某个类文g的第一行。遇到这L问题一般是因ؓ没有把Jcommon的jar包设|到目的类路径中的~故。具体的原因不祥?</span></p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><span style="color: #808000"><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></span></td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td><span style="color: #808000"><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /> </span> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="middle"><span style="color: #808000"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /> </span></td> <td valign="top" align="right"><a class="fbox" cmimpressionsent="1"><strong><span style="color: #808000">回页?/span></strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="2"><span id="kyggcku" class="atitle"><span style="color: #808000">解读JFreeChart的源码结?/span></span></a></p> <p><span style="color: #808000">在开始用JFreeChart之前我们有必要先大概了解一下JFreeChart本n的结构以及它所带一些例子程序,q样有助于我们下一步自行开发。下载JFreeChart包后已经带有非常丰富的例子,因ؓJFreeChartq个目本n的用文档非常少Q因此学习它最好的办法是学习它所带的例子源码。在包org.jfree.chart.demo中有几十个文件用于展CJFreeChart所能支持的所有图表的l果。如果你的JDK是比较新的情况下可能在运行这些例子时会有问题Q现象如下: </span></p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"><span style="color: #808000">java.lang.UnsatisfiedLinkError: initDDraw at sun.awt.windows.Win32OffScreenSurfaceData.initDDraw(Native Method) at sun.awt.windows.Win32OffScreenSurfaceData.<clinit>(Win32OffScreenSurfaceData.java:141) <!-- code sample is too wide --> at sun.awt.Win32GraphicsDevice.<clinit>(Win32GraphicsDevice.java:58) at sun.awt.Win32GraphicsEnvironment.makeScreenDevice(Win32GraphicsEnvironment.java:168) <!-- code sample is too wide --> at sun.java2d.SunGraphicsEnvironment.getScreenDevices(SunGraphicsEnvironment.java:240) <!-- code sample is too wide --> at sun.awt.Win32GraphicsEnvironment.getDefaultScreenDevice(Win32GraphicsEnvironment.java:61) <!-- code sample is too wide --> at java.awt.Window.init(Window.java:224) at java.awt.Window.<init>(Window.java:268) at java.awt.Frame.<init>(Frame.java:398) at javax.swing.JFrame.<init>(JFrame.java:198) at org.jfree.chart.demo.JFreeChartDemo.<init>(JFreeChartDemo.java:148) at org.jfree.chart.demo.JFreeChartDemo.main(JFreeChartDemo.java:285) Exception in thread "main" </span></pre> </td> </tr> </tbody> </table> <br /> <p><span style="color: #808000">q个错误是由于新版的Swing大量的用了微Y的DirectDraw的技术来提高d的性能Q而可能你的显卡在q时候会跟你闹点情A或者显卡本wƈ不支持这L一个技术。难道就没有办法了嘛Q要解决q个问题也非常简单,我们可以屏蔽掉DirectDrawQ不让Swing使用该技术就可以了。在q行q些代码时给虚拟机指定参?Dsun.java2d.noddraw卛_?</span></p> <p><span style="color: #808000">q时可能你又该纳闷了Q不说是ZWeb的图表嘛Q怎么又扯到Swing上了Q这是因Zؓ了开发者容易上手,无需配置Mq行环境Q所以这些例子都是基于GUI方式的用于展现给开发者如果生成一个图表,我们要学习的也就是如何利用这个引擎生成图表而不是怎么来显CZ个图表。当我们把生成的图表对象ExportC个图像文件即可在Web上发布?</span></p> <p><span style="color: #808000">下面我们来介lJFreeChart中几个核心的对象c:</span></p> <table cellspacing="0" cellpadding="5" width="100%" border="1"> <tbody> <tr bgcolor="#99ccff"> <td width="30%"><span style="color: #808000">cd</span></td> <td width="70%"><span style="color: #808000">cȝ作用以及单描q?/span></td> </tr> <tr> <td><span style="color: #808000">JFreeChart</span></td> <td><span style="color: #808000">图表对象QQ何类型的图表的最l表现Ş式都是在该对象进行一些属性的定制。JFreeChart引擎本n提供了一个工厂类用于创徏不同cd的图表对?/span></td> </tr> <tr> <td><span style="color: #808000">XXXXXDataset</span></td> <td><span style="color: #808000">数据集对象,用于提供昄图表所用的数据。根据不同类型的图表对应着很多cd的数据集对象c?/span></td> </tr> <tr> <td><span style="color: #808000">XXXXXPlot</span></td> <td><span style="color: #808000">图表区域对象Q基本上q个对象军_着什么样式的图表Q创对象的时候需要Axis、Renderer以及数据集对象的支持</span></td> </tr> <tr> <td><span style="color: #808000">XXXXXAxis</span></td> <td><span style="color: #808000">用于处理图表的两个uQ纵轴和横u</span></td> </tr> <tr> <td><span style="color: #808000">XXXXXRenderer</span></td> <td><span style="color: #808000">负责如何昄一个图表对?/span></td> </tr> <tr> <td><span style="color: #808000">XXXXXURLGenerator</span></td> <td><span style="color: #808000">用于生成Web图表中每个项目的鼠标点击链接</span></td> </tr> <tr> <td><span style="color: #808000">XXXXXToolTipGenerator</span></td> <td><span style="color: #808000">用于生成图象的帮助提C,不同cd图表对应不同cd的工hC类</span></td> </tr> </tbody> </table> <p><span style="color: #808000">基本上我认ؓJFreeChart目本n的类l构的设计ƈ不是很好Q首先在创徏图表的时候用C大量的工厂方法,q样做虽然可以简化创建图表对象的代码Q但是对目本n或者开发h员来讲自行扩展一U新的图表都仍然是一件很ȝ的事情;其次除图表对象本w外其余的类q于复杂Q用者必d了解每个cd的图表对象应该对应哪些Axis、Plot、Rendererc,q且必须非常熟悉q些cȝ构造函C每个参数的具体含义。这些问题都大大困扰很多初学者。不q,虽然存在很多问题Q但是JFreeChart本n仍不׃ؓ一个非怼U的图表引擎,况且目本n也在逐渐的发展中?</span></p> <p><span style="color: #808000">在非常简略的介绍了JFreeChart本n的代码结构后Q下面我们开始动手试验几个常用的图表q把他们攑ֈweb上?</span></p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><span style="color: #808000"><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></span></td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td><span style="color: #808000"><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /> </span> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="middle"><span style="color: #808000"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /> </span></td> <td valign="top" align="right"><a class="fbox" cmimpressionsent="1"><strong><span style="color: #808000">回页?/span></strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="3"><span id="smokyum" class="atitle"><span style="color: #808000">使用JFreeChart生成各种样式的图?/span></span></a></p> <p><span style="color: #808000">限于幅的问题我们在q里只实CU常用的图表Q其他类型图表读者可以触cL通。我们先l出q囄实现Q饼囄实现再来跟柱状图q行比较?</span></p> <p><a name="N100FA"><span id="kmaoiym" class="smalltitle"><span style="color: #808000">1 q?/span></span></a></p> <p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"><span style="color: #808000">package lius.chart.demo; import java.io.*; import org.jfree.data.*; import org.jfree.chart.*; import org.jfree.chart.plot.*; /** * 该类用于演示最单的q囄? * @author Winter Lau */ public class BarChartDemo { public static void main(String[] args) throws IOException{ CategoryDataset dataset = getDataSet2(); JFreeChart chart = ChartFactory.createBarChart3D( "水果产量?, // 图表标题 "水果", // 目录轴的昄标签 "产量", // 数Du的显C标{? dataset, // 数据? PlotOrientation.VERTICAL, // 图表方向Q水q뀁垂? <!-- code sample is too wide --> true, // 是否昄图例(对于单的q囑ֿLfalse) <!-- code sample is too wide --> false, // 是否生成工具 false // 是否生成URL链接 ); FileOutputStream fos_jpg = null; try { fos_jpg = new FileOutputStream("D:\\fruit.jpg"); ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,null); } finally { try { fos_jpg.close(); } catch (Exception e) {} } } /** * 获取一个演C用的简单数据集对象 * @return */ private static CategoryDataset getDataSet() { DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(100, null, "Ҏ"); dataset.addValue(200, null, "梨子"); dataset.addValue(300, null, "葡萄"); dataset.addValue(400, null, "香蕉"); dataset.addValue(500, null, "荔枝"); return dataset; } /** * 获取一个演C用的组合数据集对象 * @return */ private static CategoryDataset getDataSet2() { DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(100, "北京", "Ҏ"); dataset.addValue(100, "上v", "Ҏ"); dataset.addValue(100, "q州", "Ҏ"); dataset.addValue(200, "北京", "梨子"); dataset.addValue(200, "上v", "梨子"); dataset.addValue(200, "q州", "梨子"); dataset.addValue(300, "北京", "葡萄"); dataset.addValue(300, "上v", "葡萄"); dataset.addValue(300, "q州", "葡萄"); dataset.addValue(400, "北京", "香蕉"); dataset.addValue(400, "上v", "香蕉"); dataset.addValue(400, "q州", "香蕉"); dataset.addValue(500, "北京", "荔枝"); dataset.addValue(500, "上v", "荔枝"); dataset.addValue(500, "q州", "荔枝"); return dataset; } } </span></pre> </td> </tr> </tbody> </table> <br /> <p><span style="color: #808000">E序q行l束后生成的囄文g效果如下图所C:</span></p> <br /> <a name="N1010B"><strong><span style="color: #808000">?</span></strong></a><br /> <span style="color: #808000"><img alt="" src="http://www.ibm.com/developerworks/cn/java/l-jfreechart/images/image004.gif" /> <br /> </span> <p><span style="color: #808000">如果是用简单的数据即用getDataSetҎ获取数据集时产生的图片文件如下:</span></p> <br /> <a name="N1011B"><strong><span style="color: #808000">?</span></strong></a><br /> <span style="color: #808000"><img alt="" src="http://www.ibm.com/developerworks/cn/java/l-jfreechart/images/image005.gif" /> <br /> </span> <p><a name="N10126"><span id="eoioage" class="smalltitle"><span style="color: #808000">2 饼图</span></span></a></p> <p> <p><span style="color: #808000">对于饼图而言Q数据集的获取用的不是同一个数据集c,另外饼图不支持同一个类别的目中还有子目q样的数据。我们只l出创徏饼图的代码,至于写图表到一个文件则与柱状图一_无需重复?</span></p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"><span style="color: #808000">package lius.chart.demo; import java.io.*; import org.jfree.data.*; import org.jfree.chart.*; /** * 用于演示饼图的生? * @author Winter Lau */ public class PieChartDemo { public static void main(String[] args) throws IOException{ DefaultPieDataset data = getDataSet(); JFreeChart chart = ChartFactory.createPie3DChart("水果产量?, // 图表标题 data, true, // 是否昄图例 false, false ); //写图表对象到文gQ参照柱状图生成源码 } /** * 获取一个演C用的简单数据集对象 * @return */ private static DefaultPieDataset getDataSet() { DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("Ҏ",100); dataset.setValue("梨子",200); dataset.setValue("葡萄",300); dataset.setValue("香蕉",400); dataset.setValue("荔枝",500); return dataset; } } </span></pre> </td> </tr> </tbody> </table> <br /> <p><span style="color: #808000">生成的饼图文件效果如下: </span></p> <br /> <a name="N1013A"><strong><span style="color: #808000">?</span></strong></a><br /> <span style="color: #808000"><img alt="" src="http://www.ibm.com/developerworks/cn/java/l-jfreechart/images/image006.gif" /> <br /> <br /> </span> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><span style="color: #808000"><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></span></td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td><span style="color: #808000"><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /> </span> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="middle"><span style="color: #808000"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /> </span></td> <td valign="top" align="right"><a class="fbox" cmimpressionsent="1"><strong><span style="color: #808000">回页?/span></strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="4"><span id="kcgakqy" class="atitle"><span style="color: #808000">生成的图表Ud览器上</span></span></a></p> <p><span style="color: #808000">Z生成的图表直接传给客户端浏览器Q只需要将前面两个例子中的文g换成是通过HttpServletResponse对象获取到的输出,详细代码清单如下Q?</span></p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"><span style="color: #808000">package lius.chart.demo; import java.io.IOException; import javax.servlet.*; import javax.servlet.http.HttpServlet; import org.jfree.data.*; import org.jfree.chart.*; /** * 演示通过servlet直接输出图表 * @author Winter Lau */ public class ChartDemoServlet extends HttpServlet { public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { res.setContentType("image/jpeg"); DefaultPieDataset data = getDataSet(); JFreeChart chart = ChartFactory.createPie3DChart("水果产量?, data, true, false, false ); ChartUtilities.writeChartAsJPEG(res.getOutputStream(), 100,chart,400,300,null); } /** * 获取一个演C用的简单数据集对象 * @return */ private static DefaultPieDataset getDataSet() { DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("Ҏ",100); dataset.setValue("梨子",200); dataset.setValue("葡萄",300); dataset.setValue("香蕉",400); dataset.setValue("荔枝",500); return dataset; } } </span></pre> </td> </tr> </tbody> </table> <br /> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td><span style="color: #808000"><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></span></td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td><span style="color: #808000"><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br /> </span> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="middle"><span style="color: #808000"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /> </span></td> <td valign="top" align="right"><a class="fbox" cmimpressionsent="1"><strong><span style="color: #808000">回页?/span></strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p><a name="5"><span id="cmsgqom" class="atitle"><span style="color: #808000">高主题</span></span></a></p> <p><span style="color: #808000">很多情况我们不仅仅要求可以在览器上昄一个图表,我们更需要客户可以直接在图表上做一下交互的操作Q例如获取信息提C,点击图表某个部分q行更详l信息的展示{等。例如前面生成的单柱状图Q用户需要在看到q囑֐点击某种水果例如是苹果即可看到各个地果量的情况。ؓ此就要求该图形具有交互操作的功能。在HTML中ؓ了让一个图像具有可交互的功能就必须l该囑փ定义一个Map对象。下表节选一D具有该功能的HTML代码 </span></p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"><span style="color: #808000"><MAP NAME="chartMap"> <AREA SHAPE="RECT" COORDS="81,15,126,254" href="?series=0&category=100" title="100 = 7,048" <!-- code sample is too wide --> onclick="javascript:clickChart('100');return false;"> <AREA SHAPE="RECT" COORDS="143,27,188,255" href="?series=0&category=200" title="200 = 6,721" <!-- code sample is too wide --> onclick="javascript: clickChart ('200');return false;"> <AREA SHAPE="RECT" COORDS="205,54,250,255" href="?series=0&category=300" title="300 = 5,929" <!-- code sample is too wide --> onclick="javascript: clickChart ('300');return false;"> <AREA SHAPE="RECT" COORDS="267,85,312,255" href="?series=0&category=400" title="400 = 5,005" <!-- code sample is too wide --> onclick="javascript: clickChart ('400');return false;"> <AREA SHAPE="RECT" COORDS="329,17,374,255" href="?series=0&category=Diet" title="Diet = 7,017" onclick="javascript: <!-- code sample is too wide --> clickChart ('Diet');return false;"> </MAP> </span></pre> </td> </tr> </tbody> </table> <br /> <p><span style="color: #808000">由此׃生了一个问题:如果Ҏ一个图像来生成对应的MAP对象。我们回头看看刚才的代码Q在创徏一个图表对象时候有两个参数Q我们Dq囄例子来讲q两个参数就是ChartFactory. createBarChart3DҎ中的最后两个参敎ͼq两个参数的cd都是布尔倹{这两个参数意思分别是Q是否创建工hC?tooltip)以及是否生成URL。这两个参数分别对应着MAP中一个AREA的title属性以及href属性?</span></p> <p><span style="color: #808000">可是我想知道的是怎么来生这个MAP啊!哈哈Q不要着急,JFreeChart已经帮我们做好生成MAP对象的功能。ؓ了生成MAP对象p引入另外一个对象:ChartRenderingInfo。因为JFreeChart没有直接的方法利用一个图表对象直接生成MAP数据Q它需要一个中间对象来q渡Q这个对象就是ChartRenderingInfo。下图是生成MAP数据的流E图Q?</span></p> <br /> <a name="N10167"><strong><span style="color: #808000">?</span></strong></a><br /> <span style="color: #808000"><img alt="" src="http://www.ibm.com/developerworks/cn/java/l-jfreechart/images/image007.gif" /> <br /> </span> <p><span style="color: #808000">如上图所C,ChartUtilitiescL整个程的核心,它周围的对象都是一些例如数据对象或者是文g{。这个流E简单描q如下:首先创徏一个ChartRenderingInfo对象q在调用ChartUtilities的writeChartAsJPEG时作为最后一个参C递进厅R调用该Ҏl束后将产生一个图像文件以及一个填充好MAP数据的ChartRenderingInfo对象Q有了这个对象我们还是没有办法获取具体的MAP数据Q我们还必须借助于ChartUtilities的writeImageMapҎ来将ChartRenderingInfo对象d出来Q获取MAP数据的代码片断如下: </span></p> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td class="code-outline"> <pre class="displaycode"><span style="color: #808000"> PrintWriter w = null; FileOutputStream fos_jpg = null; FileOutputStream fos_cri = null; try{ //Ҏ不同cd的图表用不同类Q以下是针对饼图的操? PiePlot plot = (PiePlot) chart.getPlot(); plot.setURLGenerator(new StandardPieURLGenerator(url)); //讄工具提示 plot.setToolTipGenerator(new StandardPieToolTipGenerator()); fos_jpg = new FileOutputStream(“d:\\fruit.jpg”); ChartUtilities.writeChartAsJPEG( fos_jpg, 100, chart, 400, 300, info); fos_cri = new FileOutputStream(__d:\\fruit.map__); w = new PrintWriter(fos_cri); ChartUtilities.writeImageMap(w, __mapname__, info); w.flush(); }finally{ try{ w.close(); }catch(Exception e){} try{ fos_cri.close(); }catch(Exception e){} try{ fos_jpg.close(); }catch(Exception e){} } </span></pre> </td> </tr> </tbody> </table> <br /> <p><span style="color: #808000">打开文gD:\fruit.mapQ文件的内容是要写到页面上的MAP数据。把生成的图像文件以及MAP数据文g写到面上即可完成热点图表的功能。至于怎么l合两者之间的关系例如囑փ的useMap属性值必MMAP对象的名U结合v来,必须Ҏ实际的应用情况进行相应的处理。笔者徏议把二者通过标签库封装v来,囑փ文g的名UC及MAP对象的名U由标签库统一q行控制Q这样可以保证二者的一致性?</span></p> <br /> <br /> <p><a name="resources"><span id="woicesw" class="atitle"><span style="color: #808000">参考资?</span></span></a></p> <ul> <li><a cmimpressionsent="1"><span style="color: #808000">JFreeChart图表引擎首页</span></a><span style="color: #808000"> <br /> <br /> </span> <li><a cmimpressionsent="1"><span style="color: #808000">Cewolf自定义图表标{ֺ</span></a><span style="color: #808000"> <br /> </span></li> </ul> <br /> <br /> </td> </tr> </tbody> </table> <img src ="http://www.tkk7.com/jasonwbd/aggbug/230261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jasonwbd/" target="_blank">D于渊</a> 2008-09-21 15:00 <a href="http://www.tkk7.com/jasonwbd/articles/230261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[摘要] JAVA反射机制是在q行状态中Q对于Q意一个类Q都能够知道q个cȝ所有属性和ҎQ对于Q意一个对象,都能够调用它的Q意一个方?..http://www.tkk7.com/jasonwbd/articles/230086.htmlD于渊D于渊Sat, 20 Sep 2008 01:13:00 GMThttp://www.tkk7.com/jasonwbd/articles/230086.htmlhttp://www.tkk7.com/jasonwbd/comments/230086.htmlhttp://www.tkk7.com/jasonwbd/articles/230086.html#Feedback0http://www.tkk7.com/jasonwbd/comments/commentRss/230086.htmlhttp://www.tkk7.com/jasonwbd/services/trackbacks/230086.html[摘要] Enum作ؓSun全新引进的一个关键字Q看h很象是特D的class, 它也可以有自q变量Q可以定义自qҎQ可以实C个或者多个接口?
[关键字]
JAVA JDK 枚D
  Enum作ؓSun全新引进的一个关键字Q看h很象是特D的class, 它也可以有自q变量Q可以定义自qҎQ可以实C个或者多个接口?当我们在声明一个enumcdӞ我们应该注意到enumcd有如下的一些特征?

  1Q它不能有public的构造函敎ͼq样做可以保证客户代码没有办法新Z个enum的实例?

  2Q所有枚丑ր都是public , static , final的。注意这一点只是针对于枚D|我们可以和在普通类里面定义 变量一样定义其它Q何类型的非枚丑֏量,q些变量可以用Q何你想用的修饰符?

  3QEnum默认实现了java.lang.Comparable接口?

  4QEnum覆蝲了了toStringҎQ因此我们如果调用Color.Blue.toString()默认q回字符?#8221;Blue”.

  5QEnum提供了一个valueOfҎQ这个方法和toStringҎ是相对应的。调用valueOf(“Blue”)返回Color.Blue.因此我们在自己重写toStringҎ的时候就要注意到q一点,一把来说应该相对应地重写valueOfҎ?

  6QEnumq提供了valuesҎQ这个方法你能够方便的遍历所有的枚D倹{?

  7QEnumq有一个oridinal的方法,q个Ҏq回枚D值在枚Dcȝ的顺序,q个序Ҏ枚D值声明的序而定Q这里Color.Red.ordinal()q回0?

  了解了这些基本特性,我们来看看如何用它们?

  1Q遍历所有有枚D? 知道了有valuesҎQ我们可以轻车熟路地用ForEach循环来遍历了枚Dg?

  for (Color c: Color.values())

  System.out.println(“find value:” + c);

  2Q在enum中定义方法和变量Q比如我们可以ؓColor增加一个方法随回一个颜艌Ӏ?

  public enum Color {

  Red,

  Green,

  Blue;

  /*

  *定义一个变量表C枚丑ր的数目?

  *(我有点奇怪ؓ什么sun没有lenum直接提供一个sizeҎ).

  */

  private static int number = Color.values().length ;

  /**

  * 随机q回一个枚丑ր?

  @return a random enum value.

  */

  public static Color getRandomColor(){

  long random = System.currentTimeMillis() % number;

  switch ((int) random){

  case 0:

  return Color.Red;

  case 1:

  return Color.Green;

  case 2:

  return Color.Blue;

  default : return Color.Red;

  }

  }

  }

  可以看出q在枚Dcd里定义变量和Ҏ和在普通类里面定义Ҏ和变量没有什么区别。唯一要注意的只是变量和方法定义必L在所有枚丑ր定义的后面Q否则编译器会给Z个错误?

  3Q覆?Override)toString, valueOfҎ

  前面我们已经知道enum提供了toString,valueOf{方法,很多时候我们都需要覆载默认的toStringҎQ那么对于enum我们怎么做呢。其实这和覆载一个普通class的toStringҎ没有什么区别?

  ….

  public String toString(){

  switch (this){

  case Red:

  return "Color.Red";

  case Green:

  return "Color.Green";

  case Blue:

  return "Color.Blue";

  default:

  return "Unknow Color";

  }

  }

  ….

  q时我们可以看到Q此时再用前面的遍历代码打印出来的是

  Color.Red

  Color.Green

  Color.Blue

  而不?

  Red

  Green

  Blue.

  可以看到toString实是被覆蝲了。一般来说在覆蝲toString的时候我们同时也应该覆蝲valueOfҎQ以保持它们怺的一致性?

  4Q用构造函?

  虽然enum不可以有public的构造函敎ͼ但是我们q是可以定义private的构造函敎ͼ在enum内部使用。还是用Colorq个例子?

  public enum Color {

  Red("This is Red"),

  Green("This is Green"),

  Blue("This is Blue");

  private String desc;

  Color(String desc){

  this.desc = desc;

  }

  public String getDesc(){

  return this.desc;

  }

  }

  q里我们为每一个颜色提供了一个说明信? 然后定义了一个构造函数接受这个说明信息?

  要注意这里构造函C能ؓpublic或者protected, 从而保证构造函数只能在内部使用Q客户代码不能new一个枚丑ր的实例出来。这也是完全W合情理的,因ؓ我们知道枚D值是public static final的常量而已?

  5Q实现特定的接口

  我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一Pq里׃作示例了?

  6Q定义枚丑րDqҎ?

  前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚丑ր定义方法。这P我们前面覆蝲 toString的例子可以被改写成这栗?

  public enum Color {

  Red {

  public String toString(){

  return "Color.Red";

  }

  },

  Green {

  public String toString(){

  return "Color.Green";

  }

  },

  Blue{

  public String toString(){

  return "Color.Blue";

  }

  };

  }

  从逻辑上来说这h原先提供一?#8220;全局“的toStringҎ要清C些?

  ȝ来说Qenum作ؓ一个全新定义的cdQ是希望能够帮助E序员写出的代码更加单易懂,个h觉得一般也不需要过多的使用enum的一些高U特性,否则和单易懂的初衷惌背了?/span>


D于渊 2008-09-20 09:13 发表评论
]]>
[摘要] 在开发中Q经帔R到诸如省、市Q大cR小cȝU联select 下拉框。常常,q些cd或地区的内容Q又存在数据库中。这里徏议,通过IOQ将cd生成js文gQ然后在面中引入这个js文gQ这样即提高的程序的q用速度Q又_了的代码书写量?/title><link>http://www.tkk7.com/jasonwbd/articles/230085.html</link><dc:creator>D于渊</dc:creator><author>D于渊</author><pubDate>Sat, 20 Sep 2008 01:12:00 GMT</pubDate><guid>http://www.tkk7.com/jasonwbd/articles/230085.html</guid><wfw:comment>http://www.tkk7.com/jasonwbd/comments/230085.html</wfw:comment><comments>http://www.tkk7.com/jasonwbd/articles/230085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jasonwbd/comments/commentRss/230085.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jasonwbd/services/trackbacks/230085.html</trackback:ping><description><![CDATA[<div id="yqicouk" class="ciodigest"><span style="color: #808000"><strong>[摘要] </strong>JAVA反射机制是在q行状态中Q对于Q意一个类Q都能够知道q个cȝ所有属性和ҎQ对于Q意一个对象,都能够调用它的Q意一个方?..<br /> <strong></strong>[关键字] </span><a class="cyewunder" target="_blank"><span style="color: #808000">JAVA</span></a><span style="color: #808000"> </span><a class="cyewunder" target="_blank"><span style="color: #808000">反射机制</span></a><span style="color: #808000"> </span></div> <div id="woacoeq" class="contenttxt"><span style="color: #808000">  JAVA反射机制 <br /> <br />   JAVA反射机制是在q行状态中Q对于Q意一个类Q都能够知道q个cȝ所有属性和ҎQ对于Q意一个对象,都能够调用它的Q意一个方法;q种动态获取的信息以及动态调用对象的Ҏ的功能称为java语言的反机制?<br /> <br />   Java反射机制主要提供了以下功能: 在运行时判断L一个对象所属的c;在运行时构造Q意一个类的对象;在运行时判断L一个类所h的成员变量和ҎQ在q行时调用Q意一个对象的ҎQ生成动态代理?<br /> <br />   1. 得到某个对象的属?<br /> <br />   1 public Object getProperty(Object owner, String fieldName) throws Exception { <br /> <br />   2 Class ownerClass = owner.getClass(); <br /> <br />   3 <br /> <br />   4 Field field = ownerClass.getField(fieldName); <br /> <br />   5 <br /> <br />   6 Object property = field.get(owner); <br /> <br />   7 <br /> <br />   8 return property; <br /> <br />   9 } <br /> <br />   Class ownerClass = owner.getClass()Q得到该对象的Class?<br /> <br />   Field field = ownerClass.getField(fieldName)Q通过Class得到cd明的属性?<br /> <br />   Object property = field.get(owner)Q通过对象得到该属性的实例Q如果这个属性是非公有的Q这里会报IllegalAccessException?<br /> <br />   2. 得到某个cȝ静态属?<br /> <br />   1 public Object getStaticProperty(String className, String fieldName) <br /> <br />   2 throws Exception { <br /> <br />   3 Class ownerClass = Class.forName(className); <br /> <br />   4 <br /> <br />   5 Field field = ownerClass.getField(fieldName); <br /> <br />   6 <br /> <br />   7 Object property = field.get(ownerClass); <br /> <br />   8 <br /> <br />   9 return property; <br /> <br />   10 } <br /> <br />   Class ownerClass = Class.forName(className) Q首先得到这个类的Class?<br /> <br />   Field field = ownerClass.getField(fieldName)Q和上面一P通过Class得到cd明的属性?<br /> <br />   Object property = field.get(ownerClass) Q这里和上面有些不同Q因属性是静态的Q所以直接从cȝClass里取?<br /> <br />   3. 执行某对象的Ҏ <br /> <br />   1 public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception { <br /> <br />   2 <br /> <br />   3 Class ownerClass = owner.getClass(); <br /> <br />   4 <br /> <br />   5 Class[] argsClass = new Class[args.length]; <br /> <br />   6 <br /> <br />   7 for (int i = 0, j = args.length; i < j; i++) { <br /> <br />   8 argsClass[i] = args[i].getClass(); <br /> <br />   9 } <br /> <br />   10 <br /> <br />   11 Method method = ownerClass.getMethod(methodName, argsClass); <br /> <br />   12 <br /> <br />   13 return method.invoke(owner, args); <br /> <br />   14 } <br /> <br />   Class owner_class = owner.getClass() Q首先还是必d到这个对象的Class?<br /> <br />   5?行:配置参数的Class数组Q作为寻找Method的条件?<br /> <br />   Method method = ownerClass.getMethod(methodName, argsClass)Q通过Method名和参数的Class数组得到要执行的Method?<br /> <br />   method.invoke(owner, args)Q执行该MethodQinvokeҎ的参数是执行q个Ҏ的对象,和参数数l。返回值是ObjectQ也既是该方法的q回倹{?<br /> <br />   4. 执行某个cȝ静态方?<br /> <br />   1 public Object invokeStaticMethod(String className, String methodName, <br /> <br />   2 Object[] args) throws Exception { <br /> <br />   3 Class ownerClass = Class.forName(className); <br /> <br />   4 <br /> <br />   5 Class[] argsClass = new Class[args.length]; <br /> <br />   6 <br /> <br />   7 for (int i = 0, j = args.length; i < j; i++) { <br /> <br />   8 argsClass[i] = args[i].getClass(); <br /> <br />   9 } <br /> <br />   10 <br /> <br />   11 Method method = ownerClass.getMethod(methodName, argsClass); <br /> <br />   12 <br /> <br />   13 return method.invoke(null, args); <br /> <br />   14 } <br /> <br />   基本的原理和实例3相同Q不同点是最后一行,invoke的一个参数是nullQ因是静态方法,不需要借助实例q行?<br /> <br />   5. 新徏实例 <br /> <br />   1 <br /> <br />   2 public Object newInstance(String className, Object[] args) throws Exception { <br /> <br />   3 Class newoneClass = Class.forName(className); <br /> <br />   4 <br /> <br />   5 Class[] argsClass = new Class[args.length]; <br /> <br />   6 <br /> <br />   7 for (int i = 0, j = args.length; i < j; i++) { <br /> <br />   8 argsClass[i] = args[i].getClass(); <br /> <br />   9 } <br /> <br />   10 <br /> <br />   11 Constructor cons = newoneClass.getConstructor(argsClass); <br /> <br />   12 <br /> <br />   13 return cons.newInstance(args); <br /> <br />   14 <br /> <br />   15 } <br /> <br />   q里说的Ҏ是执行带参数的构造函数来新徏实例的方法。如果不需要参敎ͼ可以直接使用newoneClass.newInstance()来实现?<br /> <br />   Class newoneClass = Class.forName(className)Q第一步,得到要构造的实例的Class?<br /> <br />   W?~第9行:得到参数的Class数组?<br /> <br />   Constructor cons = newoneClass.getConstructor(argsClass)Q得到构造子?<br /> <br />   cons.newInstance(args)Q新建实例?<br /> <br />   6. 判断是否为某个类的实?<br /> <br />   1 public boolean isInstance(Object obj, Class cls) { <br /> <br />   2 return cls.isInstance(obj); <br /> <br />   3 } <br /> <br />   7. 得到数组中的某个元素 <br /> <br />   1 public Object getByArray(Object array, int index) { <br /> <br />   2 return Array.get(array,index); <br /> <br />   3 }</span><a ><span style="color: #808000"><img height="11" src="http://images.enet.com.cn/end.gif" width="11" align="absMiddle" border="0" target="_blank" alt="" /></span></a><br /> </div> <img src ="http://www.tkk7.com/jasonwbd/aggbug/230085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jasonwbd/" target="_blank">D于渊</a> 2008-09-20 09:12 <a href="http://www.tkk7.com/jasonwbd/articles/230085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java版通用JSU联http://www.tkk7.com/jasonwbd/articles/230084.htmlD于渊D于渊Sat, 20 Sep 2008 01:11:00 GMThttp://www.tkk7.com/jasonwbd/articles/230084.htmlhttp://www.tkk7.com/jasonwbd/comments/230084.htmlhttp://www.tkk7.com/jasonwbd/articles/230084.html#Feedback0http://www.tkk7.com/jasonwbd/comments/commentRss/230084.htmlhttp://www.tkk7.com/jasonwbd/services/trackbacks/230084.html
[摘要] 在开发中Q经帔R到诸如省、市Q大cR小cȝU联select 下拉框。常常,q些cd或地区的内容Q又存在数据库中。这里徏议,通过IOQ将cd生成js文gQ然后在面中引入这个js文gQ这样即提高的程序的q用速度Q又_了的代码书写量?br /> [关键字] Java JS
  在开发中Q经帔R到诸如省、市Q大cR小cȝU联select 下拉框。常常,q些cd或地区的内容Q又存在数据库中。因为用户希望,一切都是可控制的。那么,如果涉及到这U联的地方Q每ơ都Z库中dQ在JSP中要写很多代码去读表。另外,q种U联在修Ҏ据的时候,应设|的选中ؓ库中所载,q也是需要写一些代码的?



D于渊 2008-09-20 09:11 发表评论
]]>
Java操作MySQL的中文处理方?/title><link>http://www.tkk7.com/jasonwbd/articles/230083.html</link><dc:creator>D于渊</dc:creator><author>D于渊</author><pubDate>Sat, 20 Sep 2008 01:10:00 GMT</pubDate><guid>http://www.tkk7.com/jasonwbd/articles/230083.html</guid><wfw:comment>http://www.tkk7.com/jasonwbd/comments/230083.html</wfw:comment><comments>http://www.tkk7.com/jasonwbd/articles/230083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jasonwbd/comments/commentRss/230083.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jasonwbd/services/trackbacks/230083.html</trackback:ping><description><![CDATA[<br /> <div id="samoygw" class="ciodigest"><span style="color: #808000"><strong>[摘要] </strong>作者介l了一U较为实用的Java操作MySQL的中文处理方法?br /> <strong></strong>[关键字] </span><a class="cyewunder" target="_blank"><span style="color: #808000">Java</span></a><span style="color: #808000"> </span><a class="cyewunder" target="_blank"><span style="color: #808000">MySQL</span></a><span style="color: #808000"> </span></div> <div id="giaceeu" class="contenttxt"><span style="color: #808000">  q是很头痛的问题Q一直都是在困扰着我们。我有一个不简单也不算隄ҎQ这是我一直在用的方式?<br /> <br />   1、徏立一个类Q包括一个格式将中文转换为ISO8859-1~码的方法: <br /> <br />   publicclass Format2Chinese { <br /> <br />   public Format2Chinese() { <br /> <br />   } <br /> <br />   public String format2IS08859(String str) { <br /> <br />   try { <br /> <br />   if (str == null    str.trim().equals("")) <br /> <br />   str = ""; <br /> <br />   else <br /> <br />   str = new String(str.getBytes("ISO8859-1")); <br /> <br />    <br /> <br />   } catch (Exception e) { <br /> <br />   e.printStackTrace(); <br /> <br />   } <br /> <br />   return str; <br /> <br />   } <br /> <br />   } <br /> <br />   2、你的bean里面q时p加一些东西了Q如下面q个单的bean: <br /> <br />   publicclass Leavemsg <br /> <br />   { <br /> <br />   public Leavemsg() { </span></div> <img src ="http://www.tkk7.com/jasonwbd/aggbug/230083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jasonwbd/" target="_blank">D于渊</a> 2008-09-20 09:10 <a href="http://www.tkk7.com/jasonwbd/articles/230083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaClassLoader与Package机制http://www.tkk7.com/jasonwbd/articles/230082.htmlD于渊D于渊Sat, 20 Sep 2008 01:09:00 GMThttp://www.tkk7.com/jasonwbd/articles/230082.htmlhttp://www.tkk7.com/jasonwbd/comments/230082.htmlhttp://www.tkk7.com/jasonwbd/articles/230082.html#Feedback0http://www.tkk7.com/jasonwbd/comments/commentRss/230082.htmlhttp://www.tkk7.com/jasonwbd/services/trackbacks/230082.html
[摘要] Java语言规定Q在同一个包中的classQ如果没有修饰符Q默认ؓPackage权限Q包内的class都可以访问。但是这q不够准。确切的_只有由同一个ClassLoader装蝲的class才具有以上的Package权限?br /> [关键字] JavaClassLoader Package
  Z深入了解Java的ClassLoader机制Q我们先来做以下实验Q?

  package java.lang;

  public class Test {

  public static void main(String[] args) {

  char[] c = "1234567890".toCharArray();

  String s = new String(0, 10, c);

  }

  }

  StringcL一个Package权限的构造函数String(int offset, int length, char[] array)Q按照默认的讉K权限Q由于Test属于java.lang包,因此理论上应该可以访问String的这个构造函数。编译通过Q执行时l果如下Q?

  Exception in thread "main" java.lang.SecurityException: Prohibited package name:

  java.lang

  at java.lang.ClassLoader.defineClass(Unknown Source)

  at java.security.SecureClassLoader.defineClass(Unknown Source)

  at java.net.URLClassLoader.defineClass(Unknown Source)

  at java.net.URLClassLoader.access$100(Unknown Source)

  at java.net.URLClassLoader$1.run(Unknown Source)

  at java.security.AccessController.doPrivileged(Native Method)

  at java.net.URLClassLoader.findClass(Unknown Source)

  at java.lang.ClassLoader.loadClass(Unknown Source)

  at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

  at java.lang.ClassLoader.loadClass(Unknown Source)

  at java.lang.ClassLoader.loadClassInternal(Unknown Source)

  奇怪吧Q要弄清Z么会有SecurityExceptionQ就必须搞清楚ClassLoader的机制?

  Java的ClassLoader是用来动态装载class的,ClassLoader对一个class只会装蝲一ơ,JVM使用的ClassLoader一共有4U:

  启动c装载器Q标准扩展类装蝲器,c\径装载器和网l类装蝲器?

  q?UClassLoader的优先依次从高CQ用所谓的“双亲委派模型”。确切地_如果一个网l类装蝲器被h装蝲一个java.lang.IntegerQ它会首先把h发送给上一U的c\径装载器Q如果返回已装蝲Q则|络c装载器不会装载这个java.lang.IntegerQ如果上一U的c\径装载器q回未装载,它才会装载java.lang.Integer?

  cM的,c\径装载器收到h后(无论是直接请求装载还是下一U的ClassLoader上传的请求)Q它也会先把h发送到上一U的标准扩展c装载器Q这样一层一层上传,于是启动c装载器优先U最高,如果它按照自q方式扑ֈ了java.lang.IntegerQ则下面的ClassLoader 都不能再装蝲java.lang.IntegerQ尽你自己写了一个java.lang.IntegerQ试囑֏代核心库的java.lang.Integer是不可能的,因ؓ自己写的q个cL本无法被下层的ClassLoader装蝲?

  再说说Package权限。Java语言规定Q在同一个包中的classQ如果没有修饰符Q默认ؓPackage权限Q包内的class都可以访问。但是这q不够准。确切的_只有由同一个ClassLoader装蝲的class才具有以上的Package权限。比如启动类装蝲器装载了java.lang.StringQ类路径装蝲器装载了我们自己写的java.lang.TestQ它们不能互相访问对方具有Package权限的方法。这样就L了恶意代码访问核心类的Package权限Ҏ?/span>


D于渊 2008-09-20 09:09 发表评论
]]>
Java 处理事务_要http://www.tkk7.com/jasonwbd/articles/230081.htmlD于渊D于渊Sat, 20 Sep 2008 01:08:00 GMThttp://www.tkk7.com/jasonwbd/articles/230081.htmlhttp://www.tkk7.com/jasonwbd/comments/230081.htmlhttp://www.tkk7.com/jasonwbd/articles/230081.html#Feedback0http://www.tkk7.com/jasonwbd/comments/commentRss/230081.htmlhttp://www.tkk7.com/jasonwbd/services/trackbacks/230081.html 

Java 处理事务_要

    

[摘要] 有一个订单库存管理系l,每一ơ生成订单的同时我们都要消减库存。通常来说订单和库存在数据库里是分两张表来保存的:订单表,库存表。每一ơ追加一个订单实际上需要两步操作:在订单表中插入一条数据,同时修改库存的数据?br /> [关键字] Java 事务
  单事务的概念

  我不想从原理上说明什么是事务Q应为那太枯燥了。我只想从一个简单的例子来说明什么是事务?

  例如我们有一个订单库存管理系l,每一ơ生成订单的同时我们都要消减库存。通常来说订单和库存在数据库里是分两张表来保存的:订单表,库存表。每一ơ我们追加一个订单实际上需要两步操作:在订单表中插入一条数据,同时修改库存的数据?

  q样问题来了Q例如我们需要一个单位ؓ10的订单,库存中有30Ӟ理想的操作是我们在订单表中插入了一条单位ؓ10的订单,之后库存表中的数据修改?0。但是有些时候事情ƈ不是L按照你的x发生Q例如:在你修改库存的时候,数据库突然由于莫名其妙的原因无法q接上了。也是说库存更新失败了。但是订单已l生了Q那么怎么办呢Q没办法Q只有手动的修改。所以最好的方式是将订单插入的操作和库存修改的操作绑定在一P必须同时成功或者什么都不做。这是事务?

  Java如何处理事务呢?

  我们从java.sql.Connection说vQConnection表示了一个和数据库的链接Q可以通过Connection来对数据库操作。在通常情况是Connection的属性是自动提交的,也就是说每次的操作真的更C数据库,真的无法回退了。针对上q的例子Q一旦库存更新失败了Q订单无法回退Q因单真的插入到了数据库中。这q不是我们希望的?

  我们希望的是Q看h成功了,但是没有真的操作数据库,知道我想让他真的发生。可以通过Connection的setAutoCommitQfalseQ让Connection不自动提交你的数据,除非你真的想提交。那么如何让操作真的发生呢?可以使用Connection的commitҎ。如何让操作回退呢?使用rollbackҎ?

  例如Q?

  try{

  Connection conn = getConnectionQ); // 不管如何我们得到了链?

  conn.setAutoCommit(false);

  // 插入订单

  // 修改库存

  conn.commit(); // 成功的情况下Q提交更新?

  } catch(SQLException ex) {

  conn.rollback(); // p|的情况下Q回滚所有的操作

  } finally {

  conn.close();

  }

  q里有一炚w帔R要,事务是基于数据库链接的。所以在但数据库的情况下Q事务操作很单?

  那么如果表分布在两个不同的数据库中呢Q?

  例如订单表在订单库中Q库存表在库存库中,那么我们如何处理q样的事务呢Q?

  需要注意,提交也可以遇到错误呀Q?

  try{

  Connection conn1 = getConnection1();

  Connection conn2 = getConnection2();

  // Zconn1做插入操?

  // Zconn2做更新操?

  try{

  conn1.commitQ)

  } catch(SQLExcetion ) {

  conn1.rollback();

  }

  try {

  conn2.commit();

  } catch(SQLException ) {

  conn2.rollbakc();

  // 保证肯定删除刚才插入的订单?

  }

  } catch(SQLException ex) {

  // 如果插入p|Qconn1.rollback

  // 如果更新p|Qconn1.rollback && conn2.rollback

  } finally {

  conn1.close();

  conn2.close();

  }

  看看上述的代码就知道Q其实操作非常的复杂Q甚臻I保证肯定删除刚才插入的订单根本无法保证?

  在上q情况下的事务可以称之ؓ分布式事务,通过上述的代码中事务同时提交处理的部分我们可以得出,要想处理分布式事务,必须有独立于数据库的W三方的事务处理lg?

  q运的是通常情况下,JavaEE兼容的应用服务器Q例如:WeblogicQWebsphereQJBossQGlassfish{都有这U分布式事务处理的组件?

  如何使用应用服务器的分布式事务管理器处理分布式事务?

  以galssfishZ

  1 建立对应两个数据库的XAQjavax.sql.XADataSourceQ类型的数据源?

  2 使用UserTransaction来保证分布式事务?

  try{

  Connection conn1 = datasource1.getConnection();

  Connection conn2 = datasource2.getConnection();

  UserTransaction ut = getUserTransaction();

  ut.begin();

  // 插入订单

  // 修改库存

  ut.commit(); // 成功的情况下Q提交更新?

  } catch(SQLException ex) {

  ut.rollback(); // p|的情况下Q回滚所有的操作

  } finally {

  conn.close();

  }

  如何获取UserTransaction呢?可以使用如下Ҏ

  UserTransaction tx = (UserTransaction)

  ctx.lookup("jndi/UserTransaction");



D于渊 2008-09-20 09:08 发表评论
]]>
如何为JavaE序中添加播放MIDI音乐功能http://www.tkk7.com/jasonwbd/articles/230080.htmlD于渊D于渊Sat, 20 Sep 2008 01:05:00 GMThttp://www.tkk7.com/jasonwbd/articles/230080.htmlhttp://www.tkk7.com/jasonwbd/comments/230080.htmlhttp://www.tkk7.com/jasonwbd/articles/230080.html#Feedback0http://www.tkk7.com/jasonwbd/comments/commentRss/230080.htmlhttp://www.tkk7.com/jasonwbd/services/trackbacks/230080.html[摘要] Java在多媒体处理斚w的确优势不大Q但是我们在E序中有些时候又需要一些音乐做为点~Q如果播攄音乐是wav{L形音频文?又挺?所以背景音乐最好就是MIDI了?br /> [关键字] Java 播放 MIDI       http://www.enet.com.cn/article/2007/1015/A20071015868395.shtml
  Java在多媒体处理斚w的确优势不大Q但是我们在E序中有些时候又需要一些音乐做为点~Q如果播攄音乐是wav{L形音频文?又挺?所以背景音乐最好就是MIDI了,可是|上很多播放MIDI的教E都是简单的几句话的例子Qƈ且没有考虑资源的释N题,如果E序长久q行的话,׃出现内存耗越多的情况Q以至于最后抛Z个java.lang.OutOfMemoryErrorQ整个程序就挂了?

  在MIDI的播放中Q一个类是比较重要的Q那是MidiSystemc,它负责整个MIDI播放讑֤{的理Q其实就是SeqencerQ它是一个MIDI播放讄Q用于播放MIDI序列的,q有一个类叫SeqenceQ它是MIDI的序?MIDI的序列可以自qE序生成Q也可以从文件中或者URL中读取?

  下面是一个播放MIDI音乐功能实例Q?

  
1
 


D于渊 2008-09-20 09:05 发表评论
]]>
详细讲述Java中的克隆http://www.tkk7.com/jasonwbd/articles/230079.htmlD于渊D于渊Sat, 20 Sep 2008 01:01:00 GMThttp://www.tkk7.com/jasonwbd/articles/230079.htmlhttp://www.tkk7.com/jasonwbd/comments/230079.htmlhttp://www.tkk7.com/jasonwbd/articles/230079.html#Feedback0http://www.tkk7.com/jasonwbd/comments/commentRss/230079.htmlhttp://www.tkk7.com/jasonwbd/services/trackbacks/230079.html
[摘要] l常听到有h说java中没有指针。事实如此吗QnoQjava是有指针的,只不q换了个名字而已Q也是我们l常提到的引用?br /> [关键字] Java 克隆
  l常听到有h说java中没有指针。事实如此吗QnoQjava是有指针的,只不q换了个名字而已Q也是我们l常提到的引用。我们知道,在java中一切都是对象,那么我们如何操控对象Q如何在成千上万的对象中扑ֈ我们所需的那个对象呢Q又是如何让对象按照我们的意思来完成d的呢Q?

  Object o = new Object()Q?

  q是java中最常见的语句了Q在q句话中做了三g事。首先声明一个Objectcd的变量oQ在内存中ؓ对象划分一块地址new ObjectQ)Q将声明的变量指向内存中的对象。如此一来,我们可以通过o来操U对象了。就好像孩子们玩的遥控飞机,在空中飞行的是飞机,而它做Z动作的却是孩子们手中的摇控器?

  "克隆"是如今听到的较多的词汇,听说已经某只羊克隆了好几䆾了。但愿这U技术不要在n上实验。java中也?克隆"Q与现实世界的克隆一P一个实际存在的对象拯几䆾。如下:

  //倒霉的羊

  public class Sheep implements Cloneable{

  private String name;

  public void setName(String arg) {

  name = arg;

  }

  public String getName() {

  return name;

  }

  public Object clone() throws CloneNotSupportedException {

  return super.clone();

  }

  }

  //克隆

  public class Main {

  public static void main(String[] args) throws CloneNotSupportedException {

  Sheep sheep = new Sheep(); //先得到那只羊的实?

  sheep.setName("我是真的"); //l它做个记号

  System.out.println("sheep.getName() = " + sheep.getName());

  Sheep sheepClone = (Sheep)sheep.clone(); //开始克?

  System.out.println("sheepClone.getName() = " + sheepClone.getName());

  }

  }

  q行E序l果为:

  sheep.getName() = 我是真的

  sheepClone.getName() = 我是真的



D于渊 2008-09-20 09:01 发表评论
]]>
使用~冲IO提高JavaE序性能http://www.tkk7.com/jasonwbd/articles/230077.htmlD于渊D于渊Sat, 20 Sep 2008 00:59:00 GMThttp://www.tkk7.com/jasonwbd/articles/230077.htmlhttp://www.tkk7.com/jasonwbd/comments/230077.htmlhttp://www.tkk7.com/jasonwbd/articles/230077.html#Feedback0http://www.tkk7.com/jasonwbd/comments/commentRss/230077.htmlhttp://www.tkk7.com/jasonwbd/services/trackbacks/230077.html
[摘要] Java 输入/输出(IO)的性能可以使用标准的缓冲类提升Q就像操作系l通过~冲h提高它的速度一栗?br /> [关键字] ~冲IO Java 性能
  Java 输入/输出(IO)的性能可以使用标准的缓冲类提升Q就像操作系l通过~冲h提高它的速度一栗例如,如果一D代码要求从盘上读取数据,它会试图d内存中已有的数据Q如果代码希望向盘写一些东西,它可能在完成写操作前输出在内存中存放一D|间以{待更多的数据?

  在Java的IOpȝ中,一个字W写入内存比写到盘上快得多Q例如:

  // q段代码会抛?IOException

  Writer writer = new FileWriter( new File( "file.txt" ) );

  for(int i=0; i<1000; i++) {

  writer.write(""+i);

  writer.write("\n");

  }

  writer.close( );

  在这个范例代码中QFileWriter 一ơ输Z个数字,在Apple Powerbook 上测量消耗的旉Q第一ơ是180毫秒Q以后是90毫秒Q这个不同可能是JVM的即Ӟjust-in-timeQ编译导致的?

  l这D代码添加缓冲功能就是在FileWriter上创Z个BufferedWriter 对象?

  //q段代码会抛出IOException

  Writer writer = new BufferedWriter(new FileWriter(

  new File( "file.txt" )

  ) );

  for(int i=0; i<1000; i++) {

  writer.write(""+i);

  writer.write("\n");

  }

  writer.close( );

  现在BufferedWriter 会决定以什么频率向FileWriter发送写调用。可以用flush( )Ҏ强制发出写调用。增加了BufferedWriter 后,代码的运行时间是63毫秒。如果是有很多小量的输出Q那么BufferedWriter 在缺省条件下的性能提升是非常显著的?

  除了BufferedWriter 外,BufferedOutputStream 也具有相同的品质Q对于输入就是BufferedReader 和BufferedInputStream?

  需要注意的是缓冲类不光是在文gpȝ上v作用QQ何的Reader/Writer都能q行~冲以提高字W输?输出的速度Q同样Q何OutputStream/InputStream都能q行~冲以提高字节IO的速度?/span>



D于渊 2008-09-20 08:59 发表评论
]]>
Javaq阶:ZSocket的Java|络~程集ahttp://www.tkk7.com/jasonwbd/articles/230075.htmlD于渊D于渊Sat, 20 Sep 2008 00:57:00 GMThttp://www.tkk7.com/jasonwbd/articles/230075.htmlhttp://www.tkk7.com/jasonwbd/comments/230075.htmlhttp://www.tkk7.com/jasonwbd/articles/230075.html#Feedback0http://www.tkk7.com/jasonwbd/comments/commentRss/230075.htmlhttp://www.tkk7.com/jasonwbd/services/trackbacks/230075.html
[摘要] 其实,单的分析一下,可以看出客户和服务通讯的主要通道是Socket本nQ而服务器通过acceptҎ是同意和客户徏立通讯.q样当客户徏立Socket的同时。服务器也会使用q一根连U来先后通讯Q那么既然如此只要我们存在多条连U就可以了?br /> [关键字] Socket |络~程
其实,单的分析一下,可以看出客户和服务通讯的主要通道是Socket本nQ而服务器通过acceptҎ是同意和客户徏立通讯.q样当客户徏立Socket的同时。服务器也会使用q一根连U来先后通讯Q那么既然如此只要我们存在多条连U就可以了。那么我们的E序可以变ؓ如下:
那么下面的问题是如何使用U程.首先要做的事情是创徏U程q得其可以和网l连U取得联pR然后由U程来执行刚才的操作Q要创徏U程要么直接l承Thread要么实现Runnable接口Q要建立和Socket的联pd要传递引用就可以?而要执行U程必重写runҎQ而runҎ所做的事情是刚才单线E版本main所做的事情Q因此我们的E序变成了这?

import java.net.*;
import java.io.*;

public class MultiUser extends Thread{
  private Socket client;

  public MultiUser(Socket c){
   this.client=c;
  }

  public void run(){
try{
    BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
    PrintWriter out=new PrintWriter(client.getOutputStream());
    //Mutil User but can parallel
    while(true){
     String str=in.readLine();
     System.out.println(str);
     out.println("has receive....");
     out.flush();
     if(str.equals("end"))
      break;
}
    client.close();
}catch(IOException ex){
}finally{
   }
  }

  public static void main(String[] args)throws IOException{
   ServerSocket server=new ServerSocket(5678);
   while(true){
   //transfer location change Single User or Multi User
   MultiUser mu=new MultiUser(server.accept());
   mu.start();
   }
  }
}



客户端代?

import Java.net.*;
import Java.io.*;

public class Client{
static Socket Server;

public static void main(String[] args) throws Exception
{
Server=new Socket (InetAddress.getLocalHost(),5678);
BufferedReader in=new BufferedReader(new InputStreamReader(Server.getInputStream()));
PrintWriter out=new PrintWriter(Server.getOutputStream());
BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));
while(true)
{
String str=wt.readLine();
out.println(str);
out.flush();
if(str.equals("end"))
{
break;
}
System.out.println(in.readLine());
}
Server.close();
}
}

q段E序是接受客L键盘输入Qƈ把信息输出到服务端。ƈ?end"作ؓ退出的命o

以上E序完成了两台计机的简单通信?



D于渊 2008-09-20 08:57 发表评论
]]>
J2SEl合--对于log4j的深层次的理?/title><link>http://www.tkk7.com/jasonwbd/articles/230074.html</link><dc:creator>D于渊</dc:creator><author>D于渊</author><pubDate>Sat, 20 Sep 2008 00:56:00 GMT</pubDate><guid>http://www.tkk7.com/jasonwbd/articles/230074.html</guid><wfw:comment>http://www.tkk7.com/jasonwbd/comments/230074.html</wfw:comment><comments>http://www.tkk7.com/jasonwbd/articles/230074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jasonwbd/comments/commentRss/230074.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jasonwbd/services/trackbacks/230074.html</trackback:ping><description><![CDATA[<span style="color: #808000"><br />   log4j的好处在于: <br /> <br />   1.通过修改配置文gQ就可以军_log信息输出C?console,文g,...),是否输出?<br /> <br />   q样Q在pȝ开发阶D可以打印详l的log信息以跟t系l运行情?而在pȝE_后可以关闭log输出,从而在能跟t系l运行情늚同时,又减了垃圾代码(System.out.println(...){??<br /> <br />   2.使用log4jQ需要整个系l有一个统一的log机制Q有利于pȝ的规划?<br /> <br />   log4j的用本w很单。但合理地规划一个系l的l一log机制需要周全的考虑?<br /> <br />   其他关于log4j的信息参看log4j自带的文档?<br /> <br />   PART II 配置文g详细解释 <br /> <br />   先看一个配|文件的例子: <br /> <br />   1.配置文g的例?<br /> <br />   log4j.rootLogger=DEBUG <br /> <br />   #DAO层log记录到DAOLog,allLog?<br /> <br />   log4j.logger.DAO=DEBUG,A2,A4 <br /> <br />   #逻辑层log记录到BusinessLog,allLog?<br /> <br />   log4j.logger.Businesslog=DEBUG,A3,A4 <br /> <br />   #A1--打印到屏q上 <br /> <br />   log4j.appender.A1=org.apache.log4j.ConsoleAppender <br /> <br />   log4j.appender.A1.layout=org.apache.log4j.PatternLayout <br /> <br />   log4j.appender.A1.layout.ConversionPattern=%-5p [%t] %37c %3x - %m%n <br /> <br />   #A2--打印到文件DAOLog?-专门为DAO层服务log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender <br /> <br />   log4j.appender.A2.file=DAOLog <br /> <br />   log4j.appender.A2.DatePattern='.'yyyy-MM-dd <br /> <br />   log4j.appender.A2.layout=org.apache.log4j.PatternLayout <br /> <br />   log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n <br /> <br />   #A3--打印到文件BusinessLog?-专门记录逻辑处理层服务log信息log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender <br /> <br />   log4j.appender.A3.file=BusinessLog <br /> <br />   log4j.appender.A3.DatePattern='.'yyyy-MM-dd <br /> <br />   log4j.appender.A3.layout=org.apache.log4j.PatternLayout <br /> <br />   log4j.appender.A3.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n <br /> <br />   #A4--打印到文件alllog?-记录所有log信息log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender <br /> <br />   log4j.appender.A4.file=alllog <br /> <br />   log4j.appender.A4.DatePattern='.'yyyy-MM-dd <br /> <br />   log4j.appender.A4.layout=org.apache.log4j.PatternLayout <br /> <br />   log4j.appender.A4.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n <br /> <br />   2.Appender的?<br /> <br />   一个Appender代表log信息要写向的一个地斏Vlog4j可用的Appender有很多类?q里只考虑3U?ConsoleAppender,FileAppender,DailyRollFileAppender <br /> <br />   2.1 ConsoleAppender <br /> <br />   如果使用ConsoleAppenderQ那么log信息写到Console。就是直接把信息打印到System.out上了?<br /> <br />   2.2 FileAppender <br /> <br />   使用FileAppenderQ那么log信息写到指定的文g中。这应该是比较经怋用到的情c?<br /> <br />   相应圎ͼ在配|文件中应该指定log输出的文件名。如下配|指定了log文g名ؓdemo.txt <br /> <br />   log4j.appender.A2.File=demo.txt <br /> <br />   注意A2替换为具体配|中Appender的别名?<br /> <br />   2.DailyRollingAppender <br /> <br />   使用FileAppender可以log信息输出到文件中Q但是如果文件太大了读v来就不方便了。这时就可以使用DailyRollingAppender。DailyRollingAppender可以把Log信息输出到按照日期来区分的文件中。如下配|文件就会每天生一个log文gQ每个log文g只记录当天的log信息Q?<br /> <br />   log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender <br /> <br />   log4j.appender.A2.file=demo <br /> <br />   log4j.appender.A2.DatePattern='.'yyyy-MM-dd <br /> <br />   log4j.appender.A2.layout=org.apache.log4j.PatternLayout <br /> <br />   log4j.appender.A2.layout.ConversionPattern=%m%n <br /> <br />       3. Layout的配|?<br /> <br />   Layout指定了log信息输出的样式?<br /> <br />   详细信息h看PatternLayout的javadoc?<br /> <br />   例子1Q显C日期和log信息 <br /> <br />   log4j.appender.A2.layout=org.apache.log4j.PatternLayout <br /> <br />   log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %m%n <br /> <br />   打印的信息是Q?<br /> <br />   2002-11-12 11:49:42,866 SELECT * FROM Role WHERE 1=1 order by createDate desc <br /> <br />   例子2Q显C日期,log发生地方和log信息 <br /> <br />   log4j.appender.A2.layout=org.apache.log4j.PatternLayout <br /> <br />   log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %l "#" %m%n <br /> <br />   2002-11-12 11:51:46,313 cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409) "#" SELECT * FROM Role WHERE 1=1 order by createDate desc <br /> <br />   例子3Q显ClogU别,旉,调用Ҏ,log信息 <br /> <br />   log4j.appender.A2.layout=org.apache.log4j.PatternLayout <br /> <br />   log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%nlog信息:[DEBUG] 2002-11-12 12:00:57,376 method:cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409) <br /> <br />   SELECT * FROM Role WHERE 1=1 order by createDate desc <br /> <br />   PART 3 log4j的?<br /> <br />   log4j使用步骤?个: <br /> <br />   3.1 .Ҏ配置文g初始化log4j <br /> <br />   配置文g如PART 2所叙述。现在讲的是如何在程序中配置log4j?<br /> <br />   log4j可以使用3中配|器来初始化QBasicConfigurator,DOMConfigurator,PropertyConfigurator <br /> <br />   q里用的是PropertyConfigurator。用PropertyConfigurator适用于所有的pȝ?<br /> <br />   如下的语?<br /> <br />   PropertyConfigurator.configure("log4j.properties"); <br /> <br />   ׃log4j.properties为配|文件初始化好了log4j环境?<br /> <br />   注意一点:q个语句只需要在pȝ启动的时候执行一ơ。例?在unet webOA目中可以这么用: <br /> <br />   在ActionServlet的init()Ҏ中调用一ơ?<br /> <br />   public class ActionServlet extends HttpServlet{ <br /> <br />   /*** Initialize global variables*/ <br /> <br />   public void init() throws ServletException { <br /> <br />   // 初始化Action资源 <br /> <br />   try{initLog4j();...} <br /> <br />   catch(IOException e) <br /> <br />   {throw new ServletException("Load ActionRes is Error");}} <br /> <br />   protected void initLog4j(){PropertyConfigurator.configure("log4j.properties");} <br /> <br />   } <br /> <br />   //end class ActionServlet <br /> <br />   3.2 在需要用log4j的地方获取Logger实例 <br />   如下是RoleDAOcM的用例? <br /> <br />   static Logger log = Logger.getLogger("DAO"); <br /> <br />   注意q里使用"DAO"标识W,那么对应的在配置文g中对应的配置信息如下Q?<br /> <br />   #定义DAO Logger <br /> <br />   log4j.logger.DAO=DEBUG,A2 <br /> <br />   #讄Appender A2的属?<br /> <br />   log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender <br /> <br />   log4j.appender.A2.file=demolog4j.appender.A2.DatePattern='.'yyyy-MM-ddlog4j.appender.A2.layout=org.apache.log4j.PatternLayout <br /> <br />   log4j.appender.A2.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %l%n%m%n <br /> <br />   public class RoleDAO extends BaseDBObject{...static Logger log = Logger.getLogger("DAO"); <br /> <br />   public BeanCollection selectAll() throws SQLException{ <br /> <br />   StringBuffer sql = new StringBuffer(SQLBUF_LEN);sql.append("SELECT * FROM " + tableName + " order by roldId"); <br /> <br />   //System.out.println(sql.toString());log.debug(sql); <br /> <br />   } <br /> <br />   } <br /> <br />   3.3 使用Logger对象的debug,info,fatal...Ҏ <br /> <br />   log.debug("it is the debug info"); <br /> <br />   附g1Qlog4j的一个bug <br /> <br />   当这样用时QDailyRollingFileAppender不能正确使用Q?<br /> <br />   public Class RoleDAO(){ <br /> <br />   static Logger log = Logger.getLogger("DAO"); <br /> <br />   //在每一ơnew RoleDAO对象的时候都执行一ơconfigure()操作 <br /> <br />   public RoleDAO(TransactionManager transMgr) throws SQLException{...PropertyConfigurator.configure("log4j.properties");} <br /> <br />   public void select(){...//使用log4jq行log记录log.debug("..."); <br /> <br />   } <br /> <br />   } <a ><img height="11" src="http://images.enet.com.cn/end.gif" width="11" align="absMiddle" border="0" target="_blank" alt="" /></a><br /> <br /> </span> <img src ="http://www.tkk7.com/jasonwbd/aggbug/230074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jasonwbd/" target="_blank">D于渊</a> 2008-09-20 08:56 <a href="http://www.tkk7.com/jasonwbd/articles/230074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初学者如何开发高质量的J2EEpȝhttp://www.tkk7.com/jasonwbd/articles/230073.htmlD于渊D于渊Sat, 20 Sep 2008 00:53:00 GMThttp://www.tkk7.com/jasonwbd/articles/230073.htmlhttp://www.tkk7.com/jasonwbd/comments/230073.htmlhttp://www.tkk7.com/jasonwbd/articles/230073.html#Feedback0http://www.tkk7.com/jasonwbd/comments/commentRss/230073.htmlhttp://www.tkk7.com/jasonwbd/services/trackbacks/230073.html J2EE学习者越来越多,J2EE本n技术不断在发展Q涌现出各种概念Q本文章试图从一U容易理解的角度对这些概念向初学者进行解释,以便掌握学习J2EE学习方向?

  首先我们需要知道Java和J2EE是两个不同概念,Java不只是指一U语aQ已l代表与微Y不同的另外一个巨大阵营,所以Java有时是指一UY件系l的派Q当然目前主要是.NET和Java两大L体系?

  J2EE可以说指Java在数据库信息pȝ上实玎ͼ数据库信息系l从早期的dBase、到Delphi/VB{C/Sl构Q发展到B/SQBrowser览?Server服务?/a>Q结构,而J2EE主要是指B/Sl构的实现?

  J2EE又是一U框架和标准Q框架类似API、库的概念,但是要超出它们。如果需要详l了解框Ӟ可先从设计模式开始学习?

  J2EE是一个虚的大的概念,J2EE标准主要有三U子技术标准:WEB技术、EJB技术和JMSQ谈到J2EE应该说最l要落实到这三个子概念上?

  q三U技术的每个技术在应用旉涉及两个部分Q容器部分和应用部分QWeb容器也是指Jsp/Servlet容器Q你如果要开发一个Web应用Q无论是~译或运行,都必要有Jsp/Servlet库或API支持Q除了JDK/J2SE以外Q?

  Web技术中除了Jsp/Servlet技术外Q还需要JavaBeans或Java Class实现一些功能或者包装携带数据,所以Web技术最初裸体简UCؓJsp/Servlet+JavaBeanspȝ?

  谈到JavaBeans技术,涉及到lg构g技术(componentQ,q是Java的核心基部分Q很多Y件设计概念(设计模式Q都是通过JavaBeans实现的?

  JavaBeans不属于J2EE概念范畴中,如果一个JavaBeans对象被Web技术(也就是Jsp/ServletQ调用,那么JavaBeansp行在J2EE的Web容器中;如果它被EJB调用Q它p行在EJB容器中?

  EJBQ企业JavaBeansQ是普通JavaBeans的一U提升和规范Q因Z业信息系l开发中需要一个可伸羃的性能和事务、安全机Ӟq样能保证企业系l^滑发展,而不是发展到一U规模重新更换一套Y件系l?

  xQJavaBeanslg发展到EJB后,q不是说以前的那UJavaBeans形式消׃Q这p然Ş成了两种JavaBeans技术:EJB和POJOQPOJO完全不同于EJB概念Q指的是普通JavaBeansQ而且q个JavaBeans不依附某U框Ӟ或者干脆可以说Q这个JavaBeans是你个应用程序单独开发创建的?

  J2EE应用pȝ开发工h很多Q如JBuilder、Eclipse{,q些IDE首先是Java开发工P也就是说Q它们首要基本功能是可以开发出JavaBeans或Java classQ但是如果要开发出J2EEpȝQ就要落实到要么是Web技术或EJB技术,那么有可能要一些专门模块功?如eclipse需要lomboz插g)Q最重要的是Q因为J2EEpȝ区分为容器和应用两个部分Q所以,在Q何开发工具中开发J2EE都需要指定J2EE容器?

  J2EE容器分ؓWEB容器和EJB容器QTomcat/Resin是Web容器QJBoss是EJB容器+Web容器{,其中Web容器直接使用Tomcat实现的。所以你开发的Web应用E序可以在上面两U容器运行,而你开发的Web+EJB应用则只可以在JBoss服务器上q行Q商业品Websphere/Weblogic{和JBoss属于同一U性质?

J2EE容器也称为J2EE
服务?/a>Q大部分时它们概忉|一致的?

  如果你的J2EE应用pȝ的数据库q接是通过JNDI获得Q也是说是从容器中获得Q那么你的J2EE应用pȝ基本与数据库无关Q如果你在你的J2EE应用pȝ耦合了数据库JDBC驱动的配|,那么你的J2EE应用pȝ有数据库概念色彩,作ؓ一个成熟需要推q的J2EE应用pȝQ不推荐和具体数据库耦合Q当然这其中如何保证J2EE应用pȝq行性能又是体现你的设计水^了?

  衡量J2EE应用pȝ设计开发水q高低的标准是Q解耦性;你的应用pȝ各个功能是否能够dqQ是否不怺依赖Q也只有q样Q才能体现可l护性、可拓展性的软g设计目标?

  Z辑ֈq个目的Q诞生各U框架概念,J2EE框架标准一个系l划分ؓWEB和EJB主要部分Q当然我们有时不是以q个具体技术区分,而是从设计上抽象现层、服务层和持久层Q这三个层次从一个高度将J2EE分离开来,实现解耦目的?

  因此Q我们实际编E中Q也要将自己的功能向q三个层ơ上靠,做到大方向清楚,泾渭分明Q但是没有技术上U束限制要做到这Ҏ很不Ҏ的,因此我们q是必须借助J2EE具体技术来实现Q这Ӟ你可以用EJB规范实现服务层和持久层,Web技术实现表现层Q?

  EJBZ么能服务层从Jsp/Servlet手中分离出来Q因为它对JavaBeans~码有强制的U束Q现在有一U对JavaBeansq束,使用Ioc模式实现的(当然EJB 3.0也采取这U方式)Q在Ioc模式诞生前,一般都是通过工厂模式来对JavaBeansU束QŞ成一个服务层Q这也是是Jiveq样开源论坛设计原理之一?

  由此Q将服务层从表现层中分离出来目前有两U可选架构选择Q管理普通JavaBeansQPOJOQ框?如Spring、JdonFramework)以及理EJB的EJB框架Q因为EJB不只是框Ӟq是标准Q而标准可以扩展发展,所以,q两U区别将来是可能模糊Q被U_同一个标准了。 但是Q个为:标准制定是ؓ某个目的服务的,总要牺牲一些换取另外一些,所以,q两U架构会长时间ƈ存?

  q两U架构分歧也曄诞生一个新名词Q完全POJO的系l也UCؓ轻量U系l?lightweight)Q其实这个名词本w就没有一个严格定义,更多是一个吸引h的招牌,轻量是指Ҏ学习Ҏ使用吗?按照q个定义Q其实轻量Spring{系lƈ不容易学习;而且EJB 3.0Q依然叫EJBQ以后的pȝ是否可称量了呢Q?

  前面谈了服务层框Ӟ使用服务层框架可以将JavaBeans从Jsp/Servlet中分d来,而用表现层框架则可以将Jsp中剩余的JavaBeans完全分离Q这部分JavaBeans主要负责昄相关Q一般是通过标签库(taglibQ实玎ͼ不同框架有不同自q标签库,Struts是应用比较广泛的一U表现层框架?

  q样Q表现层和服务层的分L通过两种框架辑ֈ目的Q剩余的是持久层框架了Q通过持久层的框架数据库存储从服务层中分d来是其目的,持久层框架有两种方向Q直接自q写JDBC{SQL语句Q如iBatisQ;使用O/R Mapping技术实现的Hibernate和JDO技术;当然q有EJB中的实体Bean技术?

  持久层框架目前呈现百花齐放,各有优缺点的现状Q所以正如表现层框架一P目前没有一个框架被指定为标准框Ӟ当然Q表现层框架现在又出来了一个JSFQ它代表的页面组件概忉|一个新的发展方向,但是复杂的实现让人有些忘而却步?

  在所有这些J2EE技术中Q虽然SUN公司发挥了很大的作用Q不qM来说Q网l上有这样一个评PSUN的理论天下无敌;SUN的品用h撞墙Q对于初学者,特别是那些试N过或已l通过SUN认证的初学者,赶快摆脱SUN的阴影,立即开溜,使用开源领域的产品来实现自q应用pȝ?

  最后,你的J2EE应用pȝ如果采取上面提到的表现层、服务层和持久层的框架实玎ͼ基本你也可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系l了?

  q要注意的是: 开发出一个高质量的J2EEpȝq需要正的业务需求理解,那么域徏模提供了一U比较切实可行的正确理解业务需求的ҎQ相兌l知识可从UML角度l合理解?

  当然Q如果你惌计自q行业框架Q那么第一步从设计模式开始吧Q因计模式提供你一个实现JavaBeans或类之间解耦参考实现方法,当你学会了系l基本单元JavaBean或类之间解耦时Q那么系l模块之间的解耦你可能掌握,q而你可以实现行业框架的提炼了,q又是另外一个发展方向了?

  以上理念可以ȝZ句话Q?

  J2EE开发三件宝: Domain ModelQ域建模Q、patternsQ模式)和frameworkQ框Ӟ?

  推荐一套高质量的J2EE开源系l: JPestore

  如果初学者没有理解,Ƣ迎l箋讨论Q大胆提Z心中的疑问?


D于渊 2008-09-20 08:53 发表评论
]]>
关于Java中相对\径和l对路径问题ȝhttp://www.tkk7.com/jasonwbd/articles/230072.htmlD于渊D于渊Sat, 20 Sep 2008 00:52:00 GMThttp://www.tkk7.com/jasonwbd/articles/230072.htmlhttp://www.tkk7.com/jasonwbd/comments/230072.htmlhttp://www.tkk7.com/jasonwbd/articles/230072.html#Feedback0http://www.tkk7.com/jasonwbd/comments/commentRss/230072.htmlhttp://www.tkk7.com/jasonwbd/services/trackbacks/230072.html
1.基本概念的理?

  l对路径Q绝对\径就是你的主上的文件或目录在硬盘上真正的\径,(URL和物理\?例如Q?C:\xyz\test.txt 代表了test.txt文g的绝对\径。http://www.sun.com/index.htm也代表了一?URLl对路径?

  相对路径Q相对与某个基准目录的\径。包含Web的相对\径(HTML中的相对目录Q,例如Q在 Servlet中,"/"代表Web应用的跟目录。和物理路径的相对表C。例如:"./" 代表当前目录, "../"代表上目录。这U类似的表示Q也是属于相对\径?另外关于URIQURL,URN{内容,请参考RFC相关文档标准?RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax, (http://www.ietf.org/rfc/rfc2396.txt)

  2.关于JSP/Servlet中的相对路径和绝对\径?

  2.1服务?/a>端的地址

  服务器端的相对地址指的是相对于你的web应用的地址Q这个地址是在服务器端解析?Q不同于html和javascript中的相对地址Q他们是由客L览器解析的Q也是说这时?在jsp和servlet中的相对地址应该是相对于你的web应用Q即相对于http://192.168.0.1/webapp/的?

  其用到的地方有: forwardQservlet中的request.getRequestDispatcher(address);q个address?在服务器端解析的Q所以,你要forward到a.jsp应该q么写: request.getRequestDispatcher(“/user/a.jsp”)q个/相对于当前的web应用webappQ?其绝对地址是Qhttp://192.168.0.1/webapp/user/a.jsp?sendRedirectQ在jsp?

  2.2、客L的地址 所有的html面中的相对地址都是相对于服务器根目?http://192.168.0.1/)的, 而不?跟目录下的该Web应用的目?http://192.168.0.1/webapp/的?Html中的form表单的action属性的地址应该是相对于服务器根目录(http://192.168.0.1/)的, 所以,如果提交到a.jsp为:actionQ?/webapp/user/a.jsp"或action=""/user/a.jspQ?

  提交到servlet为actiomQ?/webapp/handleservlet"

  Javascript也是在客L解析的,所以其相对路径和form表单一栗?

  因此Q一般情况下Q在JSP/HTML面{引用的CSS,Javascript.Action{属性前面最好都加上 ,以确保所引用的文仉属于Web应用中的目录?另外Q应该尽量避免用类?.","./","../../"{类似的相对该文件位|的相对路径Q这?当文件移动时Q很Ҏ出问题?br />
3. JSP/Servlet中获得当前应用的相对路径和绝对\?

  3.1 JSP中获得当前应用的相对路径和绝对\?根目录所对应的绝对\?request.getRequestURI() 文g的绝对\? :application.getRealPath(request.getRequestURI());

  当前web应用的绝对\?:application.getRealPath("/");

  取得h文g的上层目?new File(application.getRealPath(request.getRequestURI())).getParent()

  3.2 Servlet中获得当前应用的相对路径和绝对\?根目录所对应的绝对\?request.getServletPath();

  文g的绝对\?:request.getSession().getServletContext().getRealPath (request.getRequestURI())

  当前web应用的绝对\?:servletConfig.getServletContext().getRealPath("/");

  (ServletContext对象获得几种方式Q?javax.servlet.http.HttpSession.getServletContext() javax.servlet.jsp.PageContext.getServletContext() javax.servlet.ServletConfig.getServletContext() )

  4.java 的Class中获得相对\径,l对路径的方?

  4.1单独的JavacM获得l对路径

  Ҏjava.io.File的Doc文挡Q可? 默认情况下new File("/")代表的目录ؓQ?

  System.getProperty("user.dir")?一下程序获得执行类的当前\?

  package org.cheng.file;

  import java.io.File;

  public class FileTest {

  public static void main(String[] args) throws Exception { System.out.println(Thread.currentThread().getContextClassLoader().getResource("")); System.out.println(FileTest.class.getClassLoader().getResource(""));   System.out.println(ClassLoader.getSystemResource("")); System.out.println(FileTest.class.getResource(""));

  System.out.println(FileTest.class.getResource("/"));

  //Class文g所在\?

  System.out.println(new File("/").getAbsolutePath());

  System.out.println(System.getProperty("user.dir"));

  }

  }

  4.2
服务?/a>中的Javac获得当前\径(来自|络Q?

  (1).Weblogic WebApplication的系l文件根目录是你的weblogic安装所在根目录?例如Q如果你的weblogic安装在c:\bea\weblogic700..... 那么Q你的文件根路径是c:\. 所以,有两U方式能够让你访问你的服务器端的文gQ?

  a.使用l对路径Q?比如你的参数文件放在c:\yourconfig\yourconf.propertiesQ?直接使用 new FileInputStream("yourconfig/yourconf.properties");

  b.使用相对路径Q?相对路径的根目录是你的webapplication的根路径Q即WEB-INF的上一U目录,你的参数文件放 在yourwebapp\yourconfig\yourconf.propertiesQ?q样使用Q?new FileInputStream("./yourconfig/yourconf.properties"); q两U方式均可,自己选择?

  (2).Tomcat 在类中输出System.getProperty("user.dir");昄的是%Tomcat_Home%/bin

  (3).Resin 不是你的JSP攄相对路径,是JSP引擎执行q个JSP~译成SERVLET 的\径ؓ?比如用新建文件法试File f = new File("a.htm"); q个a.htm在resin的安装目录下 (4).如何ȝ对\径哪Q?在Java文g中getResource或getResourceAsStream均可 例:getClass().getResourceAsStream(filePath);//filePath可以?/filename",q里?代表web 发布根\径下WEB-INF/classes 默认使用该方法的路径是:WEB-INF/classes。已l在Tomcat中测试?

  5.d文g时的相对路径Q避免硬~码和绝对\径的使用?/span>

D于渊 2008-09-20 08:52 发表评论
]]>
ZJDK5.0一些collectioncȝ使用ȝhttp://www.tkk7.com/jasonwbd/articles/230071.htmlD于渊D于渊Sat, 20 Sep 2008 00:51:00 GMThttp://www.tkk7.com/jasonwbd/articles/230071.htmlhttp://www.tkk7.com/jasonwbd/comments/230071.htmlhttp://www.tkk7.com/jasonwbd/articles/230071.html#Feedback0http://www.tkk7.com/jasonwbd/comments/commentRss/230071.htmlhttp://www.tkk7.com/jasonwbd/services/trackbacks/230071.html
 ?.0中,collection最大的一个改变就是可以指定它的具体类型:

  List< String> list=new List< String>;

  两个最基本的接口:

  public interface Collection< E>

  {

  boolean add(E element);

  Iterator< E> iterator();

  . . .

  }

  public interface Iterator< E>

  {

  E next();

  boolean hasNext();

  void remove();

  }

  ?.0以前Q常用的形式是Q?

  Collection< String> c = . . .;

  Iterator< String> iter = c.iterator();

  while (iter.hasNext())

  {

  String element = iter.next();

  do something with element

  }

  但是?.0中加入另外一U@环方式,cM于for eachQ?

  for (String element : c)

  {

  do something with element

  }

  q种方式对Q何实CIterable接口的类都适用?

  在用remove的时候特别要注意的一ҎQ在调用remove之前必须先调用一ơnextҎQ因为next像是在Ud一个指针,remove删掉的就是指针刚刚蟩q去的东ѝ即使是你想q箋删掉两个盔R的东西,也必d每次删除之前调用next?

  对collection排序和查?

  CollectionscȝsortҎ可以对Q何实CList接口的类q行排序。在排序q程中,他默认这些类实现了Comparable接口Q如果想用其他方法排序,可以在调用sortҎ的时候提供一个Comparator对象Q?

  Comparator< Item> itemComparator = new

  Comparator< Item>()

  {

  public int compare(Item a, Item b)

  {

  return a.partNumber - b.partNumber;

  }

  });

  反向排序Q?

  Collections.sort(items, itemComparator);

  Collections.sort(items, Collections.reverseOrder(itemComparator))Q?

  查找一个对象:

  i = Collections.binarySearch(c, element);

  i = Collections.binarySearch(c, element, comparator);

  但是q些list必须是已l排好序了。而且要注意的是这个算法需要随问collectionQ如果不支持随机讉K那么q个法的效率可能会很低?

  几种常用Collection:

  ArrayList

  An indexed sequence that grows and shrinks dynamically

  可以随机讉KQ但是如果要从中间删除一个对象会影响效率Q因为有些未删除的对象要相应的调整位|。非U程安全Q但效率会比Vector要高Q如果在单线E下Q选它而不是Vector?

  LinkedList

  An ordered sequence that allows efficient insertions and removal at any location

  只能按顺序访问,d删除很方ѝ虽然提供了get(n)ҎQ但实际上还是顺序访问的Q如果发现在LinkedList里面使用了这个方法,要考虑q个Listcd是否选的合?

  HashSet

  An unordered collection that rejects duplicates

  以hashcode为烦引,适用于不知道所存对象位|而想L某个对象的情c不可重?

  TreeSet

  A sorted set

  与HashSetcMQ但是所存对象是排了序的

  LinkedHashSet

  A set that remembers the order in which elements were inserted

  PriorityQueue

  A collection that allows efficient removal of the smallest element

  加入Queue的时候会l与一个优先Q从queue中取出的时候先取出优先U最低的

  HashMap

  A data structure that stores key/value associations

  存储key/value?非线E安全,与HashTable相比效率要高?

  treeMap

  A map in which the keys are sorted

  排序的HashMap

  LinkedHashMap

  A map that remembers the order in which entries were added

D于渊 2008-09-20 08:51 发表评论
]]>
在Java~程中的“模式思想”与框架关系http://www.tkk7.com/jasonwbd/articles/230070.htmlD于渊D于渊Sat, 20 Sep 2008 00:48:00 GMThttp://www.tkk7.com/jasonwbd/articles/230070.htmlhttp://www.tkk7.com/jasonwbd/comments/230070.htmlhttp://www.tkk7.com/jasonwbd/articles/230070.html#Feedback0http://www.tkk7.com/jasonwbd/comments/commentRss/230070.htmlhttp://www.tkk7.com/jasonwbd/services/trackbacks/230070.html
目前在开发领域中各种框架来多Q模式用机会性似乎减了Q那么是不是意味着我们׃必掌握模式了呢?其实Q学习模式实际ؓ了培L式思维Q模式思维有助于了解和使用框架?

  例如如何我们在用表现层哪个框架Q都是MVC模式实现Q那么进行编E步骤时Q我们脑里QC个步骤V/C/M以及C和V的{发关p,q而感觉struts-config.xml配置׃是多余或复杂Q而是必须的?

  现在有h觉得好像Java世界框架特别多,异常复杂Q其实这可能是他从封闭世界走向开放自׃界生的错觉Q当你具备模式思维Ӟ实际你就具备了挑选各U各h架的能力Q打个比喻:以选择轿RZ子,q去Q只有一U?#8220;U旗”轿R供选择Q你只有接受这个车;但是现在轿R多了Q选择多了Q你必M解车的通用概念Q进而你可以在各种轿R之间选择和衡量,了解轿R的通用概念q个q程如同我们学习模式,具备通用~程的模式思维Q有了模式思维Q就会发现有q么多选择产品Q不再嫌复杂Q而是变得兴奋了;所以,没有复杂的东西,只有是否原意学习的头脑;PC电脑对于一些h很复杂,可是对于我们会复杂吗Q不会,因ؓ我们已经掌握通用电脑的模型、模式?

  所以,有h觉得Java软g很多配置复杂Q甚至生配|恐惧症Q那是因Z没有模式思维Q在模式思维指导下的~程工作Q就象在写一生动的说一P你脑展现的生动模式实现步骤Q而无Z码或配置都是实现你模式思维的文字工P模式思维考虑到哪里,想起什么配|,配置对具备模式思维的你来说是很自然的表达?

  在模式思维下的Java~程Q编码阶Dcode completion可能p2/3旉Q但是调试测试时间只需?/3甚至不到Q大多数情况下是一步到位的调试成功Q这比以?/3~程旉Q?/3调试旉要高效多Q关键是Q你无论p多少旉在调试上Q实际上是在做一个修修补补的工作Q是在做l修工,头疼dQ永q是Z工,无法成ؓ设计师?

  下面从模式思维角度谈谈几个认识误区Q仅仅参考讨论:

  游戏软g比企业Y件复杂?

  Z么说企业软g时复杂的Q因Z业Y件是为应付需求而变Q与游戏软g{Y件相比,虽然一个游戏Y件在代码数量U别上比企业软g复杂Q但是游戏Y件不必考虑跟随游戏用户需求变化,是游戏用h务游戏设计规则;但是企业软g和其用户则相反,企业软g必须服从用户的变化,打个不是很确切的比喻Q企业Y件则cM市场l济中的市场人员Q需?#8220;看客戯?#8221;行事。而游戏Y件则相反Q类g前朝南坐的政府h员;

  因此Q企业Y件在动态概念上是随旉变化而变化,是由生命的,因ؓ计划赶不上变化,所以企业Y件制作时L使用模式为将来变化预留余圎ͼq种面向未来变化考虑方式无疑是最复杂的思维Q就象股变化将q种未来变化的残h向极_我们都想计划未来Q但是L计划不了未来Q这是企业软g的复杂所在?br />
Class.forName秘吗?

  有h觉得Class.forName很神U,秘不在于本w,是打开其编码研I到二进制也不能辑ֈ目的Q它的神U之处是因ؓ应用在一个恰当之处,p一块普通布没什么,但是如果从后面变了,你觉得这块布奇了,Class.forName奇之处在于光藏了对象创徏Q也一U是工厂模式实现?

  同样Q对于CollectionQ本来就是那几个U类List和MapQ但是发C用v来神奇得很,有h甚至研究qCollection的二q制Q这和研I术师中一块普通布没有什么区别。Collection用于容器Q作为对象集合;以及和单例结合实现缓存等Q可以实现多U模式?

  仅会法做企业软g吗?

  在实践中Q通常表示一个树形关p通过~码实现Q例?122334455表示是代号ؓ11cd下代号ؓ22cd下的代号?3cd下的....然后Q在软g各处通过分析q个cd~码获得树Ş关系Q这U将具体数据和业务耦合在一起做法是受到抨击的?

  那么如果我们要对树Ş关系的数据进行访问如何实现呢Q首先我们将树Ş关系的访问分Z个部分:树Ş关系Q功能实现。我们已l知晓树形结构的遍历Q但是仅仅知道树形结构遍历还是不够的Q我们还需要模式来解决树Ş关系讉Kq个通用问题Q用Composite模式可以方便客户端对树Şl构讉KQ得客L不至于因为树形结构变化而变化不定;而访问者模式则不会d能新增的新访问功能,D树Şl构中对象代码变化不定?

  q两U模式协同发力,可以l合解决树Şl构中对象群的访问?

  GoF模式打开的新境界

  没有知晓GoF模式之前Q我们L以ؓ~码是写一些代码,然后q行Q复杂吗Q如果我们来分析一下GoF模式三个cdQ你会发现^时熟视无睹的代码中隐藏如此多考虑斚w?

  GOF模式三种cdQ结构型模式、创建型模式和行为型模式其实函括了OO~码的三个方面:静态类关系、类创徏成ؓq行时对象实例;q行时的对象q行行ؓQ也是_我们在编码阶D不但考虑现阶D各个类之间静态解耦关p,而且q要考虑q些代码ȀzdQ运行时的情c?

  而以往q程化编E中Q编码状?q行状况Q如何先后编码,q些~码q行时就按照q些先后~码序执行Q两者是l一的,不可能出现运行时可能和编码时预想不一P更何况需要我们还要在q行cȝ码时Q考虑q些c运行时是如何实现的Q有如何对这些类q行时的关系q行解耦和分离呢?所以,我们“天生”无法理解设计模式,因ؓ我们从来pY件就是实现功能,哪里q会考虑到实现同样功能会涉及各种考量了呢Q?

  如果说设计模式是E序员的圣经Q那么不掌握设计模式可能是异教徒,从此教徒和异教徒两者之间就~Z沟通对话^収ͼp鸡对鸭讲话了?

  非模式思维的惩|?

  面向对象软g体系是和面向q程体系格格不入的,面向对象的各U技术如单元试 性能~存{等都是OO体系Q如果我们没有具备模式思维来编E,由此而诞生的软g架构必然p|Q失败在哪里Q通过性能惩罚你。最q碰C个台湄钢铁架构Q它虽然包含一个简单的MVC框架Q但是其Controller实际又是ServiceQ该框架配置下面几个元素耦合在一P面程Q控制类QDao与VOQ这实际是将表现层和持久层直接结合一Pq样的框架迫使程序员没有I间做中间领域模型层和服务层Q进而整个体pd成一个两层耦合l构Q这和传l的C/S没有区别Q在Java中用传l概늼E:如面向过E、面向数据表以及两层耦合Dl果是性能~慢Q很多大型项目就是这h后是毁在性能上,服务?/a>需要经常启动,一旦ƈ发用户就很慢Q服务器l常L?

  有h可能奇怪:非模式思维属于设计问题Q怎么会对性能影响Q这是将设计和性能对立hQ性能也是一U设计,池模式以及缓存也是属于模式啊Q但是缓存的高效率应用是建立良好的对象设计基上,或者说是良好的领域建模上,否则是使用~存Q也会导致粒度或动态机制不准确Q无法发挥缓存效率,甚至无法使用~存?/span>

D于渊 2008-09-20 08:48 发表评论
]]>
վ֩ģ壺 ѿС12Ƶ| ߹ۿ| ޵һҳۺͼƬ| Դ| պAV뾫Ʒ| һƬƵ| ůůձ| ޵Ӱһ| ɫƬ߹ۿ| һĻ| Ʒva߹ۿ| AëƬڵ| ձƷһ| Ů18ëƬaëƬƵ| Ƶ߲| 99þþùƷ| ŷһ| ߹ۿɫëƬ| ŮǿƨͰˬ| ƬѸƬ| 뾫Ʒһ| ޾Ʒþò| jizzѲ| ɫ6| ߹ۿ˳Ƶɫ| ɫ͵͵ۺAV | þþøƵ | Ѹ߹ۿ| ޾Ʒ| ڵëƬѿ| ŮǿƨͰˬ| ƷպAV| 999ھƷѹۿ| þþƷަvDz| ߹ۿwwwѿ| aëƬѹۿƵ| ޳AVƬ| þѹۿ99Ʒ| Ƶۿ| jizzjizzƵ| ӰԺֻ߹ۿ|