??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV无码成人精品区狼人影院,heyzo亚洲精品日韩,亚洲精品无码高潮喷水A片软http://m.tkk7.com/relax/category/351.html记述我学习java的里E?/description>zh-cnTue, 17 Nov 2009 17:34:31 GMTTue, 17 Nov 2009 17:34:31 GMT60java ~码转换Q{Q?/title><link>http://m.tkk7.com/relax/archive/2009/11/17/302686.html</link><dc:creator>L</dc:creator><author>L</author><pubDate>Tue, 17 Nov 2009 05:57:00 GMT</pubDate><guid>http://m.tkk7.com/relax/archive/2009/11/17/302686.html</guid><wfw:comment>http://m.tkk7.com/relax/comments/302686.html</wfw:comment><comments>http://m.tkk7.com/relax/archive/2009/11/17/302686.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/relax/comments/commentRss/302686.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/relax/services/trackbacks/302686.html</trackback:ping><description><![CDATA[<p>׃Unicode兼容ASCIIQ??55Q,因此Q上面得到的Unicode是ASCII?至于转换成二q制或其他进ӞJava API提供了方便函敎ͼ你可以查Java的API手册?</p> <p>以字Wa的ASCIIZQ?int i = 'a'; String iBin = Integer.toBinaryString(i);//二进?String iHex = Integer.toHexString(i);//十六q制 String iOct = Integer.toOctalString(i);//八进?String iWoKao = Integer.toString(i,3);//三进制或M你想要的35q制以下的进?DEC</p> <p>[集]java中进行二q制Q八q制Q十六进Ӟ十进刉q行怺转换       十进制{成十六进Ӟ Integer.toHexString(int i) 十进制{成八q制 Integer.toOctalString(int i) 十进制{成二q制 Integer.toBinaryString(int i) 十六q制转成十进?Integer.valueOf("FFFF",16).toString() 八进制{成十q制 Integer.valueOf("876",8).toString() 二进制{十进?Integer.valueOf("0101",2).toString()</p> <p>有什么方法可以直接将2,8,16q制直接转换?0q制的吗? java.lang.Integerc?parseInt(String s, int radix) 使用W二个参数指定的基数Q将字符串参数解析ؓ有符L整数?examples from jdk: parseInt("0", 10) returns 0 parseInt("473", 10) returns 473 parseInt("-0", 10) returns 0 parseInt("-FF", 16) returns -255 parseInt("1100110", 2) returns 102 parseInt("2147483647", 10) returns 2147483647 parseInt("-2147483648", 10) returns -2147483648 parseInt("2147483648", 10) throws a NumberFormatException parseInt("99", 8) throws a NumberFormatException parseInt("Kona", 10) throws a NumberFormatException parseInt("Kona", 27) returns 411787</p> <p>q制转换如何写(二,八,十六Q不用算?Integer.toBinaryString Integer.toOctalString Integer.toHexString </p> <p>例一Q?/p> <p>public class Test{   public static void main(String args[]){</p> <p>   int i=100;    String binStr=Integer.toBinaryString(i);    String otcStr=Integer.toOctalString(i);    String hexStr=Integer.toHexString(i);    System.out.println(binStr);</p> <p>例二Q?/p> <p>public class TestStringFormat {   public static void main(String[] args) {    if (args.length == 0) {       System.out.println("usage: java TestStringFormat <a number>");       System.exit(0);    }</p> <p>   Integer factor = Integer.valueOf(args[0]);</p> <p>   String s;</p> <p>   s = String.format("%d", factor);    System.out.println(s);    s = String.format("%x", factor);    System.out.println(s);    s = String.format("%o", factor);    System.out.println(s);   } }</p> <p>各种数字cd转换成字W串型: </p> <p>String s = String.valueOf( value); // 其中 value ZQ意一U数字类型?</p> <p>字符串型转换成各U数字类型: </p> <p>String s = "169"; byte b = Byte.parseByte( s ); short t = Short.parseShort( s ); int i = Integer.parseInt( s ); long l = Long.parseLong( s ); Float f = Float.parseFloat( s ); Double d = Double.parseDouble( s ); </p> <p>数字cd与数字类对象之间的{换: </p> <p>byte b = 169; Byte bo = new Byte( b ); b = bo.byteValue(); </p> <p>short t = 169; Short to = new Short( t ); t = to.shortValue(); </p> <p>int i = 169; b = bo.byteValue(); </p> <p>short t = 169; Short to = new Short( t ); t = to.shortValue(); </p> <p>int i = 169; Integer io = new Integer( i ); i = io.intValue(); </p> <p>long l = 169; Long lo = new Long( l ); l = lo.longValue(); </p> <p>float f = 169f; Float fo = new Float( f ); f = fo.floatValue(); </p> <p>double d = 169f; Double dObj = new Double( d ); d = dObj.doubleValue();</p> <img src ="http://m.tkk7.com/relax/aggbug/302686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/relax/" target="_blank">L</a> 2009-11-17 13:57 <a href="http://m.tkk7.com/relax/archive/2009/11/17/302686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK1.5中对XML的简单操?/title><link>http://m.tkk7.com/relax/archive/2008/05/15/200676.html</link><dc:creator>L</dc:creator><author>L</author><pubDate>Thu, 15 May 2008 08:44:00 GMT</pubDate><guid>http://m.tkk7.com/relax/archive/2008/05/15/200676.html</guid><wfw:comment>http://m.tkk7.com/relax/comments/200676.html</wfw:comment><comments>http://m.tkk7.com/relax/archive/2008/05/15/200676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/relax/comments/commentRss/200676.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/relax/services/trackbacks/200676.html</trackback:ping><description><![CDATA[//TestXML.xml<br /> <?xml version="1.0" encoding="GB2312" ?> <br /> <book> <br /> <title>Java实例一百例</title> <br /> <page id="1"> <br /> <title>基础知识?lt;/title> <br /> <file>base.htm</file> <br /> </page> <br /> <page id="3"> <br /> <title>SWING?lt;/title> <br /> <file>swing.htm</file> <br /> </page> <br /> <page id="28"> <br /> <title>EJB?lt;/title> <br /> <file>ejb.htm</file> <br /> </page> <br /> <page id="33"> <br /> <title>DOM?lt;/title> <br /> <file>xmldom.htm</file> <br /> </page> <br /> </book> <br /> <br /> <br /> //TestXML.java<br /> import javax.xml.parsers.*; <br /> import org.w3c.dom.*; <br /> import java.io.*; <br /> <br /> public class TestXML { <br /> public static void main(String[] args) { <br /> try { <br /> //创徏解析工厂 <br /> DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); <br /> //指定DocumentBuilder <br /> DocumentBuilder builder = dbfactory.newDocumentBuilder(); <br /> //从文件构造一个DocumentQ因为XML文g中已l指定了~码Q所以这里不必了 <br /> Document doc = builder.parse(new File("TestXML.xml")); <br /> //得到Document的根Q节点名QbookQ?<br /> Element root = doc.getDocumentElement(); <br /> System.out.println("根节Ҏ记名Q? + root.getTagName()); <br /> <br /> System.out.println("****下面遍历XML元素****"); <br /> //获得page元素 <br /> NodeList list = root.getElementsByTagName("page"); <br /> //遍历page元素 <br /> for (int i=0; i < list.getLength() ; i++) { <br /> //获得page的元?<br /> Element element = (Element)list.item(i); <br /> //获得ID属?<br /> String id = element.getAttribute("id"); <br /> //获得title属?<br /> NodeList titleList = element.getElementsByTagName("title"); <br /> //获得title元素 <br /> Element titleElement = (Element)titleList.item(0); <br /> //获得title元素的第一个?<br /> String title = titleElement.getFirstChild().getNodeValue(); <br /> //获得file元素名称 <br /> NodeList fileList = element.getElementsByTagName("file"); <br /> //获得file元素 <br /> Element fileElement = (Element)fileList.item(0); <br /> //获得file元素的第一个?<br /> String file = fileElement.getFirstChild().getNodeValue(); <br /> <br /> System.out.println("IDQ? + id + " " + <br /> "标题Q? + title + " " + <br /> "文gQ? + file); <br /> } <br /> }<br /> catch (Exception e) { <br /> e.printStackTrace(); <br /> } <br /> } <br /> } <img src ="http://m.tkk7.com/relax/aggbug/200676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/relax/" target="_blank">L</a> 2008-05-15 16:44 <a href="http://m.tkk7.com/relax/archive/2008/05/15/200676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.lang.OutOfMemoryError的解決方法集http://m.tkk7.com/relax/archive/2008/04/02/190438.htmlLLWed, 02 Apr 2008 11:30:00 GMThttp://m.tkk7.com/relax/archive/2008/04/02/190438.htmlhttp://m.tkk7.com/relax/comments/190438.htmlhttp://m.tkk7.com/relax/archive/2008/04/02/190438.html#Feedback0http://m.tkk7.com/relax/comments/commentRss/190438.htmlhttp://m.tkk7.com/relax/services/trackbacks/190438.htmlJava虚拟机默认分?4M内存Q如果你的应用比较大Q超?4M内存QJava虚拟机就会抛出OutOfMemoryErrorQƈ停止q行。不是什么应用(Web应用、Application{)Q只需要修改你的机器上的运行Java命oQ在java xxx命o中添?Xms(最用内??XmxQ最大用内存)卛_解决。当Ӟq儿的内存容量都是指物理内存Q不能超Z的机器的物理内存的d量?/font>

一、Ant使用中的OutOfMemoryError解决Q?/font>

C的Ant的安装目录,在bin子目录中扑ֈant.batQ用文字编辑器打开Q修?runAnt处的允许命oQ添加如下参敎ͼ

:runAnt
"%_JAVACMD%" -Xms128m -Xmx512m -classpath ……

如果你安装了JikeQ用Jike~译器,则需要修?runAntWithJikes处的q行命oQ同上?/font>

二、tomcat中的内存溢出优化

安装版的Q?/font>

讄的java选项卡有啦?/p>

 

非安装版的:

打开~辑catalina.batQ在文g开头处增加如下参数Q?/font>

set JAVA_OPTS=-Xms128m -Xmx512m


转自:http://blog.csdn.net/zzr173/archive/2006/12/11/1438691.aspx



L 2008-04-02 19:30 发表评论
]]>
关于提高自己JAVA水^的十大技术讨?/title><link>http://m.tkk7.com/relax/archive/2007/12/21/169224.html</link><dc:creator>L</dc:creator><author>L</author><pubDate>Fri, 21 Dec 2007 01:36:00 GMT</pubDate><guid>http://m.tkk7.com/relax/archive/2007/12/21/169224.html</guid><wfw:comment>http://m.tkk7.com/relax/comments/169224.html</wfw:comment><comments>http://m.tkk7.com/relax/archive/2007/12/21/169224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/relax/comments/commentRss/169224.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/relax/services/trackbacks/169224.html</trackback:ping><description><![CDATA[ 本文列出了当今计机软g开发和应用领域最重要十种关键 <p><nobr><strong class="kgb" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BbACgHRZrR4CiIpDE6wORqaVXjL-ZNcCwgIcFwI23AaDRGRABGAEgrYXQDSgUOABQ5-Cz9ARgndnQgZQFqgEKMjAwMDAzNjEyN7IBDW5ld3MuY3Nkbi5uZXTIAQHaAStodHRwOi8vbmV3cy5jc2RuLm5ldC9uLzIwMDcxMjIwLzExMTkyNy5odG1sgAIByAL8iYoDqAMB6AO3AvUDAAQAAA&num=1&adurl=http://www.asus.com.cn/EVENT/2007/1026F8/&client=ca-pub-5186439242807756");GgKwClickStat("技?,"www.asus.com.cn","afc","2000036127");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u6280_u672F"' onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u6280_u672F";KeyGate_ads.ShowGgAds(this,"_u6280_u672F",event)' style="border: 0px none ; margin: 0px; padding: 0px; color: #0000ff; font-weight: normal; text-decoration: underline;">技?/strong></nobr>排名Q如果你想保证你现在以及未来的几q不׃Q那么你最好跟上这些技术的发展。虽然你不必对这十种技术样L通,但至应该对它们非常熟悉?/p> <p> <strong> 一、XML</strong></p> <p>  在十U技术中Q最重要的一U技术我惛_该非XML莫属。这里不仅仅指XML规范本nQ还包括一pd有关的基于XML的语aQ主要有XHTMLQ? XSLTQXSLQDTDsQXML Schema(XSD)QXPathQXQuery和SOAP.如果你现在还对XML一无所知,那么赶快狂补吧。XML是包含类gHTML标签的一个文 本文Ӟ在这个文件中定义了一个树型结构来描述它所保存?nobr><strong class="kgb" onclick='javascript:window.open("http://s4.17luntan.com/ClickPortal/WebClick.aspx?id=-100850&k=%u6570%u636E&siteid=0098295a-e262-40f7-ae50-7a6fbbdb678b&url=http%3A//news.csdn.net/n/20071220/111927.html&gourl=http%3A//ibm.csdn.net/ISN_J.aspx%3Faction%3DJMP%26pointid%3D2488&parm=78041F5FDC78F73FFC82FDA498786D500E8C3D164E60120E&alliedsiteid=0");' onmouseout="isShowAds = false;isShowAds2 = false" onmouseover='isShowAds = true;isShowAds2 = true;KeyGate_ads.Move(this,"","%u4E00%u4E2A%u771F%u6B63%u7684%u591A%u4EFB%u52A1%u7CFB%u7EDF","-100850","数据","AIX%20V5.3%20%u7CFB%u7EDF%u7BA1%u7406","http%3A//ibm.csdn.net/ISN_J.aspx%3Faction%3DJMP%26pointid%3D2488", event)' style="border: 0px none ; color: #0000ff; font-weight: normal; text-decoration: underline;">数据</strong></nobr>?/p> <p>  XML最大的优点是你既可以在q个文本文g中存储结构化数据Q也可以在其中存储非l构化数据——也是_它能包含和描q?_糙?文档数据Q就象它描述"规则?表格数据一栗?/p> <p>  XHTML是目前编写HTML的首选方?因ؓXHTML本n是格式良好的XMLQ与通常畸Ş的HTML文档相比Q?XHTML格式文档更容易处理?/p> <p>  XSLT和XSL是对XML文档q行转换的语a。它们可以将XML文档转换成各U格式,比如另一个文本文件、PDF文g、HTML文g、逗号分割的文Ӟ或者{换成其它的XML文档?/p> <p>  DTDs 和XML Schema用来描述XML文g所包含的数据内容的cdQ你不用编写定制的代码p对XML文档的内容进?有效?查,使内容强行遵守给出的规则?/p> <p>  XPath ?XQuery是查询语aQ用它们可以从XML文档中吸取单个的数据Ҏ者数据项列表。XQuery的功能特别强大,因ؓ它对XPath查询q行了扩展。实际上QXQuery和XML的关pd像SQL之于关系数据库一栗?/p> <p>  SOAP是Web services间进行通讯的标准协议。你不必知道SOAP协议的所有细节,但是你应该熟悉其常用规则及其工作原理Q这样你才能使用它?/p> <p> <strong> 二、Web Services</strong></p> <p>  Web<nobr><strong class="kgb" onclick='javascript:window.open("http://s4.17luntan.com/ClickPortal/WebClick.aspx?id=-100849&k=%u670D%u52A1&siteid=0098295a-e262-40f7-ae50-7a6fbbdb678b&url=http%3A//news.csdn.net/n/20071220/111927.html&gourl=http%3A//ibm.csdn.net/ISN_J.aspx%3Faction%3DJMP%26pointid%3D2473&parm=78041F5FDC78F73FFC82FDA498786D500E8C3D164E60120E&alliedsiteid=0");' onmouseout="isShowAds = false;isShowAds2 = false" onmouseover='isShowAds = true;isShowAds2 = true;KeyGate_ads.Move(this,"","%u4E00%u6B3E%u5F00%u6E90%u7684%u6027%u80FD%u6D4B%u8BD5%u5DE5%u5177","-100849","服务","%u5C06%20Ajax%20%u7528%u4E8E%u591A%u5A92%u4F53","http%3A//ibm.csdn.net/ISN_J.aspx%3Faction%3DJMP%26pointid%3D2473", event)' style="border: 0px none ; color: #0000ff; font-weight: normal; text-decoration: underline;">服务</strong></nobr>是XML 行后的直接产物。因为XML可以描述数据和对象,XML大纲可以保证XML文档数据的有效性,因ؓXML的基于文本的规范Q因而XML文档极其适合于作 ZU跨q_通讯标准的基本格式。如果你q没有接触过Web服务Q那么过不了多久你肯定会到它,所以必ȝl掌握Web服务Q最好是_N它Q因为它是迄 今ؓ止应用程序间跨不同种cL器、语a、^台和位置通讯的最单的一U方式。不你需不需要它QWeb服务都会是将来互用性的主要势?/p> <p>  XML工作l的John Bosak曾说q:"XML使得Java有事可做"Q那么,我们也可以说QWeb服务使得所有语a都有事可做。Web服务让运行在大型Z的COBOL应用E序与运行在手持讑֤上的应用E序怺沟?让Java应用与。NET<nobr><strong class="kgb" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BaKT_HRZrR4CiIpDE6wORqaVXj_qTLZ_H-fYDwI23AfDXHBATGBMgrYXQDSgUOABQ7pejEmCd2dCBlAWqAQoyMDAwMDM2MTI3sgENbmV3cy5jc2RuLm5ldMgBAdoBK2h0dHA6Ly9uZXdzLmNzZG4ubmV0L24vMjAwNzEyMjAvMTExOTI3Lmh0bWypAscbcxfeNoI-yALTg-EBqAMB6AO3AvUDAAQAAA&num=19&adurl=http://www.joysuccess.com/proList.aspx&client=ca-pub-5186439242807756");GgKwClickStat("服务?,"www.joysuccess.com","afc","2000036127");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u670D_u52A1_u5668"' onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u670D_u52A1_u5668";KeyGate_ads.ShowGgAds(this,"_u670D_u52A1_u5668",event)' style="border: 0px none ; margin: 0px; padding: 0px; color: #0000ff; font-weight: normal; text-decoration: underline;">服务?/strong></nobr>怺通讯Q让桌面应用与Web服务器进行无~交互,不但为商业数据处理,同时也ؓ商业功能提供了方便的实现——ƈ且这U实C语言、^台、和位置无关?/p> <p>  <strong>三、面向对象编E?/strong></p> <p>  许多E序员仍然认为OOP乃技术的象牙之塔Q但是细l想一下过dq里在面向对象领域里占据q统d位的开发语a之后Q你׃会这么认ZQ? OOP理念从Smalltalk开始,然后蔓g到C++和Pascal(Delphi)Q到Java成ؓ真正的主,几年之后QVB.NET ? C#的出现可以说是OOP发展Cd造极的地步。虽然用这些语a不必了解OOP的概念,但如果你~Z一些OOP的基本知识和ҎQ我想你很难在逐渐? 软的׃市场中找到工作?/p> <p><strong> 四、JavaQ?C++Q?C#Q?VB.NET</strong> </p> <p>  如果你热衷于技术,q且热爱~程Q那么我想你应该L玩{q些高语言Q我说的玩{q不一定要你成U编E高手。而是能看懂用q些语言~写? 代码卛_。如果你q有_֊用它们编码那更好了。其实这U机会甚。但是看代码的机会很多,学习~程的最有效的一U方式就是看源代码——浩如烟L源代? 中很多都不是用你所钟爱的开发语a~写的?/p> <p>  在过ȝ几年里,各个语言功能的发展基本上都差不多。现在你完全可以用VB.NET来写Windows服务、Web应用或者命令行E序。即使你 只用其中的一U语a写程序。我认ؓ也完全有必要学习另外一U语aQ自己能阅d理解它们现有的例子代码,q且能将一U语a~写的代码{换成你首选的~程 语言代码。这里列出的四种语言可谓是一个强大的开发语a工具,如果你掌握了它们Q毫无疑问你一定是一个众ZԒ慕的高手。这里我要声明一下:那就是我q没 有要忽略和排除其它的高语言Q如QFORTRAN、COBOL、APL、ADA、Perl和Lisp{等Q根据你所从事的领域不同,应该选择适合的语a 和工兗?/p> <p>  <strong>五、JavaScript</strong></p> <p>  Java 和JavaScript两者的名字管很类|但它们之间ƈ没有什么关pRؓ什么一U脚本语a会如此重要,以至于将它列入十U关键技术之一?仔细想一? q道了Q目前所有主的览器都使用JavaScript.如果你要~写Web应用E序Q那么JavaScript不可或缺。此外, JavaScriptq能作ؓ一U?nobr><strong class="kgb" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BAAJVHRZrR4CiIpDE6wORqaVXpeHNHpne-fQDwI23AcCaDBAEGAQgrYXQDSgUOABQuPTpKGCd2dCBlAWgAaugr_oDqgEKMjAwMDAzNjEyN7IBDW5ld3MuY3Nkbi5uZXTIAQHaAStodHRwOi8vbmV3cy5jc2RuLm5ldC9uLzIwMDcxMjIwLzExMTkyNy5odG1sgAIBqQLHG3MX3jaCPsgC7bnWAagDAegDtwL1AwAEAAA&num=4&adurl=http://www.shenmo.sh.cn/product/product-MAGMA.html&client=ca-pub-5186439242807756");GgKwClickStat("服务器端","www.shenmo.sh.cn","afc","2000036127");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u670D_u52A1_u5668_u7AEF"' onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u670D_u52A1_u5668_u7AEF";KeyGate_ads.ShowGgAds(this,"_u670D_u52A1_u5668_u7AEF",event)' style="border: 0px none ; margin: 0px; padding: 0px; color: #0000ff; font-weight: normal; text-decoration: underline;">服务器端</strong></nobr>? 脚本语言Q如它嵌入在ASP、ASP.NET中,或者嵌入XSLT来扩展功能。目前JavaScript在Mozilla/Netscape中是Ȁzd 于XUL界面的首选语aQ它zZActionScriptQ成为Flash MX应用的编E语a。还有就是JavaScript极有可能成ؓ未来新设备的脚本语言以及L应用的宏语言?/p> <p>  相比之下QVBScript虽然在微软的产品中得到很好的支持Q但从长q来看,没有q象表明它会有美好前途。微软自己都向于用 JavaScript(或者用由JavaScriptz的JScript)来编写其客户端脚本代码。因此,如果你要选择脚本语言Q非 JavaScript莫属?/p> <p> <strong> 六、Regular Expressions</strong></p> <p>  从所周知Q关pL据库的查询用SQLQ搜索XML文档用XPath 和XQueryQ而正则表辑ּ则用来搜索纯文本。例如,你可以用一个命令来查找或删除HTML格式文g中的注释内容。大安用过"IndexOf"? "InStr"以及"Like"q些内徏在JavaScript或VB中的文本搜烦函数Q这些函数虽然很Ҏ使用Q但是它们的功能却无法与正则表达式同? 而语——现在每一U主的开发语a都提供对正则表达式的存取。尽有为正则表辑ּ本n的读写艰涩难懂,但毕竟它的功能强大,使用它的领域也越来越多?/p> <p>  <strong>七、Design Patterns</strong></p> <p>  像OOP通过创徏和分cd象来化编E一P设计模式普通的对象交互分类成指定的模型Q这是一个从一般到具体的过E。OOP的成分用得多Q设计模式就昑־有用武之地。所以你必须理解它们Q跟上其M理论的发展?/p> <p> <strong> 八、Flash MX</strong></p> <p>  当你需要比HTML和CSS所能提供的更多的客L囑Ş和编E能力时QFlash是最佳选择。在Flash中编E比用Java应用或者。NET代码来得快得多,也容易得多?/p> <p>  在最新版本中(MX)QFlash不仅可以d和进行动L包,它还是个高度的可~程应用环境。具备强大的与SOAP Web服务沟通的能力Q可以调用运行在q端服务器上的ColdFusion、Java或。NET代码。可以说Flash几乎无处不在Q包括手持设备、置? 盒、甚x新的qx电脑Q你到处都可以见到它的n影,所以用它实际上可以扩展和延你的应用E序使用领域?/p> <p><strong> 九、Linux/Windows</strong> </p> <p>  q是当今PCs?nobr><strong class="kgb" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=B9pIRHRZrR4CiIpDE6wORqaVXuarQMI3Ru_8DwI23AdDZERAJGAkgrYXQDSgUOABQrc7vFWCd2dCBlAWqAQoyMDAwMDM2MTI3sgENbmV3cy5jc2RuLm5ldMgBAdoBK2h0dHA6Ly9uZXdzLmNzZG4ubmV0L24vMjAwNzEyMjAvMTExOTI3Lmh0bWypAscbcxfeNoI-yALF6uMDqAMB6AO3AvUDAAQAAA&num=9&adurl=http://www.hunter2006.com/pcmonitor.htm&client=ca-pub-5186439242807756");GgKwClickStat("操作pȝ","www.hunter2006.com","afc","2000036127");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u64CD_u4F5C_u7CFB_u7EDF"' onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u64CD_u4F5C_u7CFB_u7EDF";KeyGate_ads.ShowGgAds(this,"_u64CD_u4F5C_u7CFB_u7EDF",event)' style="border: 0px none ; margin: 0px; padding: 0px; color: #0000ff; font-weight: normal; text-decoration: underline;">操作pȝ</strong></nobr>? 两大阵容Q如果你惛_计算业里P׃定要熟悉它们。对于LinuxQ最好能自己安装Q配|,下蝲它的囑Ş用户界面以及一些应用程序。自己安? Apacheq会~写Web应用E序。要清醒地认识到q个世界除了Windows之外Q还有Linux的存在。ƈ且这U局面将会长期存在。反q来Q如果你 是一个死忠的Linux开发者,不要再l对Windows的憎Ӟ要相互学习,取长补短Q看看Windows有什么好的东东可以采U뀂记? Windows仍然是桌面之王?/p> <p>  谁也说不准你们公总么时候会军_从Linux转向WindowsQ或者从Windows转向Linux.谁也说不准什么时候你会蟩槽跑到另? 一个用不同^台的公司上班——或者即便不xQ也有可能在不同q_上开始另外一个杀手目——所以最好在每个q_上都U篏一些经验,而不要在一|? 吊死?/p> <p><strong>  十、SQL</strong></p> <p>  管SQL在当今众多的技术中已不是什么新东西Q而且在未来的十年里它的作用很有可能被削弱Q甚x个被淘汰Q但它仍然是一U基本技能——别? 它是一U基本技能,至今仍有许多开发h员不懂什么是SQL或对它了解不多。不要指望基于图形用L面的SQL构造器会帮你的忙,q是自己亲手写SQL查询 吧,定你掌握了SQL的基本语法。现在理解了SQLQ不仅对以后学习XQuery有所裨益Q而且可以使你很快扑ֈ化或改进当前开发项目的途径?/p> <p>  <strong>֣Q培d技术的好奇?/strong></p> <p>  其实Q不技术的发展势如何Q每个h最重要的一个技能是好奇心。敢于面Ҏ战,在你目前或未来的工作中,新语a或新技术可能很重要Q也可能? 怎么重要Q你所学习的东西ƈ不一定非要针对你的工作。不要怕失败,M新的技术对初学者来说都是困隄。大多数的失败都可以归咎于本w急功q利Q希望? 成。俗话说——千里之行,始于下Q应该脚t实圎ͼ一步一个脚印地往前走。不要让旉来左右你行动Q而是要利用时间来x、研I、测试新的开发技术和? 兗?br /> </p> <p><br /> </p> <p>注:以上内容来自|络Q本Z承担Mq带责Q</p> <p>转自Q赛q网</p> <img src ="http://m.tkk7.com/relax/aggbug/169224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/relax/" target="_blank">L</a> 2007-12-21 09:36 <a href="http://m.tkk7.com/relax/archive/2007/12/21/169224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java开发者的十大戒律 http://m.tkk7.com/relax/archive/2007/12/21/169217.htmlLLFri, 21 Dec 2007 01:23:00 GMThttp://m.tkk7.com/relax/archive/2007/12/21/169217.htmlhttp://m.tkk7.com/relax/comments/169217.htmlhttp://m.tkk7.com/relax/archive/2007/12/21/169217.html#Feedback0http://m.tkk7.com/relax/comments/commentRss/169217.htmlhttp://m.tkk7.com/relax/services/trackbacks/169217.html

有许多标准和实践准则可适用于Java开发者,但此处要说的Q是每个Java开发者需坚守的基本原则?/p>

  一、ؓ代码加注?/strong>。虽然每个h都知道这点,但有时却不自觉忘了行,今天?#8220;忘了”加注释了?虽然注释?E序的功能没什?#8220;贡献”Q但q一D?strong style="border: 0px none ; margin: 0px; padding: 0px; font-weight: normal; color: #0000ff; text-decoration: underline;">旉Q? 比如说两星期之后或者更长,回过头来看看自己的代码,说不定已l记不住它是q什么的了。如果这些代码是你个人的Q那q算是走q了Q不q的是,当然了,大多 数时候都是别人的不幸Q很多时候大安是在为公司写代码Q写代码的h也许早已l离开了公司,但别忘了一句古话,有来有往嘛,Z人,也ؓ我们自己Q请Z 的代码加上注释?

  二、不要让事情复杂?/strong>?strong style="border: 0px none ; margin: 0px; padding: 0px; font-weight: normal; color: #0000ff; text-decoration: underline;">E序?/strong>有时候L?strong style="border: 0px none ; font-weight: normal; color: #0000ff; text-decoration: underline;">?/strong>问题惛_复杂?strong style="border: 0px none ; font-weight: normal; color: #0000ff; text-decoration: underline;">解决ҎQ? 比如_在只有五个用LE序中引入EJB、对E序实现了ƈ不需要的框架(framework)Q之cȝq有属性文件、面向对象解x案、多U程{等。ؓ 什么要q样做呢?也许我们q不知道是否q样会更好,但这样做也许可以学到一些新东西Q或者让自己更感兴趣一些。如果是不知道ؓ什么这样做Q徏议多hl验 丰富的程序员Q如果是Z个h的目的,ȝ让自己更专业一炏V?

  三、始l牢?/strong>—?#8220;即是好(Less is more)q不L对的”。代码效率虽然很重要Q但在许多解x案中Q编写更的代码q不能改善这些代码的效率Q请看下面这个简单的例子Q?

      if(newStatusCode.equals("SD") && (sellOffDate == null ||
todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null &&
todayDate.compareTo(lastUsedDate)>0)) ||
(newStatusCode.equals("OBS") && (OBSDate == null ||
todayDate.compareTo(OBSDate)<0))){
newStatusCode = "NYP";
}

  能看明白if条g语句是干什么的?能想出来是谁写的q段代码?如果把它分成两段独立的if语句Q是不是更容易理解呢Q下面是修改后的代码Q?

      if(newStatusCode.equals("SD") && (sellOffDate == null ||
todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null &&
todayDate.compareTo(lastUsedDate)>0))){
newStatusCode = "NYP";
}else
if(newStatusCode.equals("OBS") && (OBSDate == null ||
todayDate.compareTo(OBSDate)<0))
{
newStatusCode = "NYP";
}

  是不是读hҎ多了呢,在此只是多加了一个if和两个花括号Q但代码的可L与可理解性就一下子提高了一大截?

  四、请不要编?/strong>。开发者经常有?#8220;忘记”或忽略掉q点Q因为有些时候开发日E逼得实在太紧。其实,多写一行定义静态变量的代码能花多少旉?

      public class A {
public static final String S_CONSTANT_ABC = "ABC";
public boolean methodA(String sParam1){
if (A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1)){
return true;
}
return false;
}
}

  现在Q每ơ需要将“ABC”与其他变量进行比较时Q不必记住实际代码,直接引用A.S_CONSTANT_ABCp了,而且在今后需要进行修ҎQ也可在一处修改,不会遍整个源代码逐个修改了?

  五、不?#8220;创?#8221;自己的框?framework)?/strong>切来说Q有C千计的各U框架存在,而且大多数是开 源的Q这些框枉是优U的解x案,可用于日?strong style="border: 0px none ; margin: 0px; padding: 0px; font-weight: normal; color: #0000ff; text-decoration: underline;">E序开?/strong>中, 我们只需使用q些框架的最新版本就行了Q至表面上要跟上Ş势吧。被大家qؓ接受的最为明昄一个例子就是Struts了,q个开源web框架非常适合? 在基于web的应用程序中。是不是惛_发出自己的Struts呢,q是省点力气吧,回头看看W二条——不要让事情复杂化。另外,如果正在开发的E序只有3 个窗口,׃要用Struts了,对这U程序来_不需要那么多?#8220;控制”?

  六、不要用println及字W串q接。通常Z调试方便Q开发者喜Ƣ在可能的所有地斚w加上 System.out.printlnQ也许还会提醒自己回q头来再来删除,但有些时候,l常会忘了删除或者不愿意删除它们。既然?System.out.println是ؓ?strong style="border: 0px none ; margin: 0px; padding: 0px; font-weight: normal; color: #0000ff; text-decoration: underline;">试Q那么测试完之后Qؓ什么还要留着它们呢,因ؓ在删除时Q很可能会删除掉真正有用的代码,所以不能低?System.out.println危害啊,L下面的代码:

      public class BadCode {
public static void calculationWithPrint(){
double someValue = 0D;
for (int i = 0; i < 10000; i++) {
System.out.println(someValue = someValue + i);
}
}
public static void calculationWithOutPrint(){
double someValue = 0D;
for (int i = 0; i < 10000; i++) {
someValue = someValue + i;
}
}
public static void main(String [] n) {
BadCode.calculationWithPrint();
BadCode.calculationWithOutPrint();
}
}

  从测试中可以发现Q方法calculationWithOutPrint()执行用了0.001204U,作ؓҎQ方法calculationWithPrint()执行可是用了10.52U?

  要避免浪费CPU旉Q最好的Ҏ是引入像如下的包装方法:

      public class BadCode {
public static final int DEBUG_MODE = 1;
public static final int PRODUCTION_MODE = 2;
public static void calculationWithPrint(int logMode){
double someValue = 0D;
for (int i = 0; i < 10000; i++) {
someValue = someValue + i;
myPrintMethod(logMode, someValue);
}
}
public static void myPrintMethod(int logMode, double value) {
if (logMode > BadCode.DEBUG_MODE) { return; }
System.out.println(value);
}
public static void main(String [] n) {
BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE);
}
}

  另外Q字W串q接也是费CPU旉的一个大_L下面的示例代码:

      public static void concatenateStrings(String startingString) {
for (int i = 0; i < 20; i++) {
startingString = startingString + startingString;
}
}
public static void concatenateStringsUsingStringBuffer(String startingString) {
StringBuffer sb = new StringBuffer();
sb.append(startingString);
for (int i = 0; i < 20; i++) {
sb.append(sb.toString());
}
}

  在测试中可发玎ͼ使用StringBuffer的方法只用了0.01U执行完毕,而用连接的Ҏ则用?.08U,选择显而易见了?

  七、多xGUI(用户界面)?/strong>再三QGUI对商业客h_与程序的功能及效率同{重要,GUI是一 个成功程序的最基本部分Q而很多ITl理往往都没注意到GUI的重要性。在现实生活中,许多公司可能Z节省开支,没有雇用那些有着设计“用户友好”界面 丰富l验的网设计者,此时Java开发者只能依赖他们自w的HTML基本功及在此领域有限的知识,l果Q很多开发出来的E序都是“计算?/strong>友好”甚于“?户友?#8221;。很有开发者同时精?strong style="border: 0px none ; font-weight: normal; color: #0000ff; text-decoration: underline;">软g开?/strong>及GUI设计Q如果你在公?#8220;不幸”被分配负责程序界面,应该遵守下面三条原则:

  1?不要再发明一ơ轮子,即不做无用功。现有的E序可能会有cM的界面需求?

  2?先创Z个原型。这是非帔R要一步,用户一般想看到他们用的东西Q而且可以先利用这个原型征求用L意见Q再慢慢修改成用h要的样子?

  3?学会换位思考。换句话来说Q就是从用户的角度来审查E序的需求。D例来Ԍ一个汇ȝH口可以跨页或者不跨页Q作Z个Y件开发者,可能会們֐于不跨页Q因L单一些。但是,从用L角度来看Q可能不希望看到上百行数据都挤在同一上?

  八、文档需求不放松。每个商业需求都必须记录在案Q这可能听上d童话Q似乎在现实生活中很隑֮现。而我们要做的是,不管开发时间多紧迫Q不最l期限多临近Q对每个商业需求都必须记录在案?

  九、单元测试、单元测试、单元测?/strong>。关于什么是单元试的最好方法,在此不便l说Q只是强调,单元试一定要完成Q这也是~程中最基本的原则。当然了Q如果有人帮你做单元试自然是最好,如果没有Q就自己来做吧,当创Z个单元测试计划时Q请遵守以下三条最基本的原则:

  1?先于~写cM码之前编写单元测试?

  2?记录单元试中的代码注释?

  3?试所有执行关键功能的公有ҎQ这里不是指set和getҎQ除非它们是以自qҎ式执行set和getҎ?

  十、质量,而不是数?/strong>。有些时候因Z品问题、期限紧q、或一些预料之外的事情Q导致常怸能按时下班,但一般而言Q公怸会因为雇员经常加班而对之表扬和奖励Q公司只看重高质量的工作。如果遵守了前九条原则,你会发现自己写出的代码bug且可维护性高Q无形中质量提高了一大步?/p>

注:以上内容来自|络Q本Z承担Mq带责Q

文章转自Q?br />


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1956723



L 2007-12-21 09:23 发表评论
]]>
单元试利器 JUnit 4http://m.tkk7.com/relax/archive/2007/03/05/101945.htmlLLMon, 05 Mar 2007 08:15:00 GMThttp://m.tkk7.com/relax/archive/2007/03/05/101945.htmlhttp://m.tkk7.com/relax/comments/101945.htmlhttp://m.tkk7.com/relax/archive/2007/03/05/101945.html#Feedback0http://m.tkk7.com/relax/comments/commentRss/101945.htmlhttp://m.tkk7.com/relax/services/trackbacks/101945.html本文主要介绍了如何?JUnit 4 提供的各U功能开展有效的单元试Qƈ通过一个实例演CZ如何使用 Ant 执行自动化的单元试。本文假设读者对 Eclipse 下进?Java 开发有一定的l验Qƈ了解 Java 5 中的注解QannotationQ特性?/p>

引言

毋庸|疑Q程序员要对自己~写的代码负责,您不仅要保证它能通过~译Q正常地q行Q而且要满需求和设计预期的效果。单元测试正是验证代码行为是否满预期的有效手段之一。但不可否认Q做试是g很枯燥无的事情Q而一遍又一遍的试则更是让人生畏的工作。幸q的是,单元试工具 JUnit 使这一切变得简单艺术v来?/p>

JUnit ?Java C֌中知名度最高的单元试工具。它诞生?1997 q_?Erich Gamma ?Kent Beck 共同开发完成。其?Erich Gamma 是经典著作《设计模式:可复用面向对象Y件的基础》一书的作者之一Qƈ?Eclipse 中有很大的A献;Kent Beck 则是一位极限编E(XPQ方面的专家和先驱?/p>

麻雀虽小Q五脏俱全。JUnit 设计的非常小巧,但是功能却非常强大。Martin Fowler 如此评h JUnitQ在软g开发领域,从来没有如此少的代码vC如此重要的作用。它大大化了开发h员执行单元测试的隑ֺQ特别是 JUnit 4 使用 Java 5 中的注解QannotationQɋ试变得更加单?/p>



回页?/font>


JUnit 4 初体?/span>

在开始体?JUnit 4 之前Q我们需要以下Y件的支持Q?/p>

  • EclipseQ最为流行的 IDEQ它全面集成?JUnitQƈ从版?3.2 开始支?JUnit 4。当?JUnit q不依赖于Q?IDE。您可以?http://www.eclipse.org/ 上下载最新的 Eclipse 版本?
  • AntQ基?Java 的开源构建工P您可以在 http://ant.apache.org/ 上得到最新的版本和丰富的文档。Eclipse 中已l集成了 AntQ但是在撰写本文ӞEclipse 使用?Ant 版本较低Q必需 1.7 或者以上版本)Q不能很好的支持 JUnit 4?
  • JUnitQ它的官方网站是 http://www.junit.org/。您可以从上面获取关?JUnit 的最新消息。如果您和本文一样在 Eclipse 中?JUnitQ就不必再下载了?

首先为我们的体验新徏一?Java 工程 —?coolJUnit。现在需要做的是Q打开目 coolJUnit 的属性页 -> 选择“Java Build Path”子选项 -> 炚w“Add Library…”按?-> 在弹出的“Add Library”对话框中选择 JUnitQ?a >?Q,q在下一中选择版本 4.1 后点几ZFinish”按钮。这样便?JUnit 引入到当前项目库中了?/p>
? 为项目添?JUnit ?/b>
? 为项目添?JUnit ? src=
h?JDK 的版?/b>

JUnit 4.1 是基?Java 5 的升U版本,它用了 Tiger 中的很多新特性来化原有的使用方式。正因ؓ如此Q它q不能直接运行在 JDK1.4.x 版本上。如果您需要在 JDK1.4.x 版本使用 JUnit 的话Q请使用 3.8.1 版本?/p>

可以开始编写单元测试了吗?{等……,您打把单元试代码攑֜什么地方呢Q把它和被测试代码؜在一Pq显然会照成混ؕQ因为单元测试代码是不会出现在最l品中的。徏议您分别为单元测试代码与被测试代码创建单独的目录Qƈ保证试代码和被试代码使用相同的包名。这h保证了代码的分离Q同时还保证了查扄方便。遵照这条原则,我们在项?coolJUnit 根目录下d一个新目录 testsrcQƈ把它加入到项目源代码目录中(加入方式??Q?/p>
? 修改目源代码目?/b>
? 修改目源代码目? src=

现在我们得到了一?JUnit 的最佛_践:单元试代码和被试代码使用一L包,不同的目录?/p>

一切准备就l,一起开始体验如何?JUnit q行单元试吧。下面的例子来自W者的开发实践:工具c?WordDealUtil 中的静态方?wordFormat4DB 是专用于处理 Java 对象名称向数据库表名转换的方法(您可以在代码注释中可以得到更多详l的内容Q。下面是W一ơ编码完成后大致情ŞQ?/p>
package com.ai92.cooljunit;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 对名U、地址{字W串格式的内容进行格式检?
 * 或者格式化的工L
 * 
 * @author Ai92
 */
public class WordDealUtil {

	/**
	 * Java对象名称Q每个单词的头字母大写)按照
	 * 数据库命名的习惯q行格式?
	 * 格式化后的数据ؓ写字母Qƈ且用下划线分割命名单词
	 * 
	 * 例如QemployeeInfo l过格式化之后变?employee_info
	 * 
	 * @param name	Java对象名称
	 */
	public static String wordFormat4DB(String name){
		Pattern p = Pattern.compile("[A-Z]");
		Matcher m = p.matcher(name);
		StringBuffer sb = new StringBuffer();
		
		while(m.find()){
			m.appendReplacement(sb, "_"+m.group());
		}
		return m.appendTail(sb).toString().toLowerCase();
	}
}

它是否能按照预期的效果执行呢Q尝试ؓ它编?JUnit 单元试代码如下Q?/p>
package com.ai92.cooljunit;

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class TestWordDealUtil {
	//试wordFormat4DB正常q行的情?
	@Test public void wordFormat4DBNormal(){
		String target = "employeeInfo";
		String result = WordDealUtil.wordFormat4DB(target);
		
		assertEquals("employee_info", result);
	}
}

很普通的一个类嘛!试c?TestWordDealUtil 之所以用“Test”开_完全是ؓ了更好的区分试cM被测试类。测试方?wordFormat4DBNormal 调用执行被测试方?WordDealUtil.wordFormat4DBQ以判断q行l果是否辑ֈ设计预期的效果。需要注意的是,试Ҏ wordFormat4DBNormal 需要按照一定的规范书写Q?/p>

  1. 试Ҏ必须使用注解 org.junit.Test 修饰?
  2. 试Ҏ必须使用 public void 修饰Q而且不能带有M参数?

试Ҏ中要处理的字W串为“employeeInfo”,按照设计目的Q处理后的结果应该ؓ“employee_info”。assertEquals 是由 JUnit 提供的一pd判断试l果是否正确的静态断aҎQ位于类 org.junit.Assert 中)之一Q我们用它执行结?result 和预期值“employee_info”进行比较,来判断测试是否成功?/p>

看看q行l果如何。在试cM点击右键Q在弹出菜单中选择 Run As JUnit Test。运行结果如下图所C:


? JUnit q行成功界面
? JUnit q行成功界面

l色的进度条提示我们Q测试运行通过了。但现在宣布代码通过了单元测试还为时q早。记住:您的单元试代码不是用来证明您是对的Q而是Z证明您没有错。因此单元测试的范围要全面,比如对边界倹{正常倹{错误值得试Q对代码可能出现的问题要全面预测Q而这也正是需求分析、详l设计环节中要考虑的。显Ӟ我们的测试才刚刚开始,l箋补充一些对Ҏ情况的测试:

public class TestWordDealUtil {
	…?
	//试 null 时的处理情况
	@Test public void wordFormat4DBNull(){
		String target = null;
		String result = WordDealUtil.wordFormat4DB(target);
		
		assertNull(result);
	}
	
	//试I字W串的处理情?
	@Test public void wordFormat4DBEmpty(){
		String target = "";
		String result = WordDealUtil.wordFormat4DB(target);
		
		assertEquals("", result);
	}

	//试当首字母大写时的情况
	@Test public void wordFormat4DBegin(){
		String target = "EmployeeInfo";
		String result = WordDealUtil.wordFormat4DB(target);
		
		assertEquals("employee_info", result);
	}
	
	//试当尾字母为大写时的情?
	@Test public void wordFormat4DBEnd(){
		String target = "employeeInfoA";
		String result = WordDealUtil.wordFormat4DB(target);
		
		assertEquals("employee_info_a", result);
	}
	
	//试多个相连字母大写时的情况
	@Test public void wordFormat4DBTogether(){
		String target = "employeeAInfo";
		String result = WordDealUtil.wordFormat4DB(target);
		
		assertEquals("employee_a_info", result);
	}
}

再次q行试。很遗憾QJUnit q行界面提示我们有两个测试情冉|通过试Q?a >?Q——当首字母大写时得到的处理结果与预期的有偏差Q造成试p|QfailureQ;而当试?null 的处理结果时Q则直接抛出了异常——测试错误(errorQ。显Ӟ被测试代码中q没有对首字母大写和 null q两U特D情况进行处理,修改如下Q?/p>
//修改后的ҎwordFormat4DB
/**
	 * Java对象名称Q每个单词的头字母大写)按照
	 * 数据库命名的习惯q行格式?
	 * 格式化后的数据ؓ写字母Qƈ且用下划线分割命名单词
	 * 如果参数name为nullQ则q回null
	 * 
	 * 例如QemployeeInfo l过格式化之后变?employee_info
	 * 
	 * @param name Java对象名称
	 */
	public static String wordFormat4DB(String name){
		
		if(name == null){
			return null;
		}
		
		Pattern p = Pattern.compile("[A-Z]");
		Matcher m = p.matcher(name);
		StringBuffer sb = new StringBuffer();
		
		while(m.find()){
			if(m.start() != 0)
				m.appendReplacement(sb, ("_"+m.group()).toLowerCase());
		}
		return m.appendTail(sb).toString().toLowerCase();
	}


? JUnit q行p|界面
? JUnit q行p|界面

JUnit 测试失败的情况分ؓ两种Qfailure ?error。Failure 一般由单元试使用的断aҎ判断p|引vQ它表示在测试点发现了问题;?error 则是׃码异常引Pq是试目的之外的发玎ͼ它可能生于试代码本n的错误(试代码也是代码Q同h法保证完全没有缺PQ也可能是被试代码中的一个隐藏的bug?/p>
L讎ͼ

L记这一?JUnit 最佛_践:试M可能的错误。单元测试不是用来证明您是对的,而是Z证明您没有错?/p>

啊哈Q再ơ运行测试,l条又重现眼前。通过?WordDealUtil.wordFormat4DB 比较全面的单元测试,现在的代码已l比较稳定,可以作ؓ API 的一部分提供l其它模块用了?/p>

不知不觉中我们已l?JUnit 漂亮的完成了一ơ单元测试。可以体会到 JUnit 是多么轻量Q多么简单,Ҏ不需要花心思去研究Q这可以把更多的注意力攑֜更有意义的事情上——编写完整全面的单元试?/p>



回页?/font>


JUnit 深入

当然QJUnit 提供的功能决不仅仅如此简单,在接下来的内容中Q我们会看到 JUnit 中很多有用的Ҏ,掌握它们Ҏ灉|的编写单元测试代码非常有帮助?/p>

Fixture

何谓 FixtureQ它是指在执行一个或者多个测试方法时需要的一pd公共资源或者数据,例如试环境Q测试数据等{。在~写单元试的过E中Q您会发现在大部分的试Ҏ在进行真正的试之前都需要做大量的铺垫——ؓ设计准备 Fixture 而忙。这些铺垫过E占据的代码往往比真正测试的代码多得多,而且q个比率随着试的复杂程度的增加而递增。当多个试Ҏ都需要做同样的铺垫时Q重复代码的“坏味道”便在测试代码中弥O开来。这股“坏味道”会弄脏您的代码Q还会因为疏忽造成错误Q应该用一些手D|栚w它?/p>

JUnit 专门提供了设|公?Fixture 的方法,同一试cM的所有测试方法都可以q它来初始?Fixture 和注销 Fixture。和~写 JUnit 试Ҏ一P公共 Fixture 的设|也很简单,您只需要:

  1. 使用注解 org,junit.Before 修饰用于初始?Fixture 的方法?
  2. 使用注解 org.junit.After 修饰用于注销 Fixture 的方法?
  3. 保证q两U方法都使用 public void 修饰Q而且不能带有M参数?

遵@上面的三条原则,~写出的代码大体是这个样子:

//初始化FixtureҎ
@Before public void init(){……}

//注销FixtureҎ
@After public void destroy(){……}

q样Q在每一个测试方法执行之前,JUnit 会保?init Ҏ已经提前初始化测试环境,而当此测试方法执行完毕之后,JUnit 又会调用 destroy Ҏ注销试环境。注意是每一个测试方法的执行都会触发对公?Fixture 的设|,也就是说使用注解 Before 或?After 修饰的公?Fixture 讄Ҏ是方法别的Q?a >?Q。这样便可以保证各个独立的测试之间互不干扎ͼ以免其它试代码修改试环境或者测试数据媄响到其它试代码的准性?/p>
? ҎU别 Fixture 执行C意?/b>
? ҎU别 Fixture 执行C意? src=

可是Q这U?Fixture 讄方式q是引来了批评,因ؓ它效率低下,特别是在讄 Fixture 非常耗时的情况下Q例如设|数据库链接Q。而且对于不会发生变化的测试环境或者测试数据来_是不会媄响到试Ҏ的执行结果的Q也没有必要针Ҏ一个测试方法重新设|一?Fixture。因此在 JUnit 4 中引入了cȝ别的 Fixture 讄ҎQ编写规范如下:

  1. 使用注解 org,junit.BeforeClass 修饰用于初始?Fixture 的方法?
  2. 使用注解 org.junit.AfterClass 修饰用于注销 Fixture 的方法?
  3. 保证q两U方法都使用 public static void 修饰Q而且不能带有M参数?

cȝ别的 Fixture 仅会在测试类中所有测试方法执行之前执行初始化Qƈ在全部测试方法测试完毕之后执行注销ҎQ?a >?Q。代码范本如下:

//cȝ别Fixture初始化方?
@BeforeClass public static void dbInit(){……}
	
//cȝ别Fixture注销Ҏ
	@AfterClass public static void dbClose(){……}


? cȝ?Fixture 执行C意?/b>
? cȝ?Fixture 执行C意? src=

异常以及旉试

注解 org.junit.Test 中有两个非常有用的参敎ͼexpected ?timeout。参?expected 代表试Ҏ期望抛出指定的异常,如果q行试q没有抛个异常,?JUnit 会认个测试没有通过。这为验证被试Ҏ在错误的情况下是否会抛出预定的异常提供了便利。D例来_Ҏ supportDBChecker 用于查用户用的数据库版本是否在pȝ的支持的范围之内Q如果用户用了不被支持的数据库版本Q则会抛行时异常 UnsupportedDBVersionException。测试方?supportDBChecker 在数据库版本不支持时是否会抛出指定异常的单元试Ҏ大体如下Q?/p>
@Test(expected=UnsupportedDBVersionException.class)
	public void unsupportedDBCheck(){
		…?
}

注解 org.junit.Test 的另一个参?timeoutQ指定被试Ҏ被允许运行的最长时间应该是多少Q如果测试方法运行时间超q了指定的毫U数Q则JUnit认ؓ试p|。这个参数对于性能试有一定的帮助。例如,如果解析一份自定义?XML 文档p了多?1 U的旉Q就需要重新考虑 XML l构的设计,那单元测试方法可以这h写:

@Test(timeout=1000)
	public void selfXMLReader(){
		…?
}

忽略试Ҏ

JUnit 提供注解 org.junit.Ignore 用于暂时忽略某个试ҎQ因为有时候由于测试环境受限,q不能保证每一个测试方法都能正运行。例如下面的代码便表C由于没有了数据库链接,提示 JUnit 忽略试Ҏ unsupportedDBCheckQ?/p>
@ Ignore(“db is down?
@Test(expected=UnsupportedDBVersionException.class)
	public void unsupportedDBCheck(){
		…?
}

但是一定要心。注?org.junit.Ignore 只能用于暂时的忽略测试,如果需要永q忽略这些测试,一定要认被测试代码不再需要这些测试方法,以免忽略必要的测试点?/p>

试q行?/font>

又一个新概念出现了——测试运行器QJUnit 中所有的试Ҏ都是由它负责执行的。JUnit 为单元测试提供了默认的测试运行器Q但 JUnit q没有限制您必须使用默认的运行器。相反,您不仅可以定制自qq行器(所有的q行器都l承?org.junit.runner.RunnerQ,而且q可以ؓ每一个测试类指定使用某个具体的运行器。指定方法也很简单,使用注解 org.junit.runner.RunWith 在测试类上显式的声明要用的q行器即可:

@RunWith(CustomTestRunner.class)
public class TestWordDealUtil {
…?
}

显而易见,如果试cL有显式的声明使用哪一个测试运行器QJUnit 会启动默认的试q行器执行测试类Q比如上面提及的单元试代码Q。一般情况下Q默认测试运行器可以应对l大多数的单元测试要求;当?JUnit 提供的一些高U特性(例如卛_介绍的两个特性)或者针对特D需求定?JUnit 试方式Ӟ昑ּ的声明测试运行器必不可了?/p>

试套g

在实际项目中Q随着目q度的开展,单元试cM来多Q可是直到现在我们还只会一个一个的单独q行试c,q在实际目实践中肯定是不可行的。ؓ了解册个问题,JUnit 提供了一U批量运行测试类的方法,叫做试套g。这P每次需要验证系l功能正性时Q只执行一个或几个试套g便可以了。测试套件的写法非常单,您只需要遵循以下规则:

  1. 创徏一个空cM为测试套件的入口?
  2. 使用注解 org.junit.runner.RunWith ?org.junit.runners.Suite.SuiteClasses 修饰q个I类?
  3. ?org.junit.runners.Suite 作ؓ参数传入注解 RunWithQ以提示 JUnit 为此cM用套件运行器执行?
  4. 需要放入此试套g的测试类l成数组作ؓ注解 SuiteClasses 的参数?
  5. 保证q个I类使用 public 修饰Q而且存在公开的不带有M参数的构造函数?
package com.ai92.cooljunit;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
…?

/**
 * 扚w试 工具?中测试类
 * @author Ai92
 */
@RunWith(Suite.class)
@Suite.SuiteClasses({TestWordDealUtil.class})
public class RunAllUtilTestsSuite {
}

上例代码中,我们前文提到的试c?TestWordDealUtil 攑օ了测试套?RunAllUtilTestsSuite 中,?Eclipse 中运行测试套Ӟ可以看到试c?TestWordDealUtil 被调用执行了。测试套件中不仅可以包含基本的测试类Q而且可以包含其它的测试套Ӟq样可以很方便的分层理不同模块的单元测试代码。但是,您一定要保证试套g之间没有循环包含关系Q否则无的循环׃出现在您的面前……?/p>

参数化测?/font>

回顾一下我们在节?a >JUnit 初体?/font>”中丄实例。ؓ了保证单元测试的严}性,我们模拟了不同类型的字符串来试Ҏ的处理能力,为此我们~写大量的单元测试方法。可是这些测试方法都是大同小异:代码l构都是相同的,不同的仅仅是试数据和期望倹{有没有更好的方法将试Ҏ中相同的代码l构提取出来Q提高代码的重用度,减少复制_脓代码的烦|在以前的 JUnit 版本上,q没有好的解x法,而现在您可以使用 JUnit 提供的参数化试方式应对q个问题?/p>

参数化测试的~写E微有点ȝQ当然这是相对于 JUnit 中其它特性而言Q:

  1. 为准备用参数化试的测试类指定Ҏ的运行器 org.junit.runners.Parameterized?
  2. 为测试类声明几个变量Q分别用于存放期望值和试所用数据?
  3. 为测试类声明一个用注?org.junit.runners.Parameterized.Parameters 修饰的,q回gؓ java.util.Collection 的公共静态方法,q在此方法中初始化所有需要测试的参数寏V?
  4. 为测试类声明一个带有参数的公共构造函敎ͼq在其中为第二个环节中声明的几个变量赋倹{?
  5. ~写试ҎQ用定义的变量作ؓ参数q行试?

我们按照q个标准Q重新改造一番我们的单元试代码Q?/p>
package com.ai92.cooljunit;

import static org.junit.Assert.assertEquals;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class TestWordDealUtilWithParam {

		private String expected;
	
		private String target;
	
		@Parameters
		public static Collection words(){
	    		return Arrays.asList(new Object[][]{
	          	{"employee_info", "employeeInfo"},		//试一般的处理情况
	          	{null, null},							//试 null 时的处理情况
	          	{"", ""},								//试I字W串时的处理情况
	          	{"employee_info", "EmployeeInfo"},		//试当首字母大写时的情况
	          	{"employee_info_a", "employeeInfoA"},	//试当尾字母为大写时的情?
	          	{"employee_a_info", "employeeAInfo"}	//试多个相连字母大写时的情况
	    		});
		}
	
	 	/**
	 	* 参数化测试必ȝ构造函?
	 	* @param expected	期望的测试结果,对应参数集中的第一个参?
	 	* @param target	试数据Q对应参数集中的W二个参?
	 	*/
		public TestWordDealUtilWithParam(String expected , String target){
			this.expected = expected;
			this.target = target;
		}
	
	 	/**
	 	* 试?Java 对象名称到数据库名称的{?
	 	*/
		@Test public void wordFormat4DB(){
			assertEquals(expected, WordDealUtil.wordFormat4DB(target));
		}
}

很明显,代码瘦n了。在静态方?words 中,我们使用二维数组来构建测试所需要的参数列表Q其中每个数l中的元素的攄序q没有什么要求,只要和构造函C的顺序保持一致就可以了。现在如果再增加一U测试情况,只需要在静态方?words 中添加相应的数组卛_Q不再需要复制粘贴出一个新的方法出来了?/p>



回页?/font>


JUnit ?Ant

随着目的进展,目的规模在不断的膨胀Qؓ了保证项目的质量Q有计划的执行全面的单元试是非常有必要的。但单靠JUnit提供的测试套件很难胜任这工作,因ؓ目中单元测试类的个数在不停的增加,试套g却无法动态的识别新加入的单元试c,需要手动修Ҏ试套Ӟq是一个很Ҏ遗忘得步骤,E有疏忽׃影响全面单元试的覆盖率?/p>

当然解决的方法有多种多样Q其中将 JUnit 与构建利?Ant l合使用可以很简单的解决q个问题。Ant —?备受赞誉?Java 构徏工具。它凭借出色的易用性、^台无x以及对目自动试和自动部|的支持Q成Z多项目构E中不可或缺的独立工Pq已l成Z实上的标准。Ant 内置了对 JUnit 的支持,它提供了两个 TaskQjunit ?junitreportQ分别用于执?JUnit 单元试和生成测试结果报告。用这两个 Task ~写构徏脚本Q可以很单的完成每次全面单元试的Q务?

不过Q在使用 Ant q行 JUnit 之前Q您需要稍作一些配|。打开 Eclipse 首选项界面Q选择 Ant -> Runtime 首选项Q见?Q,?JUnit 4.1 ?JAR 文gd?Classpath Tab 中?Global Entries 讄w。记得检查一?Ant Home Entries 讄中?Ant 版本是否?1.7.0 之上Q如果不是请替换为最新版本的 Ant JAR 文g?/p>
? Ant Runtime 首选项
? Ant Runtime 首选项

剩下的工作就是要~写 Ant 构徏脚本 build.xml。虽然这个过E稍嫌繁琐,但这是一件一x逸的事情。现在我们就把前面编写的试用例都放|到 Ant 构徏脚本中执行,为项?coolJUnit 的构本添加一下内容:

<?xml version="1.0"?>
<!-- ============================================= 
     auto unittest task    
     ai92                                                                
     ========================================== -->
<project name="auto unittest task" default="junit and report" basedir=".">

		<property name="output folder" value="bin"/>

		<property name="src folder" value="src"/>
	
		<property name="test folder" value="testsrc"/>
	
		<property name="report folder" value="report" />

		<!-- - - - - - - - - - - - - - - - - - 
          target: test report folder init                      
         - - - - - - - - - - - - - - - - - -->
		<target name="test init">
			<mkdir dir="${report folder}"/>
		</target>
	
		<!-- - - - - - - - - - - - - - - - - - 
          target: compile                      
         - - - - - - - - - - - - - - - - - -->
		<target name="compile">
			<javac srcdir="${src folder}" destdir="${output folder}" />
			<echo>compilation complete!</echo>
		</target>

		<!-- - - - - - - - - - - - - - - - - - 
          target: compile test cases                      
         - - - - - - - - - - - - - - - - - -->
		<target name="test compile" depends="test init">
			<javac srcdir="${test folder}" destdir="${output folder}" />
			<echo>test compilation complete!</echo>
		</target>
	
		<target name="all compile" depends="compile, test compile">
		</target>
	
		<!-- ======================================== 
          target: auto test all test case and output report file                      
      	===================================== -->
		<target name="junit and report" depends="all compile">
			<junit printsummary="on" fork="true" showoutput="true">
				<classpath>
					<fileset dir="lib" includes="**/*.jar"/>
					<pathelement path="${output folder}"/>
				</classpath>
				<formatter type="xml" />
				<batchtest todir="${report folder}">
					<fileset dir="${output folder}">
						<include name="**/Test*.*" />
					</fileset>
				</batchtest>
			</junit>
			<junitreport todir="${report folder}">
				<fileset dir="${report folder}">
					<include name="TEST-*.xml" />
				</fileset>
				<report format="frames" todir="${report folder}" />
			</junitreport>
		</target>
</project>

Target junit report ?Ant 构徏脚本中的核心内容Q其?target 都是为它的执行提供前期服务。Task junit 会寻找输出目录下所有命名以“Test”开头的 class 文gQƈ执行它们。紧接着 Task junitreport 会将执行l果生成 HTML 格式的测试报告(?Q放|在“report folder”下?/p>

为整个项目的单元试cȝ定一U命名风根{不仅是Z区分cd的考虑Q这?Ant 扚w执行单元试也非常有帮助Q比如前面例子中的测试类都已“Test”打_而测试套件则以“Suite”结{?/p>
? junitreport 生成的测试报?/b>
? junitreport 生成的测试报? src=

现在执行一ơ全面的单元试变得非常单了Q只需要运行一?Ant 构徏脚本Q就可以走完所有流E,q能得到一份详的试报告。您可以?Ant 在线手册 中获得上面提及的每一?Ant 内置 task 的用细节?/p>



回页?/font>


ȝ

随着来多的开发h员开始认同ƈ接受极限~程QXPQ的思想Q单元测试的作用在Y件工E中变得来重要。本文旨在将最新的单元试工具 JUnit 4 介绍l您Q以及如何结?IDE Eclipse 和构建工?Ant 创徏自动化单元测试方案。ƈ且还期望您能够通过本文“感染”一些好的单元测试意识,因ؓ JUnit 本n仅仅是一份工兯已Q它的真正优势来自于它的思想和技术?/p>




回页?/font>


下蝲

描述 名字 大小 下蝲Ҏ
本文CZ代码 coolJUnit.zip 24 KB HTTP
关于下蝲Ҏ的信?/font>


参考资?

学习

获得产品和技?/b>



L 2007-03-05 16:15 发表评论
]]>
weblogic中文昄q解决办法http://m.tkk7.com/relax/archive/2007/03/05/101935.htmlLLMon, 05 Mar 2007 07:53:00 GMThttp://m.tkk7.com/relax/archive/2007/03/05/101935.htmlhttp://m.tkk7.com/relax/comments/101935.htmlhttp://m.tkk7.com/relax/archive/2007/03/05/101935.html#Feedback0http://m.tkk7.com/relax/comments/commentRss/101935.htmlhttp://m.tkk7.com/relax/services/trackbacks/101935.html 中文昄q解决办法Q?/span>

1Q?/span> ?/span> web.xml 里面加入

<context-param>

        <param-name>weblogic.httpd.inputCharset./*</param-name>

   <param-value>GB2312</param-value>

  </context-param>

2Q?/span> ?/span> weblogic.xml 里面加入

 

<jsp-descriptor>

   <jsp-param>

    <param-name>compileCommand</param-name>

       <param-value>javac</param-value>

  </jsp-param>

  <jsp-param>

    <param-name>compilerSupportsEncoding</param-name>

       <param-value>true</param-value>

  </jsp-param>

  <jsp-param>

    <param-name>encoding</param-name>

    <param-value>GB2312</param-value>

    </jsp-param>

  </jsp-descriptor>

 



L 2007-03-05 15:53 发表评论
]]>
澄清Java语言接口与承的本质 选择?psyl ?Blog http://m.tkk7.com/relax/archive/2006/03/07/34046.htmlLLTue, 07 Mar 2006 05:34:00 GMThttp://m.tkk7.com/relax/archive/2006/03/07/34046.htmlhttp://m.tkk7.com/relax/comments/34046.htmlhttp://m.tkk7.com/relax/archive/2006/03/07/34046.html#Feedback0http://m.tkk7.com/relax/comments/commentRss/34046.htmlhttp://m.tkk7.com/relax/services/trackbacks/34046.html大多Ch认ؓQ接口的意义在于替多重l承。众所周知Java没有c++那样多重l承的机Ӟ但是却能够实作多个接口。其实这样做是很牵强的,接口和承是完全不同的东西,接口没有能力代替多重l承Q也没有q个义务。接口的作用Q一a以蔽之,是标志cȝcdQtype of classQ。把不同cd的类归于不同的接口,可以更好的管理他们。OO的精髓,我以为,是对对象的抽象,最能体现这一点的是接口。ؓ什么我们讨计模式都只针对具备了抽象能力的语aQ比如c++、java、c#{)Q就是因计模式所研究的,实际上就是如何合理的L象。(cowboy的名a是“抽象就是抽d的部分”,看似调侃Q实乃至理)?BR>
  设计模式中最基础的是工厂模式QFactoryQ,在我最q的一个很单的应用中,我想量的让我的E序能够在多个数据库间移植,当然Q这涉及很多问题Q单是如何兼容不同DBMS的SQLp人头痛。我们不妨先把问题简单化Q只考虑如何q接不同的数据库?BR>
  假设我有很多个类Q分别是Mysql.java、SQLServer.java、Oracle.java、DB2.javaQ他们分别连接不同的数据库,l一q回一个Connection对象Qƈ且都有一个closeҎQ用于关闭连接。只需要针对你的DBMSQ选择不同的类Q就可以用了Q但是我的用户他会用什么数据库Q我不知道,我希望的是尽量少的修改代码,p满他的需要。我可以抽象如下接口Q?BR>
package org.bromon.test;
public interface DB
{
  java.sql.Connection openDB(String url,String user,String password);
  void close();


  q个接口只定义两个方法,没有M有实际意义的代码Q具体的代码由实作这个接口的cLl出Q比如Mysql.javaQ?BR>
Package org.bromon.test;
import java.sql.*;
public class Mysql implements DB
{
  private String url=”jdbc:mysql:localhost:3306/test?
  private String user=”root?
  private String password=”?
  private Connection conn;
  public Connection openDB(url,user,password)
  {
    //q接数据库的代码
  }

  public void close()
  {
    //关闭数据?BR>  }


  cM的当然还有Oracle.java{等Q接口DBl这些类归了个类Q在应用E序中我们这样定义对象:

  org.bromon.test.DB myDB;

  使用myDB来操作数据库Q就可以不用实际上我所使用的是哪个c,q就是所谓的“开-闭”原则。但是问题在于接口是不能实例化的QmyDB=new DB()Q这L代码是绝寚w误的Q我们只能myDB=new Mysql()或者myDB=new Oracle()。麻烦了Q我q是需要指定具体实例化的是哪个c,用了接口跟没用一栗所以我们需要一个工厂:

package org.bromon.test;
public class DBFactory
{
  public static DB Connection getConn()
  {
    Return(new Mysql());
  }


  所以实例化的代码变成:myDB=DBFactory.getConn()Q?BR>
  q就?3U模式中最基础的普通工?Factory)Q工厂类负责具体实例化哪个类Q而其他的E序逻辑都是针对DBq个接口q行操作Q这是“针Ҏ口编E”。责任都被推卸给工厂cMQ当然你也可以l定义工厂接口,l箋把责M抛,q就演变成抽象工?Abstract Factory)?BR>
  整个q程中接口不负责M具体操作Q其他的E序要连接数据库的话Q只需要构造一个DB对象OKQ而不工厂类如何变化。这是接口的意?---抽象?BR>
  l承的概念不用多_很好理解。ؓ什么要l承呢?因ؓ你想重用代码Q这l对不是理由Q承的意义也在于抽象,而不是代码重用。如果对象A有一个run()ҎQ对象B也想有这个方法,所以有人就Class B extends A。这是不l大脑的做法。如果在B中实例化一个AQ调用A的Run()ҎQ是不是可以辑ֈ同样的目的?如下Q?BR>
Class B
{
  A a=new A();
  a.run();


  q就是利用类的聚合来重用代码Q是委派模式的雏形,是GoF一贯倡导的做法?BR>
  那么l承的意义何在?其实q是历史原因造成的,最开始的OO语言只有l承Q没有接口,所以只能以l承来实现抽象,请一定注意,l承的本意在于抽象,而非代码重用Q虽然承也有这个作用)Q这是很多Java烂书最严重的错误之一Q它们所造成的阴影,我至今还没有完全摆脱Q坏书害人啊Q尤其是入门cȝQ流毒太大。什么时候应该用承?只在抽象cM使用Q其他情况下量不用。抽象类也是不能实例化的Q它仅仅提供一个模版而已Q这很能说明问题?BR>
  软g开发的万恶之源Q一是重复代码而不是重用代码,二是烂用l承Q尤以c++E序员ؓ甚。Java中取~多重承,目的是制止烂用l承Q实是非常明智的做法Q不q很多h都不理解。Java能够更好的体现设计,q是让我入迷的原因之一.



L 2006-03-07 13:34 发表评论
]]>
weblogic和mq的集?/title><link>http://m.tkk7.com/relax/archive/2006/03/07/34026.html</link><dc:creator>L</dc:creator><author>L</author><pubDate>Tue, 07 Mar 2006 03:51:00 GMT</pubDate><guid>http://m.tkk7.com/relax/archive/2006/03/07/34026.html</guid><wfw:comment>http://m.tkk7.com/relax/comments/34026.html</wfw:comment><comments>http://m.tkk7.com/relax/archive/2006/03/07/34026.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/relax/comments/commentRss/34026.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/relax/services/trackbacks/34026.html</trackback:ping><description><![CDATA[<span id="d9n91l9" class=postdetails><FONT size=2>weblogic:8.1 sp2 <BR>MQ:5.3 <BR><BR>摘要Q把weblogic 和MQ集成h是非常有价值的应用。本文讨Z用weblogic的Foreign JMS Server 配置JNDI,MDB配置Q用MQ提供?<BR>JMSADMIN配置MQ的jndi。也没有那么详细啦,q是需要读者自׃一番小的努力的?<BR><BR>关键词:jms,Weblogic foreign JMS Server,JNDI,JMSAdmin <BR><BR>开始: <BR>1、安装Weblogic 和MQQ废话)?<BR>2、配|JMSAdminQ就是在 mq安装目录下的 java/bin/目录里没有扩展名的的文gQ?<BR>uncomment下面两行Q同时在你的机器上徏相应的目录C:/JNDI-Directory <BR><BR><BR></FONT></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="lfxd9d9" class=genmed><B><FONT size=2>java代码: </FONT></B></SPAN></TD></TR> <TR> <TD class=code> <DIV style="FONT-FAMILY: 'Courier New', Courier, monospace"><BR><BR><BR>INITIAL_CONTEXT_FACTORY=com.<SPAN style="COLOR: #000000">sun</SPAN>.<SPAN style="COLOR: #000000">jndi</SPAN>.<SPAN style="COLOR: #000000">fscontext</SPAN>.<SPAN style="COLOR: #000000">RefFSContextFactory</SPAN> <BR><BR>PROVIDER_URL=file:/C:/JNDI-Directory    <BR></DIV><BR></TD></TR></TBODY></TABLE><span id="r9jf1bn" class=postbody><BR><BR><BR><FONT size=2>以上配置适用于用文件jndi?<BR>3、配|mq的jndi <BR>下面使用jmsadmin配置mq的jndi?<BR>下面是用jmsadmin的一些命令的例子?<BR>其实你可以去ibm的网站上面下载图形界面的东东Q就不用记这些命令啦?<BR>q个东东叫:JMSADMINGUI <BR><BR><BR></FONT></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="jl7zv91" class=genmed><B><FONT size=2>java代码: </FONT></B></SPAN></TD></TR> <TR> <TD class=code> <DIV style="FONT-FAMILY: 'Courier New', Courier, monospace"><BR><BR><BR>def qcf<SPAN style="COLOR: #000000">(</SPAN>ivtQCF<SPAN style="COLOR: #000000">)</SPAN> <BR>def q<SPAN style="COLOR: #000000">(</SPAN>ivtQ<SPAN style="COLOR: #000000">)</SPAN> qu<SPAN style="COLOR: #000000">(</SPAN>SYSTEM.<SPAN style="COLOR: #000000">DEFAULT</SPAN>.<SPAN style="COLOR: #000000">LOCAL</SPAN>.<SPAN style="COLOR: #000000">QUEUE</SPAN><SPAN style="COLOR: #000000">)</SPAN> <BR>def tcf<SPAN style="COLOR: #000000">(</SPAN>ivtTCF<SPAN style="COLOR: #000000">)</SPAN> <BR>def t<SPAN style="COLOR: #000000">(</SPAN>ivtT<SPAN style="COLOR: #000000">)</SPAN> topic<SPAN style="COLOR: #000000">(</SPAN>MQJMS/PSIVT/Information<SPAN style="COLOR: #000000">)</SPAN> <BR></DIV><BR></TD></TR></TBODY></TABLE><span id="jnzt7zl" class=postbody><BR><BR><BR><BR><FONT size=2>或者你可以执行IVTSETUP脚本来完成一个可以用的JNDI配置?<BR><BR>4、配|Weblogic的Foreign JMSServer以下属性进行配|: <BR></FONT></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="799blxn" class=genmed><B><FONT size=2>java代码: </FONT></B></SPAN></TD></TR> <TR> <TD class=code> <DIV style="FONT-FAMILY: 'Courier New', Courier, monospace"><BR><BR>JNDI Initial <SPAN style="COLOR: #aaaadd" ?>Context</SPAN> Factory->com.<SPAN style="COLOR: #000000">sun</SPAN>.<SPAN style="COLOR: #000000">jndi</SPAN>.<SPAN style="COLOR: #000000">fscontext</SPAN>.<SPAN style="COLOR: #000000">RefFSContextFactory</SPAN> <BR>JNDI <SPAN style="COLOR: #aaaadd" ?>Connection</SPAN> URL->file:/C:/JNDI-Directory      <BR></DIV><BR></TD></TR></TBODY></TABLE><span id="v9999xv" class=postbody><BR><BR><FONT size=2>5、配|Foreign JMS Connection Factories <BR><BR>代码: <BR></FONT></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="79tnhzx" class=genmed><B><FONT size=2>java代码: </FONT></B></SPAN></TD></TR> <TR> <TD class=code> <DIV style="FONT-FAMILY: 'Courier New', Courier, monospace"><BR><BR>Local JNDI <SPAN style="COLOR: #aaaadd" ?>Name</SPAN>:mqqcf<SPAN style="COLOR: #000000">(</SPAN>在weblogic 中用的QueueConnectionFactory的JNDI的名?SPAN style="COLOR: #000000">)</SPAN> <BR><SPAN style="COLOR: #aaaadd" ?>Remote</SPAN> JNDI <SPAN style="COLOR: #aaaadd" ?>Name</SPAN>:ivtQCF<SPAN style="COLOR: #000000">(</SPAN>已经在通过jmsadmin配置º玫Äjndi的名?SPAN style="COLOR: #000000">)</SPAN> <BR></DIV><BR></TD></TR></TBODY></TABLE><span id="7xh979d" class=postbody><BR><BR><FONT size=2>6、配|foreign JMS destination <BR><BR></FONT></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="b9hdfvt" class=genmed><B><FONT size=2>java代码: </FONT></B></SPAN></TD></TR> <TR> <TD class=code> <DIV style="FONT-FAMILY: 'Courier New', Courier, monospace"><BR><BR><BR>Local JNDI <SPAN style="COLOR: #aaaadd" ?>Name</SPAN>: MQQUEUE <BR><SPAN style="COLOR: #aaaadd" ?>Remote</SPAN> JNDI <SPAN style="COLOR: #aaaadd" ?>Name</SPAN>: ivtQ <BR>        <BR></DIV><BR></TD></TR></TBODY></TABLE><span id="xht9jbp" class=postbody><BR><BR><FONT size=2>同上?<BR>7、MDB配置 <BR><BR><BR><BR></FONT></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="lnjfbj9" class=genmed><B><FONT size=2>java代码: </FONT></B></SPAN></TD></TR> <TR> <TD class=code> <DIV style="FONT-FAMILY: 'Courier New', Courier, monospace"><BR><BR><BR><?xml version="<SPAN style="COLOR: #000000" ?>1</SPAN>.<SPAN style="COLOR: #000000" ?>0</SPAN>"?> <BR><!DOCTYPE ejb-jar <SPAN style="FONT-WEIGHT: bold; COLOR: #990066" ?>PUBLIC</SPAN> "-<SPAN style="COLOR: #6666ff">//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd"> </SPAN><BR><!-- This ejb-jar.<SPAN style="COLOR: #000000">xml</SPAN> file defines a message-driven bean called "SimpleMDB". <SPAN style="COLOR: #000000">It</SPAN> uses container-managed transactions, because "transaction-type" is "<SPAN style="COLOR: #aaaadd" ?>Container</SPAN>" and "trans-attribute" is "Required". --> <BR><ejb-jar> <BR>   <enterprise-beans> <BR>      <message-driven> <BR>         <ejb-name>ReceiveMessageMDB</ejb-name> <BR>         <ejb-<SPAN style="FONT-WEIGHT: bold; COLOR: #990066" ?>class</SPAN>>com.<SPAN style="COLOR: #000000">rm</SPAN>.<SPAN style="COLOR: #000000">mdb</SPAN>.<SPAN style="COLOR: #000000">ReceiveMessageBean</SPAN></ejb-<SPAN style="FONT-WEIGHT: bold; COLOR: #990066" ?>class</SPAN>> <BR>         <transaction-type><SPAN style="COLOR: #aaaadd" ?>Container</SPAN></transaction-type> <BR>         <message-driven-destination> <BR>         <!-- In WebLogic Server <SPAN style="COLOR: #000000" ?>6</SPAN>.<SPAN style="COLOR: #000000" ?>0</SPAN>, this next parameter is named "jms-destination-type" --> <BR>         <destination-type>javax.<SPAN style="COLOR: #000000">jms</SPAN>.<SPAN style="COLOR: #000000">Queue</SPAN></destination-type> <BR>         </message-driven-destination> <BR>      </message-driven> <BR>   </enterprise-beans> <BR>   <assembly-descriptor> <BR>      <container-transaction> <BR>         <method> <BR>            <ejb-name>ReceiveMessageMDB</ejb-name> <BR>            <method-name>*</method-name> <BR>         </method> <BR>         <trans-attribute>NotSupported</trans-attribute> <BR>      </container-transaction> <BR>   </assembly-descriptor> <BR></ejb-jar>        <BR></DIV><BR></TD></TR></TBODY></TABLE><span id="pz79pfj" class=postbody><BR><BR></SPAN> <TABLE cellSpacing=1 cellPadding=3 width="90%" align=center border=0> <TBODY> <TR> <TD><span id="7jbnzf9" class=genmed><B><FONT size=2>java代码: </FONT></B></SPAN></TD></TR> <TR> <TD class=code> <DIV style="FONT-FAMILY: 'Courier New', Courier, monospace"><BR><BR><?xml version="<SPAN style="COLOR: #000000" ?>1</SPAN>.<SPAN style="COLOR: #000000" ?>0</SPAN>" encoding="UTF-<SPAN style="COLOR: #000000" ?>8</SPAN>"?> <BR><!DOCTYPE weblogic-ejb-jar <SPAN style="FONT-WEIGHT: bold; COLOR: #990066" ?>PUBLIC</SPAN> <SPAN style="COLOR: #0000ff">'-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN'</SPAN> <SPAN style="COLOR: #0000ff">'http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd'</SPAN>> <BR><weblogic-ejb-jar> <BR><weblogic-enterprise-bean> <BR><ejb-name>ReceiveMessageMDB</ejb-name> <BR><message-driven-descriptor> <BR><pool> <BR><max-beans-in-free-pool><SPAN style="COLOR: #000000" ?>8</SPAN></max-beans-in-free-pool> <BR><initial-beans-in-free-pool><SPAN style="COLOR: #000000" ?>1</SPAN></initial-beans-in-free-pool> <BR></pool> <BR><destination-jndi-name>MQQUEUE</destination-jndi-name> <BR><initial-context-factory> weblogic.<SPAN style="COLOR: #000000">jndi</SPAN>.<SPAN style="COLOR: #000000">WLInitialContextFactory</SPAN> </initial-context-factory> <BR><provider-url>t3:<SPAN style="COLOR: #6666ff">//localhost:7001</provider-url> </SPAN><BR><connection-factory-jndi-name>MQQCF</connection-factory-jndi-name> <BR></message-driven-descriptor> <BR></weblogic-enterprise-bean> <BR></weblogic-ejb-jar> <BR>        <BR></DIV><BR></TD></TR></TBODY></TABLE><span id="9l77p1r" class=postbody><BR><BR><FONT size=2>注意Q?<BR>如果 ejb-jar.xml中的<trans-attribute>NotSupported</trans-attribute> <BR>为required则需要用XAQueueConnectionFactory.</FONT></SPAN> <img src ="http://m.tkk7.com/relax/aggbug/34026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/relax/" target="_blank">L</a> 2006-03-07 11:51 <a href="http://m.tkk7.com/relax/archive/2006/03/07/34026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB 2.0Q“本地”接口和“远E”接?/title><link>http://m.tkk7.com/relax/archive/2005/12/02/22267.html</link><dc:creator>L</dc:creator><author>L</author><pubDate>Fri, 02 Dec 2005 09:03:00 GMT</pubDate><guid>http://m.tkk7.com/relax/archive/2005/12/02/22267.html</guid><wfw:comment>http://m.tkk7.com/relax/comments/22267.html</wfw:comment><comments>http://m.tkk7.com/relax/archive/2005/12/02/22267.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://m.tkk7.com/relax/comments/commentRss/22267.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/relax/services/trackbacks/22267.html</trackback:ping><description><![CDATA[<STRONG>个新的接口可以你更有效地访问EJB。学习如何运用它们,以及何时q用它们?<BR xmlns:fo="http://www.w3.org/1999/XSL/Format"></STRONG><span id="jdx19p9" class=AboutAuthor xmlns:fo="http://www.w3.org/1999/XSL/Format">by Rudy Dahbura</SPAN> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>当前的EJB 2.0规范有新的接口功能,q在原先的EJB 1.1中是没有的。学习运用这些新的功能,它们可以使你更容易地、更有效地访问EJB?/FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>~点是什么呢Q你牺牲位|的独立性,但有时侯Q这U代h值得的。了解何时、如何运用新的功能对~写设计良好的EJB应用E序是至关重要的?/FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>EJB 1.1规范lEJB客户端提供了一个remote interface和一个remote home interface与EJB实例交互Q得C|的透明度。以cM的Ş式,EJB 2.0规范现在lEJB客户端提供了一个local interface和一个local home interface来与׃n同一个JVM的EJB实例交互?/FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>EJB remote interfaceQjavax.ejb.EJBObjectQ和remote home interfaceQjavax.ejb.EJBHomeQ在本质上是Java RMI接口。远E客Lq用接口和与Java RMI-IIOP兼容的参CEJBs通讯。参数和Ҏ的结果值在同一个容器中传递,或者跨|络传递到q程容器?/FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>q种~程模式lEJB客户端提供了一U访问EJBlg的方法,好像这些组件是本地的一栗然后,容器可以透明地处理网l通讯和执行其它功能。这U方法很适合_粒度的Qcoarse-grainedQ方法调用,其中客户端和EJBs之间的客L通讯保持到最限度?/FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>相反QEJB local interfaceQjavax.ejb.EJBLocalObjectQ和local home interfaceQjavax.ejb.EJBLocalHomeQ不是Java RMI接口Q它们是EJB 2.0的新功能。本地客L——如其它EJBsQ运用相同JVM中传递的参数直接与EJBs通讯。这U技术消除了|络潜在的问题、参数复制的问题以及需要与Java RMI-IIOP兼容的问题。也意味着QEJB客户端可以运用一个更轻量U的~程模式来访问服务。该Ҏ很适合l粒度的Qfine-grainedQ方法调用,因ؓ作ؓEJB实例的位于同一个JVM中的EJB客户端可以用本地接口来避免不必要的费用?/FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>引进本地客户端生的另一个显著的变化是cd的{换。所有的EJB实例在运用前必须转换到它们恰当的接口cdQ所以,有时侯,在运用远E客LӞ要保证Java RMI-IIOP的兼Ҏ,你必d转换EJB实例前运用java.rmi.PortableRemoteObject.narrow()来羃(narrowQ它?/FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>但本地客L可以直接把EJB实例转换成local home interfacecdQ如下面的代码片D: <TABLE bgColor=#ffffaa> <TBODY> <TR> <TD><FONT color=#0000cc><PRE>InitialContext initCtx = new InitialContext(); ExampleLocalHome exampleLocalHome = (ExampleLocalHome)initCtx.lookup("java:comp/ env/ejb/Example");</PRE></FONT></TD></TR></TBODY></TABLE></FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>从local home创徏了EJB实例Q? <TABLE bgColor=#ffffaa> <TBODY> <TR> <TD><FONT color=#0000cc><PRE>ExampleLocal exampleLocal = exampleLocalHome.create();</PRE></FONT></TD></TR></TBODY></TABLE></FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>也许EJB 2.0的最有趣、最Ҏ被忽视的一个方面就是session和entity beans可以同时q用q程和本地接口,q就l了你很大的灉|性。运用两U接口给了潜在的bean客户端最大程度的自由Q不它们是不是在一L?/FONT></P><BR xmlns:fo="http://www.w3.org/1999/XSL/Format"><?xml version="1.0" encoding="utf-16"?><BR xmlns:fo="http://www.w3.org/1999/XSL/Format"><span id="b9jfpf9" class=AboutAuthor xmlns:fo="http://www.w3.org/1999/XSL/Format"></SPAN> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black><session>?lt;entity>元素描述了session和entity bean的部|属性。EJB 1.1和EJB 2.0规范定义了两个元素,<home>?lt;remote>。(以前的规范需要两个元素,但它们在2.0版中是可选的Q。它们分别包含EJB remote home interface和remote interface的完全资格类名?</FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>cM圎ͼEJB 2.0规范定义了两个附加的元素Q?lt;local-home>?lt;local>。正如你预料的,它们包含EJB local home interface和local interface的完全资格类名。下面的代码昄了如何运用这些新元素Q? <TABLE bgColor=#ffffaa> <TBODY> <TR> <TD><FONT color=#0000cc><PRE><ejb-jar> <enterprise-beans> <session> <ejb-name>...</ejb-name> <local-home>...</local-home> <local>...</local> <ejb-link>...</ejb-link> ... </session> </enterprise-beans> <assembly-descriptor> ... </assembly-descriptor> </ejb-jar> </PRE></FONT></TD></TR></TBODY></TABLE></FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black><B><FONT color=#333399>聪明地访问本地客L的一个实?/FONT></B><BR>本地EJB客户端的概念在如<A href="">列表1</A>所C的例子中得C很好地阐明,其中昄了一个无状态session beanQ它的local interface和它的local home interface。注意,接口不扩展java.rmi.Remote?</FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>无状态session bean的XML部v描述如下面的代码所C,它也重点?lt;local>?lt;local-home>元素的运用: <TABLE bgColor=#ffffaa> <TBODY> <TR> <TD><FONT color=#0000cc><PRE><?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'> <ejb-jar> <enterprise-beans> <session> <ejb-name>Example</ejb-name> <local- home>com.acmecorp.ejb.ExampleLocalHome</ local-home> <local>com.acmecorp.ejb.ExampleLocal</local> <ejb- class>com.acmecorp.ejb.ExampleBean</ ejb-class> <session- type>Stateless</session-type> <transaction- type>Container</transaction-type> </session> </enterprise-beans> <assembly-descriptor> <method-permission> <unchecked/> <method> <ejb-name>Example</ejb-name> <method-name>*</method-name> </method> </method-permission> <container-transaction> <method> <ejb-name>Example</ejb-name> <method-name>*</method-name> </method> <trans- attribute>NotSupported</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar> </PRE></FONT></TD></TR></TBODY></TABLE></FONT></P><BR xmlns:fo="http://www.w3.org/1999/XSL/Format"><?xml version="1.0" encoding="utf-16"?><BR xmlns:fo="http://www.w3.org/1999/XSL/Format"><span id="rdxr991" class=AboutAuthor xmlns:fo="http://www.w3.org/1999/XSL/Format"></SPAN> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>然后Q一个本地的客户端创建ƈ讉K一个已l创建的enterprise bean的实例。下面的代码也显CZ如何转换一个bean的实例,而不用先~小它: <TABLE bgColor=#ffffaa> <TBODY> <TR> <TD><FONT color=#0000cc><PRE><%@ page errorPage="/error.jsp" import="javax.naming.*, com.acmecorp.ejb.*" %> <% InitialContext initCtx = new InitialContext(); ExampleLocalHome exampleLocalHome = (ExampleLocalHome)initCtx.lookup("java:comp/env/ ejb/Example"); ExampleLocal exampleLocal = exampleLocalHome.create(); %> <html> <head> <title>Default</title> <link rel="STYLESHEET" type="text/css" href="styles/default.css"> </head> <body> <pre class="code"><%= exampleLocal.getMessage() %></pre> </body> </html> </PRE></FONT></TD></TR></TBODY></TABLE></FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>在这个例子中Q本地客L是一个JSP面Q因此是一个Weblg。(在有些情况中Q当Weblg位于相同的JVM中时Q它们访问EJB 2.0本地lg接口。)</FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>最后是Weblg的部|描qͼ <TABLE bgColor=#ffffaa> <TBODY> <TR> <TD><FONT color=#0000cc><PRE><web-app> <!-- EJB Reference information --> <ejb-local-ref> <ejb-ref-name>ejb/Example< /ejb-ref-name> <ejb-ref-type>Session< /ejb-ref-type> <local-home>com.acmecorp.ejb.ExampleLocalHome< /local-home> <local>com.acmecorp.ejb.ExampleLocal< /local> <ejb-link>Example</ejb-link> </ejb-local-ref> </web-app> </PRE></FONT></TD></TR></TBODY></TABLE></FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>注意?lt;ejb-local-ref>元素来声明本地EJB引用。通过<ejb-link>元素得到一个明昄与EJB的链接。它的值必ȝ于EJB XML描述W中?lt;ejb-name>元素?/FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black><B><FONT color=#333399>未来会有更大的灵zL?</FONT></B><BR>目前q是公开草案的EJB 2.1规范问无状态session beans定义了一个Web services客户端。远E客L以一U位|独立的方式与无状态session beans通讯Q这U通讯主要q用SOAP 1.1通过HTTPq行ZXML的调用。因为XML、SOAP和HTTP是独立于语言的,所以客L不需要是Java对象Q可以是q行在不同^C的其它类型的对象?/FONT></P> <P xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=black>到那ӞEJB 2.0的新功能׃更受Java开发h员的Ƣ迎了,使他们能够创Z码,更有效地q用本地和远E接口。通过q用q些功能Qƈ对你的设计能力进行正的评估Q你可以创建应用程序,使它们最大限度地q用EJBs?/FONT></P><BR xmlns:fo="http://www.w3.org/1999/XSL/Format"><FONT color=#666666 xmlns:fo="http://www.w3.org/1999/XSL/Format"><I>关于作?</I></FONT><BR xmlns:fo="http://www.w3.org/1999/XSL/Format">Rudy Dahbura是位住在z杉矶的软gN。他在洛杉矶的Sierra Systems Group工作Q他q用分布式对象技术已l有五年了。他的联pL式是<A href="" target=_blank xmlns:fo="http://www.w3.org/1999/XSL/Format">rdahbura@sierrasystems.com</A>?BR xmlns:fo="http://www.w3.org/1999/XSL/Format"><img src ="http://m.tkk7.com/relax/aggbug/22267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/relax/" target="_blank">L</a> 2005-12-02 17:03 <a href="http://m.tkk7.com/relax/archive/2005/12/02/22267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一D利用管道的多线E程?/title><link>http://m.tkk7.com/relax/archive/2005/12/02/22184.html</link><dc:creator>L</dc:creator><author>L</author><pubDate>Fri, 02 Dec 2005 01:05:00 GMT</pubDate><guid>http://m.tkk7.com/relax/archive/2005/12/02/22184.html</guid><wfw:comment>http://m.tkk7.com/relax/comments/22184.html</wfw:comment><comments>http://m.tkk7.com/relax/archive/2005/12/02/22184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/relax/comments/commentRss/22184.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/relax/services/trackbacks/22184.html</trackback:ping><description><![CDATA[<P>import java.io.*;</P> <P>public class PipeIODemo1{<BR> public static void main(String[] args) throws IOException{<BR>  //创徏一个管道输出流对象<BR>  PipedWriter out=new PipedWriter();<BR>  <BR>  //创徏一个管道输入流对象<BR>  PipedReader in=new PipedReader();<BR>  //把管道输入流对象和管道输出流对象联接h<BR>  in.connect(out);<BR>  <BR>  //以上2个语句等效于<BR>  //PipedReader in=new PipedReader(out);<BR>  <BR>        OutThread objOut=new OutThread(out);<BR>  InThread objIn=new InThread(in);<BR>  objOut.start();<BR>  objIn.start();</P> <P>  try{<BR>   objOut.join();<BR>   objIn.join();<BR>  }catch (InterruptedException e){}</P> <P>        System.out.println();<BR>  System.out.println("Run Completed!!");<BR> }<BR>}</P> <P><BR>//定义一个写U程c?BR>class OutThread extends Thread{<BR> private Writer out;<BR> <BR> public OutThread(Writer out){<BR>  this.out=out;<BR> }<BR> <BR> public void run(){<BR>  try{<BR>   try{<BR>    for(char c='A'; c<='Z'; c++)<BR>     out.write(c);<BR>   }finally{<BR>    out.close();<BR>   }<BR>  }catch(IOException e){<BR>   getThreadGroup().uncaughtException(this, e);<BR>  }<BR> }<BR>}</P> <P>class InThread extends Thread{<BR> private Reader in;</P> <P> public InThread(Reader in){<BR>  this.in=in;<BR> }</P> <P> public void run(){<BR>  int ch;<BR>  try{<BR>   try{<BR>    while ((ch=in.read())!=-1)<BR>     System.out.print((char)ch);<BR>   }finally{<BR>    in.close();<BR>   }<BR>  }catch(IOException e){<BR>   getThreadGroup().uncaughtException(this, e);<BR>  }<BR> }<BR>}</P><img src ="http://m.tkk7.com/relax/aggbug/22184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/relax/" target="_blank">L</a> 2005-12-02 09:05 <a href="http://m.tkk7.com/relax/archive/2005/12/02/22184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hashtable和HashMap的区?/title><link>http://m.tkk7.com/relax/archive/2005/12/01/22126.html</link><dc:creator>L</dc:creator><author>L</author><pubDate>Thu, 01 Dec 2005 08:42:00 GMT</pubDate><guid>http://m.tkk7.com/relax/archive/2005/12/01/22126.html</guid><wfw:comment>http://m.tkk7.com/relax/comments/22126.html</wfw:comment><comments>http://m.tkk7.com/relax/archive/2005/12/01/22126.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/relax/comments/commentRss/22126.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/relax/services/trackbacks/22126.html</trackback:ping><description><![CDATA[1.Hashtable是Dictionary的子c,HashMap是Map接口的一个实现类Q?BR><BR>2.Hashtable中的Ҏ是同步的Q而HashMap中的Ҏ在缺省情况下是非同步的。即是说Q在多线E应用程序中Q不用专门的操作安全地可以使用Hashtable了;而对于HashMapQ则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解冻I<BR><B>Map Collections.synchronizedMap(Map m)</B><BR>q个Ҏq回一个同步的MapQ这个Map装了底层的HashMap的所有方法,使得底层的HashMap即是在多线E的环境中也是安全的?BR><BR>3.在HashMap中,null可以作ؓ键,q样的键只有一个;可以有一个或多个键所对应的gؓnull。当get()Ҏq回null值时Q即可以表示HashMap中没有该键,也可以表C键所对应的gؓnull。因此,在HashMap中不能由get()Ҏ来判断HashMap中是否存在某个键Q而应该用containsKey()Ҏ来判断?<BR><BR>4.其底层的实现机制不同Qhashmap的访问速度要快于hashtableQ因为它不需要进行同步检验,在非多线E环境中使用hashmap代替hashtable .<BR><!-- the post be hidden --><img src ="http://m.tkk7.com/relax/aggbug/22126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/relax/" target="_blank">L</a> 2005-12-01 16:42 <a href="http://m.tkk7.com/relax/archive/2005/12/01/22126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java正则表达式详?/title><link>http://m.tkk7.com/relax/archive/2005/11/29/21807.html</link><dc:creator>L</dc:creator><author>L</author><pubDate>Tue, 29 Nov 2005 04:30:00 GMT</pubDate><guid>http://m.tkk7.com/relax/archive/2005/11/29/21807.html</guid><wfw:comment>http://m.tkk7.com/relax/comments/21807.html</wfw:comment><comments>http://m.tkk7.com/relax/archive/2005/11/29/21807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/relax/comments/commentRss/21807.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/relax/services/trackbacks/21807.html</trackback:ping><description><![CDATA[<TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>如果你曾l用qPerl或Q何其他内建正则表辑ּ支持的语aQ你一定知道用正则表达式处理文本和匚w模式是多么简单。如果你不熟悉这个术语,那么“正则表辑ּ”(Regular ExpressionQ就是一个字W构成的Ԍ它定义了一个用来搜索匹配字W串的模式?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>许多语言Q包括Perl、PHP、Python、JavaScript和JScriptQ都支持用正则表辑ּ处理文本Q一些文本编辑器用正则表辑ּ实现高“搜?替换”功能。那么Java又怎样呢?本文写作Ӟ一个包含了用正则表辑ּq行文本处理的Java规范需求(Specification RequestQ已l得到认可,你可以期待在JDK的下一版本中看到它?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>然而,如果现在需要用正则表辑ּQ又该怎么办呢Q你可以从Apache.org下蝲源代码开攄Jakarta-ORO库。本文接下来的内容先要地介绍正则表达式的入门知识Q然后以Jakarta-ORO APIZ介绍如何使用正则表达式?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><B><FONT size=4>一、正则表辑ּ基础知识</FONT></B> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>我们先从单的开始。假设你要搜索一个包含字W“cat”的字符Ԍ搜烦用的正则表达式就是“cat”。如果搜索对大小写不敏感Q单词“catalog”、“Catherine”、“sophisticated”都可以匚w。也是_ </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_a[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><B>1.1 句点W号</B> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>假设你在玩英文拼字游戏,惌扑և三个字母的单词,而且q些单词必须以“t”字母开_以“n”字母结束。另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内宏V要构造出q个正则表达式,你可以用一个通配W——句点符号?”。这P完整的表辑ּ是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,q匹配“t#n”、“tpn”甚至“t n”,q有其他许多无意义的l合。这是因为句点符号匹配所有字W,包括I格、Tab字符甚至换行W: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_b[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><B>1.2 ҎL?/B> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>Z解决句点W号匚w范围q于q泛q一问题Q你可以在方括号Q“[]”)里面指定看来有意义的字符。此Ӟ只有Ҏ号里面指定的字符才参与匹配。也是_正则表达式“t[aeio]n”只匚w“tan”、“Ten”、“tin”和“ton”。但“Toon”不匚wQ因为在Ҏ号之内你只能匚w单个字符Q?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_c[1].jpg" border=0></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><B>1.3 “或”符?/B> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>如果除了上面匚w的所有单词之外,你还惌匚w“toon”,那么Q你可以使用“|”操作符。“|”操作符的基本意义就是“或”运。要匚w“toon”,使用“t(a|e|i|o|oo)n”正则表辑ּ。这里不能用方扩号Q因为方括号只允许匹配单个字W;q里必须使用圆括号?)”。圆括号q可以用来分l,具体请参见后面介l?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_d[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><B>1.4 表示匚wơ数的符?/B> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>表一昄了表C匹配次数的W号Q这些符L来确定紧靠该W号左边的符号出现的ơ数Q?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4n[1].jpg" border=0></P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>假设我们要在文本文g中搜索美国的C会安全L。这个号码的格式?99-99-9999。用来匹配它的正则表辑ּ如图一所C。在正则表达式中Q连字符Q?”)有着Ҏ的意义,它表CZ个范_比如??。因此,匚wC会安全L中的q字W号Ӟ它的前面要加上一个{义字W“\”?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4a[1].gif" border=0> </P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center>图一Q匹配所?23-12-1234形式的社会安全号?/P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>假设q行搜烦的时候,你希望连字符号可以出玎ͼ也可以不出现——即Q?99-99-9999?99999999都属于正的格式。这Ӟ你可以在q字W号后面加上“?”数量限定符P如图二所C: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4b[1].gif" border=0> </P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center>图二Q匹配所?23-12-1234?23121234形式的社会安全号?/P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>下面我们再来看另外一个例子。美国汽车牌照的一U格式是四个数字加上二个字母。它的正则表辑ּ前面是数字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。图三显CZ完整的正则表辑ּ?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4c[1].gif" border=0> </P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center>图三Q匹配典型的国汽R牌照LQ如8836KV</P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>1.5 “否”符?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>“^”符L为“否”符受如果用在方括号内,“^”表CZ惌匚w的字W。例如,囑֛的正则表辑ּ匚w所有单词,但以“X”字母开头的单词除外?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4d[1].gif" border=0> </P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center>囑֛Q匹配所有单词,但“X”开头的除外</P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>1.6 圆括号和I白W号 </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>假设要从格式为“June 26, 1951”的生日日期中提取出月䆾部分Q用来匹配该日期的正则表辑ּ可以如图五所C: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4e[1].gif" border=0> </P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center>图五Q匹配所有Moth DD,YYYY格式的日?/P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>新出现的“\s”符hI白W号Q匹配所有的I白字符Q包括Tab字符。如果字W串正确匚wQ接下来如何提取出月份部分呢Q只需在月份周围加上一个圆括号创徏一个组Q然后用ORO APIQ本文后面详l讨论)提取出它的倹{修改后的正则表辑ּ如图六所C: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4f[1].gif" border=0> </P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center>囑օQ匹配所有Month DD,YYYY格式的日期,定义月䆾gؓW一个组</P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><B>1.7 其它W号</B> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>为简便v见,你可以用一些ؓ常见正则表达式创建的快捷W号。如表二所C: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>表二Q常用符?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4o[1].jpg" border=0> </P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>例如Q在前面C会安全L的例子中Q所有出现“[0-9]”的地方我们都可以用“\d”。修改后的正则表辑ּ如图七所C: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4g[1].gif" border=0> </P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center>图七Q匹配所?23-12-1234格式的社会安全号?/P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><B><FONT size=4>二、Jakarta-ORO?/FONT></B> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>有许多源代码开攄正则表达式库可供JavaE序员用,而且它们中的许多支持Perl 5兼容的正则表辑ּ语法。我在这里选用的是Jakarta-ORO正则表达式库Q它是最全面的正则表辑ּAPI之一Q而且它与Perl 5正则表达式完全兼宏V另外,它也是优化得最好的API之一?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>Jakarta-ORO库以前叫做OROMatcherQDaniel Savarese大方地把它赠送给了Jakarta Project。你可以按照本文最后参考资源的说明下蝲它?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>我首先将要介l用Jakarta-ORO库时你必d建和讉K的对象,然后介绍如何使用Jakarta-ORO API?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><B>?PatternCompiler对象</B> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>首先Q创Z个Perl5Compilercȝ实例Qƈ把它赋值给PatternCompiler接口对象。Perl5Compiler是PatternCompiler接口的一个实玎ͼ允许你把正则表达式编译成用来匚w的Pattern对象?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_e[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><B>?Pattern对象</B> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>要把正则表达式编译成Pattern对象Q调用compiler对象的compile()ҎQƈ在调用参C指定正则表达式。例如,你可以按照下面这U方式编译正则表辑ּ“t[aeio]n”: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_f[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>默认情况下,~译器创Z个大写敏感的模式(patternQ。因此,上面代码~译得到的模式只匚w“tin”、“tan”?“ten”和“ton”,但不匚w“Tin”和“taN”。要创徏一个大写不敏感的模式Q你应该在调用编译器的时候指定一个额外的参数Q?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_g[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>创徏好Pattern对象之后Q你可以通过PatternMatchercȝ该Pattern对象q行模式匚w?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><B>?PatternMatcher对象</B> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>PatternMatcher对象ҎPattern对象和字W串q行匚w查。你要实例化一个Perl5Matchercdƈ把结果赋值给PatternMatcher接口。Perl5MatchercLPatternMatcher接口的一个实玎ͼ它根据Perl 5正则表达式语法进行模式匹配: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_h[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>使用PatternMatcher对象Q你可以用多个方法进行匹配操作,q些Ҏ的第一个参数都是需要根据正则表辑ּq行匚w的字W串Q?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>· boolean matches(String input, Pattern pattern)Q当输入字符串和正则表达式要_匚w时用。换句话_正则表达式必d整地描述输入字符丌Ӏ?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>· boolean matchesPrefix(String input, Pattern pattern)Q当正则表达式匹配输入字W串起始部分时用?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>· boolean contains(String input, Pattern pattern)Q当正则表达式要匚w输入字符串的一部分时用(卻I它必L一个子Ԍ?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>另外Q在上面三个Ҏ调用中,你还可以用PatternMatcherInput对象作ؓ参数替代String对象Q这Ӟ你可以从字符串中最后一ơ匹配的位置开始l进行匹配。当字符串可能有多个子串匚wl定的正则表辑ּӞ用PatternMatcherInput对象作ؓ参数很有用了。用PatternMatcherInput对象作ؓ参数替代StringӞ上述三个Ҏ的语法如下: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>· boolean matches(PatternMatcherInput input, Pattern pattern) </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>· boolean matchesPrefix(PatternMatcherInput input, Pattern pattern) </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>· boolean contains(PatternMatcherInput input, Pattern pattern) </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><B><FONT size=4>三、应用实?/FONT></B> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>下面我们来看看Jakarta-ORO库的一些应用实例?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><B>3.1 日志文g处理</B> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>dQ分析一个Web服务器日志文Ӟ定每一个用戯在网站上的时间。在典型的BEA WebLogic日志文g中,日志记录的格式如下: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_i[1].jpg" border=0></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>分析q个日志记录Q可以发玎ͼ要从q个日志文g提取的内Ҏ两项QIP地址和页面访问时间。你可以用分l符P圆括P从日志记录提取出IP地址和时间标记?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>首先我们来看看IP地址。IP地址?个字节构成,每一个字节的值在0?55之间Q各个字节通过一个句点分隔。因此,IP地址中的每一个字节有臛_一个、最多三个数字。图八显CZ为IP地址~写的正则表辑ּQ?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4h[1].gif" border=0> </P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center>囑օQ匹配IP地址</P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>IP地址中的句点字符必须q行转义处理Q前面加上“\”)Q因为IP地址中的句点h它本来的含义Q而不是采用正则表辑ּ语法中的Ҏ含义。句点在正则表达式中的特D含义本文前面已l介l?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>日志记录的时间部分由一Ҏ括号包围。你可以按照如下思\提取出方括号里面的所有内容:首先搜烦起始Ҏ号字W(“[”)Q提取出所有不过l束Ҏ号字W(“]”)的内容,向前L直至扑ֈl束Ҏ号字W。图九显CZq部分的正则表达式?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4i[1].gif" border=0> </P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center>图九Q匹配至一个字W,直至扑ֈ“]?/P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>现在Q把上述两个正则表达式加上分l符P圆括P后合q成单个表达式,q样可以从日志记录提取出IP地址和时间。注意,Z匚w? -”(但不提取它)Q正则表辑ּ中间加入了“\s-\s-\s”。完整的正则表达式如囑֍所C?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4j[1].gif" border=0> </P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center>囑֍Q匹配IP地址和时间标?/P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>现在正则表达式已l编写完毕,接下来可以编写用正则表辑ּ库的Java代码了?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>Z用Jakarta-ORO库,首先创徏正则表达式字W串和待分析的日志记录字W串Q?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_j[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>q里使用的正则表辑ּ与图十的正则表达式差不多完全相同Q但有一点例外:在Java中,你必d每一个向前的斜杠Q“\”)q行转义处理。图十不是Java的表CŞ式,所以我们要在每个“\”前面加上一个“\”以免出现编译错误。遗憄是,转义处理q程很容易出现错误,所以应该小心}慎。你可以首先输入未经转义处理的正则表辑ּQ然后从左到右依ơ把每一个“\”替换成“\\”。如果要复检Q你可以试着把它输出到屏q上?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>初始化字W串之后Q实例化PatternCompiler对象Q用PatternCompiler~译正则表达式创Z个Pattern对象Q?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_k[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>现在Q创建PatternMatcher对象Q调用PatternMatcher接口的contain()Ҏ查匹配情况: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_l[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>接下来,利用PatternMatcher接口q回的MatchResult对象Q输出匹配的l。由于logEntry字符串包含匹配的内容Q你可以看到cd下面的输出: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_m[1].jpg" border=0></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><B>3.2 HTML处理实例一</B> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>下面一个Q务是分析HTML面内FONT标记的所有属性。HTML面内典型的FONT标记如下所C: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><FONT face="Arial, Serif" color=red size=+2></FONT><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_n[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>E序按照如下Ş式,输出每一个FONT标记的属性: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_o[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>在这U情况下Q我你用两个正则表辑ּ。第一个如囑֍一所C,它从字体标记提取出?face="Arial, Serif" size="+2" color="red"”?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4k[1].gif" border=0> </P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center>囑֍一Q匹配FONT标记的所有属?/P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>W二个正则表辑ּ如图十二所C,它把各个属性分割成名字-值对?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4l[1].gif" border=0> </P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center>囑֍二:匚w单个属性,q把它分割成名字-值对</P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>分割l果为: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_p[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>现在我们来看看完成这个Q务的Java代码。首先创Z个正则表辑ּ字符Ԍ用Perl5Compiler把它们编译成Pattern对象。编译正则表辑ּ的时候,指定Perl5Compiler.CASE_INSENSITIVE_MASK选项Q得匹配操作不区分大小写?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>接下来,创徏一个执行匹配操作的Perl5Matcher对象?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_q[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>假设有一个Stringcd的变量htmlQ它代表了HTML文g中的一行内宏V如果html字符串包含FONT标记Q匹配器返回true。此Ӟ你可以用匚w器对象返回的MatchResult对象获得W一个组Q它包含了FONT的所有属性: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_r[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>接下来创Z个PatternMatcherInput对象。这个对象允怽从最后一ơ匹配的位置开始l进行匹配操作,因此Q它很适合于提取FONT标记内属性的名字-值对。创建PatternMatcherInput对象Q以参数形式传入待匹配的字符丌Ӏ然后,用匹配器实例提取出每一个FONT的属性。这通过指定PatternMatcherInput对象Q而不是字W串对象Qؓ参数Q反复地调用PatternMatcher对象的contains()Ҏ完成。PatternMatcherInput对象之中的每一ơP代将把它内部的指针向前移动,下一ơ检将从前一ơ匹配位|的后面开始?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>本例的输出结果如下: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_s[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><B>3.3 HTML处理实例?/B> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>下面我们来看看另一个处理HTML的例子。这一ơ,我们假定Web服务器从widgets.acme.comUd了newserver.acme.com。现在你要修改一些页面中的链接: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_t[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>执行q个搜烦的正则表辑ּ如图十三所C: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4m[1].gif" border=0> </P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14> <P align=center>囑֍三:匚w修改前的链接</P></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>如果能够匚wq个正则表达式,你可以用下面的内Ҏ换图十三的链接: </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><A ></A><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_u[1].jpg" border=0></TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>注意#字符的后面加上了$1。Perl正则表达式语法用$1?2{表C已l匹配且提取出来的组。图十三的表辑ּ把所有作Z个组匚w和提取出来的内容附加到链接的后面?</TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>现在Q返回Java。就象前面我们所做的那样Q你必须创徏试字符Ԍ创徏把正则表辑ּ~译到Pattern对象所必需的对象,以及创徏一个PatternMatcher对象Q?IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_v[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>接下来,用com.oroinc.text.regex包Utilcȝsubstitute()静态方法进行替换,输出l果字符Ԍ </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_w[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>Util.substitute()Ҏ的语法如下: </TD></TR></TBODY></TABLE> <TABLE height=17 width=620 align=center> <TBODY> <TR> <TD class=a14 height=13><IMG src="file:///C:/Documents%20and%20Settings/Administrator/Local%20Settings/Temp/CyberArticle/120_files/01_7_31_4_x[1].jpg" border=0> </TD></TR></TBODY></TABLE> <TABLE width=620 align=center> <TBODY> <TR> <TD class=a14>q个调用的前两个参数是以前创建的PatternMatcher和Pattern对象。第三个参数是一个Substiution对象Q它军_了替换操作如何进行。本例用的是Perl5Substitution对象Q它能够q行Perl5风格的替换。第四个参数是想要进行替换操作的字符Ԍ最后一个参数允许指定是否替换模式的所有匹配子ԌUtil.SUBSTITUTE_ALLQ,或只替换指定的次数?<BR><BR></TD></TR></TBODY></TABLE>补充:现在java里已l正则表辑ּ加进?java.util.regex包里用v来很单和上面的介l也差不?举个匚w的例? Pattern p=null; //正则表达?<BR><BR> Matcher m=null; //操作的字W串 <BR><BR> boolean b; <BR><BR> String s=null; <BR><BR> StringBuffer sb=null; <BR><BR> int i=0; <BR><BR> //字符串匹配,q是不符合的 <BR><BR>  p = Pattern.compile("a*b"); <BR><BR>  m = p.matcher("baaaaab"); <BR><BR>  b = m.matches(); <BR> out.println(b); <BR><BR>其实是q么?不过l过我的实验发现java里的正则表达式在做字W替换的时候效率ƈ不是很高,看过q是主要用在字符串匹配方面应用比较多.<img src ="http://m.tkk7.com/relax/aggbug/21807.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/relax/" target="_blank">L</a> 2005-11-29 12:30 <a href="http://m.tkk7.com/relax/archive/2005/11/29/21807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Commons 阅读W记 ?Log4J ?/title><link>http://m.tkk7.com/relax/archive/2005/04/14/3282.html</link><dc:creator>L</dc:creator><author>L</author><pubDate>Thu, 14 Apr 2005 07:12:00 GMT</pubDate><guid>http://m.tkk7.com/relax/archive/2005/04/14/3282.html</guid><wfw:comment>http://m.tkk7.com/relax/comments/3282.html</wfw:comment><comments>http://m.tkk7.com/relax/archive/2005/04/14/3282.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/relax/comments/commentRss/3282.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/relax/services/trackbacks/3282.html</trackback:ping><description><![CDATA[<FONT face=宋体><STRONG>•配|Log4J<BR></STRONG>问题Q?BR>Log4J支持Properties和XML两种格式的配|文件?BR>解决ҎQ?BR>定义log4j.properties配置文g<BR></FONT> <TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 borderColorDark=#ffffff cellPadding=4 width="98%" align=center bgColor=#e6e6e6 borderColorLight=#009ace border=1> <TBODY> <TR> <TD style="WORD-WRAP: break-word"><BR># 所有Log信息输出到标准输?System.out)和在下面指定的一个文?BR># WARN是默认的loggingU别<BR>log4j.rootCategory = WARN, STDOUT, FILE<BR><BR># 应用E序的loggingU别是DEBUG<BR>log4j.logger.com.discursive = DEBUG<BR><BR># 配置标准输出Appender<BR>log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender<BR>log4j.appender.STDOUT.layout = org.apache.log4j.PatternLayout<BR>log4j.appender.STDOUT.layout.ConversionPattern = %5p (%F:%L) %m%n<BR><BR># 配置输出文gAppender<BR>log4j.appender.FILE = org.apache.log4j.RollingFileAppender<BR>log4j.appender.FILE.File = output.log<BR>log4j.appender.FILE.MaxFileSize = 2000KB<BR>log4j.appender.FILE.MaxBackupIndex = 5<BR>log4j.appender.FILE.layout = org.apache.log4j.PatternLayout<BR>log4j.appender.FILE.layout.ConversionPattern = %d %-5p %c - %m%n<BR></TD></TR></TBODY></TABLE><BR><BR> <TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 borderColorDark=#ffffff cellPadding=4 width="98%" align=center bgColor=#e6e6e6 borderColorLight=#009ace border=1> <TBODY> <TR> <TD style="WORD-WRAP: break-word"><BR>PropertyConfigurator.configure(getClass()<BR>  .getResource("/resources/log4j.properties"));<BR><BR>Logger logger = Logger.getLogger("com.discursive.SomeApp");<BR>logger.info("This is a info message");<BR>logger.error("This is a error message");<BR></TD></TR></TBODY></TABLE><BR><BR>使用BasicConfiguratorcL加蝲log4j.properties配置。用Logger.getLogger获得一个logger实例?BR>配置文g中的rootCategory指定log输出到控制台和output.log文g。文件Appender使用了RollingFileAppenderQ当文g大小辑ֈ最大文件大?MaxFileSize)2000KBӞRollingFileAppender会备份原log文gQƈ再创Z个新的log文g?BR>配置文g指定默认的loggingU别是DEBUG(log4j.logger.com.discursive = DEBUG)。所以,所有别低于DEBUG的log信息都不会被输出。Log4J按重要度定义了五个logU别Q分别是QDEBUG, INFO, WARN, ERROR, 和FATAL?BR>其他Q?BR>Log4Jq可以用XML格式的配|文Ӟ使用DOMConfiguratord?BR>Log4J使用Appender和Layout来定制log输出。Appender指定输出C处,Layout指定如何输出(输出的格??BR>Log4J内置的Appender有:<BR>•SMTPAppender<BR>•RollingFileAppender<BR>•SocketAppender<BR>•SyslogAppender<BR>•NTEventLogAppender<BR>Log4J支持的Layout?BR>•XMLLayout<BR>•PatternLayout<BR>•HTMLLayout<BR>•DateLayout.<img src ="http://m.tkk7.com/relax/aggbug/3282.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/relax/" target="_blank">L</a> 2005-04-14 15:12 <a href="http://m.tkk7.com/relax/archive/2005/04/14/3282.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Commons 阅读W记 ?Configuration ?/title><link>http://m.tkk7.com/relax/archive/2005/04/14/3280.html</link><dc:creator>L</dc:creator><author>L</author><pubDate>Thu, 14 Apr 2005 06:52:00 GMT</pubDate><guid>http://m.tkk7.com/relax/archive/2005/04/14/3280.html</guid><wfw:comment>http://m.tkk7.com/relax/comments/3280.html</wfw:comment><comments>http://m.tkk7.com/relax/archive/2005/04/14/3280.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://m.tkk7.com/relax/comments/commentRss/3280.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/relax/services/trackbacks/3280.html</trackback:ping><description><![CDATA[<FONT face=宋体><STRONG>•访问Properties格式的配|文?BR></STRONG>问题Q?BR>希望能以_cd的方式访问到配置信息Q而不仅仅是Stringcd?nbsp;<BR>解决ҎQ?BR>使用PropertiesConfigurationcd以加载ƈ讉Kproperties格式的配|文Ӟq提供对数值型、数l型和List列表型配|信息的支持?BR>比如Q有如下的配|信息:<BR></FONT> <TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 borderColorDark=#ffffff cellPadding=4 width="98%" align=center bgColor=#e6e6e6 borderColorLight=#009ace border=1> <TBODY> <TR> <TD style="WORD-WRAP: break-word"><BR>speed=23.332<BR>names=Bob,Gautam,Jarret,Stefan<BR>correct=false<BR></TD></TR></TBODY></TABLE><BR><BR>可以像这h讉K他们Q?BR> <TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 borderColorDark=#ffffff cellPadding=4 width="98%" align=center bgColor=#e6e6e6 borderColorLight=#009ace border=1> <TBODY> <TR> <TD style="WORD-WRAP: break-word"><BR>Configuration config = new PropertiesConfiguration(getClass()<BR>    .getResource("/resources/config.properties"));<BR><BR>float speed = config.getFloat("speed");<BR>List names = config.getList("names");<BR>boolean correct = config.getBoolean("correct");<BR></TD></TR></TBODY></TABLE><BR><BR>传递给PropertiesConfiguration构徏函数的参数可以是文g名、可以访问到文g的URL、以及文件本w?File对象)。当ӞPropertiescM可以完成同样的事情,但只支持q回Stringcd的倹{?BR><BR><B>•访问XML格式的配|文?/B><BR>问题Q?BR>希望使用XML格式的配|文件来配置应用E序?BR>解决ҎQ?BR> <TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 borderColorDark=#ffffff cellPadding=4 width="98%" align=center bgColor=#e6e6e6 borderColorLight=#009ace border=1> <TBODY> <TR> <TD style="WORD-WRAP: break-word"><BR>Configuration config = new XMLConfiguration("resources/config.xml");<BR>List criterias = config.getList("start-criteria.criteria");<BR>String criteria = config.getString("start-criteria.criteria(0)");<BR>String type = config.getString("start-criteria.criteria(0)Q@typeQ?);//自己替换Q]<BR>int horsepower = config.getInt("horsepower");<BR></TD></TR></TBODY></TABLE><BR><BR>使用XMLConfigurationcd以加载ƈ讉KXML格式的配|文Ӟ讉K配置信息使用的是XPath格式 (XPath请参数相应的XML文档)?BR>传递给XMLConfiguration构徏函数的参数可以是文g名、可以访问到文g的URL、以及文件本w?File对象)?BR><BR><B>•访问组合配|?/B><BR>问题Q?BR>有时候应用程序用一U多层结构的配置方式Q即上一层的配置可以被下一层选择性地覆盖?BR>解决ҎQ?BR>configuration.xml<BR> <TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 borderColorDark=#ffffff cellPadding=4 width="98%" align=center bgColor=#e6e6e6 borderColorLight=#009ace border=1> <TBODY> <TR> <TD style="WORD-WRAP: break-word"><BR><?xml version="1.0" encoding="ISO-8859-1" ?><BR><configuration><BR> <properties fileName="user.properties" /><BR> <properties fileName="local.properties" /><BR> <properties fileName="global.properties" /><BR></configuration><BR></TD></TR></TBODY></TABLE><BR><BR>global.properties<BR> <TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 borderColorDark=#ffffff cellPadding=4 width="98%" align=center bgColor=#e6e6e6 borderColorLight=#009ace border=1> <TBODY> <TR> <TD style="WORD-WRAP: break-word"><BR>threads.max=50<BR>threads.min=2<BR>timeout=15.52<BR>interactive=true<BR>color=red<BR>speed=50<BR>name=Default User<BR></TD></TR></TBODY></TABLE><BR><BR>local.properties<BR> <TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 borderColorDark=#ffffff cellPadding=4 width="98%" align=center bgColor=#e6e6e6 borderColorLight=#009ace border=1> <TBODY> <TR> <TD style="WORD-WRAP: break-word"><BR># Overrides Global Props<BR>threads.max=30<BR>speed=55<BR></TD></TR></TBODY></TABLE><BR><BR>user.properties<BR> <TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 borderColorDark=#ffffff cellPadding=4 width="98%" align=center bgColor=#e6e6e6 borderColorLight=#009ace border=1> <TBODY> <TR> <TD style="WORD-WRAP: break-word"><BR># Overrides Local Props<BR>threads.min=1<BR>color=black<BR>speed=5000<BR>name=Sean<BR></TD></TR></TBODY></TABLE><BR><BR> <TABLE style="TABLE-LAYOUT: fixed" cellSpacing=0 borderColorDark=#ffffff cellPadding=4 width="98%" align=center bgColor=#e6e6e6 borderColorLight=#009ace border=1> <TBODY> <TR> <TD style="WORD-WRAP: break-word"><BR>ConfigurationFactory factory = new ConfigurationFactory();<BR>factory.setConfigurationURL(CfgTest3.class.getResource("/resources/configuration.xml"));<BR>Configuration config = factory.getConfiguration();<BR><BR>// print out properties<BR>System.out.println("Timeout: " + config.getFloat("timeout"));<BR>System.out.println("Max Threads: " + config.getString("threads.max"));<BR>System.out.println("Name: " + config.getString("name"));<BR>System.out.println("Speed: " + config.getInt("speed"));<BR></TD></TR></TBODY></TABLE><BR><BR>创徏一个声明多个properties配置的configuration.xml文gQƈ传递给ConfigurationFactoryQConfigurationFactory解析q些properties配置Q生成一个包含最l配|信息的Configuration实例Q通过q个实例讉K到的配置信息Q就是被覆盖q的最l版本?BR>上面实例中的configuration.xml文g由多?lt;properties/>元素l成Q覆盖的序׃往下,也就是说user.properties会覆盖local.propertiesQlocal.properties会覆盖global.properties?BR>其他Q?BR>configuration.xml文g可以使用如下的元素来声明配置文gQ?BR>?lt;properties/> 用于声明properties格式的配|文?BR>?lt;xml/>用于声明xml格式的配|文?BR>除了可以讉Kproperties格式和xml格式的配|文件以外,Commons Configuration包还定义了JNDIConfigurationcL讉KJNDI树格式的配置信息Q具体的Ҏ请参考其他相x档?img src ="http://m.tkk7.com/relax/aggbug/3280.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/relax/" target="_blank">L</a> 2005-04-14 14:52 <a href="http://m.tkk7.com/relax/archive/2005/04/14/3280.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Spring AOP ~存Ҏl果?http://m.tkk7.com/relax/archive/2005/04/11/3141.htmlLLMon, 11 Apr 2005 07:17:00 GMThttp://m.tkk7.com/relax/archive/2005/04/11/3141.htmlhttp://m.tkk7.com/relax/comments/3141.htmlhttp://m.tkk7.com/relax/archive/2005/04/11/3141.html#Feedback2http://m.tkk7.com/relax/comments/commentRss/3141.htmlhttp://m.tkk7.com/relax/services/trackbacks/3141.html阅读全文

L 2005-04-11 15:17 发表评论
]]>
[转帖]ant入门Q我喜欢单:ant - java 构徏工具http://m.tkk7.com/relax/archive/2005/02/21/1387.htmlLLMon, 21 Feb 2005 04:16:00 GMThttp://m.tkk7.com/relax/archive/2005/02/21/1387.htmlhttp://m.tkk7.com/relax/comments/1387.htmlhttp://m.tkk7.com/relax/archive/2005/02/21/1387.html#Feedback0http://m.tkk7.com/relax/comments/commentRss/1387.htmlhttp://m.tkk7.com/relax/services/trackbacks/1387.html在window写bat,在unix写shellQ?BR>     可惜我不怎末会写。所以我制作一个ejb的过E是q样的:
写代?>写个bat~译代码->l织文g(ejb-jar.xml,jboss.xml...)->压羃文g生成jar文档->
实施......(q有同样的测试过E?(为甚末不用jbuild?)

    q中间每ơ修攚w要经q重复的无数ơ手工copy,paste...q程Q好累,好花旉。可我确实不惛_
学脚本编写,unix,linux下我q得重学Q太累?BR>
    如果你和我一样希望自动执行预定义的动作却又不惛_累,那末Q我觉得ANT工具不错Q?BR>它可以以相同的用法用在不同^?跨^?。它是JAVA做的Q免费的Q开源的Q据说网上已l成了事实的JAVA
构徏标准Q还听说高手都用?..... ^_^

    我花?天时间才掌握了它的基本用法,我希望你能通过我的文章和试验花半天旉掌握它?BR>
内容Q?BR>   下蝲Q安?nbsp;
   hello ant 
   hello ant q 
   参考及下蝲 

下蝲Q安?BR>   又下?又是一大堆参数变量?  :(
    http://jakarta.apache.org/ant/index.html ;它是apache的java子项?jakarta"的子目.你可以选择
当前的版本,目前我是1.5?window版,以下q它讲?BR>
    解压后ant_home用来方便讉K。ƈ保你也讄了java_home ?BR>    set ant_home=D:\java\kit\ant\jakarta-ant-1.5.1    q是我的目录    

    p些,单吧?BR>
hello ant

我们要开发一个javac:其内容只有一句,输出"hello ant"字符丌Ӏƈ使用ant完成~译和运行工作,q个例子只是Z跑通antQ不附加多余的东ѝ?BR>
下图为文件组l,请徏立相应的目录Qƈ~写HelloAnt.java

按照人家老外的文件组l规则咱也照搬?BR>
hello.ant.HelloAnt.java:
[code]
package hello.ant;

public class HelloAnt{
    public static void main(String[] args){
        System.out.println("hello ant,ant 的第一ơ接触,好棒Q?);
    } 
}
[/code]

在项目根目录(hello-ant\)?个文Ӟant执行配置文gbuild.xml:

<?xml version="1.0"  encoding="GB2312" ?>

<!-- 一个项?可包含很多Q务组(target) -->
<project default="main" basedir=".">

    <!-- 目中的一个Q务组,可包含很多Q?task:javac,java...) -->
    <target name="main">

        <!--~译-->
        <javac srcdir="src\main\hello\ant" destdir="build\classes"/>

        <!--q行-->
        <java classname="hello.ant.HelloAnt">
            <classpath>
                <pathelement path="build\classes"/>
            </classpath>
        </java>

    </target>
</project>



ok,一切大功告成,哦,不,q没有运行它?BR>
dos下进入hello-ant的目录,即build.xml所在的目录Q我们要用ant工具执行?nbsp;Q?nbsp;

执行: %ant_home%/bin/ant -file build.xml     用ant工具执行当前目录下的配置文gbuild.xml 

?nbsp; Qant -file build.xml                    你如果设|?ant_home%/bin到path?BR>
q次ok了,q是{案Q?BR>
命o提示W窗?nbsp;
D:\temp\hello-ant>ant -file build.xml
Buildfile&: build.xml

main:
[javac] Compiling 1 source file to D:\temp\hello-ant\build\classes
[java] hello ant,ant 的第一ơ接触,好棒Q?BR>
BUILD SUCCESSFUL
Total time: 2 seconds
D:\temp\hello-ant>  

查一下build/classes目录Q哦Q看到编译过的文件就在这?
build/classes/hello/ant/HelloAnt.class.


hello ant q

(此段比较废话Q可以略q?
你也怼_q末单的工作写个批处理不得了,又xml又ant的,把我的时间都费完了Q我用jbuild?BR>webShpere不就得了Q怎末说你才明白呢Q反正网上开源项目大多数都用ant,你M能给人家?.jpx吧,
而且q样的工具太贵,受不?当然用D的兄弟不怕^_^ )Q而且ant可以让你明确的管理和自动化所有的东西:
~译-实施-试...,哎,E微ȝ一点点Q但节约你以前花在零的copy,paste上的旉.而且我发现管?BR>代码的质量有所提高.

我们要改qbuild.xmlQ让它做更多的事情:

定义全局变量 
初始?主要是徏立目?nbsp;
~译  (已有) 
打包为jar 
建立API documentQtion 
生成distribution产品 
凡事都讲I^衡,你要antl你做更多事Q当然要累一点点Q不q只用篏一ơ,以后的代码修改后的构建都?一键式"完成,我们制作一个hello的简单例子,你可以自己做j2ee的练习?BR>
我们要扩充目录结构,使它更像回事Q?BR>
ant处理~译之前的目录:
按此在新H口览囄

ant处理之后的目录:
按此在新H口览囄

图中Q\src,\docs,\lib是自ql的文gl构Q\build,\dist是ant动态生成的成品?BR>
\src                     源文Ӟjava源,script源,jsp源,xml配置.....
\src\main         java?BR>\src\script     window,unix,liunx的执行scriptQ我们的单只有一个:
                  run.bat:  java hello.ant.HelloAnt

\docs                手写说明文档
\lib                   E序所需cd的jar,比如j2ee.jar,mail,jar...

\build               用ant动态生成的构徏目录
\build\classes  ~译的类文g
\build\docs         copy "\docs"的手写说明文档,和ant生成的api文档
\build\lib           攄我们自己的HelloAnt.class打包成品hello-ant.jar

\dist\bin        copy "\src\script" 得执行文?BR>\dist\docs      copy "\build\docs" 的文?BR>\dist\lib         除了copy "\build\lib"下的hello-ant.jar外,
                              q应copy "\lib"的程序所需jarQ这里我们没有?BR>
以上是我学老外的文件组l,大家可以按照自己的爱好组l?BR>
我们~写必要的文Ӟ 
hello.ant. HelloAnt.java:已有
\src\script.bat:

@echo off
echo ========================================================
echo   请先讄 Environment
echo .
echo   JAVA_HOME: %JAVA_HOME%
echo ======================================================

%java_home%\bin\java -classpath ..\lib\hello-ant.jar  hello.ant.HelloAnt

pause 


\docs\index.html 随便写一个手写的文档 :
\build.xml 配置文g:
[code]
<?xml version="1.0"  encoding="GB2312" ?>
<!--
    =======================================================================
      hello-ant 目 ,学习ant工具的第2个build file.

      参照ant的jakarta-ant-1.6alpha的build.xml

      Copyright (c) 2002 The Neusoft Software Foundation.  All rights
      reserved.

    =======================================================================
-->

<!--
    文档l构?
    <project>
        <property/>               全局变量的定?BR>        <property/>...

        <target name="1">         dl?tasks)
            <javac></javac>       一javacd
            ...
            <oneTask></ontTask>   一其它Q?BR>        </target>

        <target name="2">
            <javac></javac>
            ...
            <oneTask></ontTask>
        </target>
    </project>

    project代表一个项目,
    default:q行到名UCؓ"dist"的target(dl?
    basedir:基准路径?BR>-->
<project default="dist" basedir=".">

<!--
    ===================================================================
      定义属性(property tasksQ?BR>      最好把用到的\径呀Q名U呀都在q里定义成全局变量
      例:定义
          <property name="a" value="hello"/>
      以后可以这L它:
          <property name="b" value="${a}/b"/>
      现在:b=="hello/b"
    ===================================================================
-->

    <!--主要的系l环境属?->
    <property environment="env"/><!--取window,unix...的环境变?->
    <property name="java.home" value="${env.JAVA_HOME}"/>
    <property name="ant.home"  value="${env.ANT_HOME}"/>

    <!--主要的app环境属?->
    <property name="app.name"      value="hello-ant"/>
    <property name="app.jar"       value="${app.name}.jar"/>
    <property name="app.copyright" value=" Copyright (c) 2002 The Neusoft Software Foundation.  All rights reserved."/>


    <!--app中src的属?->
    <property name="src.dir"    value="src" />
    <property name="src.main"   value="${src.dir}/main"/>
    <property name="src.script" value="${src.dir}/script"/>

    <!--app用到的lib-->
    <property name="lib.dir" value="lib"/>

    <!--app的build目录?->
    <property name="build.dir"      value="build" />
    <property name="build.classes"  value="${build.dir}/classes"/>
    <property name="build.docs"     value="${build.dir}/docs"/>
    <property name="build.docs.api" value="${build.docs}/api"/>
    <property name="build.lib"      value="${build.dir}/lib"/>

    <!--app的dist (distribution) 目录?->
    <property name="dist.dir"      value="dist"/>
    <property name="dist.bin"      value="${dist.dir}/bin"/>
    <property name="dist.docs"     value="${dist.dir}/docs"/>
    <property name="dist.lib"      value="${dist.dir}/lib"/>

    <!--app的docs目录?->
    <property name="docs.dir"      value="docs"/>

    <!--
    定义一l\径以后可以通过id重用q组路径 Q例Q?BR>    <javac srcdir="src/main" destdir="build/classes">
            <classpath refid="classpath"/>
    </javac>
    -->
    <path id="classpath">
        <!--本项目只有一个javaQ用不上classpathQ这里只是做个例?->
        <pathelement location="${build.classes}"/>
        <pathelement path="${java.home}/lib/tools.jar"/>
    </path>

<!--
    ===================================================================
      init 准备目录(File Tasks)
      主要的目录结构通常是不会变的,一L成他?BR>    ===================================================================
-->
    <target name="init">
        <!--清除以前目录-->
        <delete dir="${build.dir}" failonerror="false" />
        <delete dir="${dist.dir}"  failonerror="false"/>

        <!--准备目录-->
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${build.classes}"/>
        <mkdir dir="${build.docs}"/>
        <mkdir dir="${build.docs.api}"/>
        <mkdir dir="${build.lib}"/>

        <mkdir dir="${dist.dir}"/>
        <mkdir dir="${dist.bin}"/>
        <mkdir dir="${dist.lib}"/>

    </target>

<!--
    ===================================================================
      Build the code (Compile Tasks,File Tasks)
    ===================================================================
-->
    <target name="build" depends="init">
        <!--~译-->
        <javac srcdir="${src.main}" destdir="${build.classes}">
            <classpath refid="classpath"/>
        </javac>
    </target>

<!--
    ===================================================================
      打包文档(Archive Tasks)
      Create the project jars: xxx1.jar and xxx2.jar
    ===================================================================
-->
   <target name="jars" depends="build">
        <jar basedir="${build.classes}" jarfile="${build.lib}/${app.jar}"/>
    </target>

<!--
     ===================================================================
       Creates the API documentQtion
     ===================================================================
-->
    <target name="javadocs"
            depends="jars"
            description="--> creates the API documentQtion">
        <!--copy docs 手册... -->
        <copy todir="${build.docs}">
            <fileset dir="${docs.dir}"/>
        </copy>

        <javadoc packagenames="hello.ant.*"
                 sourcepath="${src.main}"
                 defaultexcludes="yes"
                 destdir="${build.docs.api}"
                 author="true"
                 version="true"
                 use="true"
                 windowtitle="Docs API">
             <doctitle><![CDATA[<h1>hello ant Docs API</h1>]]></doctitle>
             <bottom><![CDATA[<i>${app.copyright}</i>]]></bottom>
             <tag name="todo" scope="all" description="To do:" />
         </javadoc>
    </target>

<!--
     ===================================================================
       Create the distribution that can run (Archive Tasks)
       主要是从各目录中把该copy的copy?BR>     ===================================================================
-->
   <target name="dist" depends="javadocs">
        <!--copy bin 执行文g -->
        <copy todir="${dist.bin}">
            <fileset dir="${src.script}/"/>
        </copy>
        <copy todir="${dist.docs}">
            <fileset dir="${build.docs}/"/>
        </copy>
        <!-- copy lib 文g -->
        <copy todir="${dist.lib}">
            <fileset dir="${build.lib}/"/>
        </copy>

    </target>
<!--
     ===================================================================
      Cleans everything(File Tasks)
      例如可以删除build中的文gQ留l你发挥?BR>     ===================================================================
-->

</project>
[/code]

build.xml多了些,但其实很单:(注释比较详细可以参照Q这里再单说一?

一个build.xml包含一个工E的自动化处理的完整xml说明Qƈ且基本由3U东东组成:

<project >

    1.全局变量的定?BR>    <property/>

    2.dl?BR>    <target>
        3.许多单项d... 像copy,delete,javac,jar...
        <task1/>
        <task2/>
        <task3/>
    </target>

</project>


参考及下蝲Q?BR>
本文E序:W?个hello-ant

本文E序:W?个进阶的hello-ant

ant最C载:
http://jakarta.apache.org/ant/index.html ;

ant具体的编写方法参考ant手册以下2部分ŞQ?BR>http://jakarta.apache.org/ant/manual/using ;使用说明
http://jakarta.apache.org/ant/manual/coretasklist.html ;核心tasks
其他一大堆东西你要看也行。不q我觉得比较费旉?BR>http://jakarta.apache.org/ant/manual/index.html ; 手册index

huihoo.com译改编的ant/manual/using
http://www.huihoo.com/java/ant.html ;

用ANT构造Application作者:余斌?nbsp;   
http://developer.ccidnet.com/pub/disp/Article?columnID=295&articleID=27619&pageNO=1

ibm 利用 Ant ?nbsp;JUnit q行增量开发——用单元测试来逐步改进代码
http://www-900.ibm.com/developerWorks/cn/java/j-ant/index.shtml

关于作者:

陈鹏Q东软西安公司。作Z名狂热的E序员希望每一天都能成长进步,q希望与大家分n快乐和知识?BR>L以下方式和他联系Qemail chen56@msn.com  


L 2005-02-21 12:16 发表评论
]]>
JAVA 的MD5加密法源代?/title><link>http://m.tkk7.com/relax/archive/2005/02/02/923.html</link><dc:creator>L</dc:creator><author>L</author><pubDate>Wed, 02 Feb 2005 08:11:00 GMT</pubDate><guid>http://m.tkk7.com/relax/archive/2005/02/02/923.html</guid><wfw:comment>http://m.tkk7.com/relax/comments/923.html</wfw:comment><comments>http://m.tkk7.com/relax/archive/2005/02/02/923.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://m.tkk7.com/relax/comments/commentRss/923.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/relax/services/trackbacks/923.html</trackback:ping><description><![CDATA[<P><SPAN id=ArticleContent1_ArticleContent1_lblContent><SPAN id=ArticleContent1_ArticleContent1_lblContent>import java.security.*;<BR>import java.security.spec.*; </P> <P>class MD5_Test{</P> <P>   public final static String MD5(String s){<BR>     char hexDigits[] = {<BR>         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',<BR>         'e', 'f'};<BR>     try {<BR>       byte[] strTemp = s.getBytes();<BR>       MessageDigest mdTemp = MessageDigest.getInstance("MD5");<BR>       mdTemp.update(strTemp);<BR>       byte[] md = mdTemp.digest();<BR>       int j = md.length;<BR>       char str[] = new char[j * 2];<BR>       int k = 0;<BR>       for (int i = 0; i < j; i++) {<BR>         byte byte0 = md[i];<BR>         str[k++] = hexDigits[byte0 >>> 4 & 0xf];<BR>         str[k++] = hexDigits[byte0 & 0xf];<BR>         }<BR>         return new String(str);<BR>       }<BR>       catch (Exception e){<BR>         return null;<BR>       }<BR>}<BR> public static void main(String[] args){<BR> //MD5_Test aa = new MD5_Test();</P> <P> System.out.print(MD5_Test.MD5("XX"));<BR> }<FONT color=#800080><U><BR></FONT></U></P></SPAN></SPAN><img src ="http://m.tkk7.com/relax/aggbug/923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/relax/" target="_blank">L</a> 2005-02-02 16:11 <a href="http://m.tkk7.com/relax/archive/2005/02/02/923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> jsp template之我?http://m.tkk7.com/relax/archive/2005/02/02/922.htmlLLWed, 02 Feb 2005 08:00:00 GMThttp://m.tkk7.com/relax/archive/2005/02/02/922.htmlhttp://m.tkk7.com/relax/comments/922.htmlhttp://m.tkk7.com/relax/archive/2005/02/02/922.html#Feedback0http://m.tkk7.com/relax/comments/commentRss/922.htmlhttp://m.tkk7.com/relax/services/trackbacks/922.html我们在做E序的过E中Q常怼遇到q样一U情况,是在一个项目中Q会发现有很多页面的框架基本相同的,只是具体昄的内容不同,而按常规的做法,我们可能会用include语句来提出框架内容,然后在每个页面中引用q些框架Q但q样׃产生一个问题,如果我的框架发生变化了,那应该怎么办呢QD个例子,一个index.jsp可能包含有head.jsp和foot.jsp。而其它页面也同样包含q两个JSP。但如果我在index.jsp里有一D导航条的代码,我现在想在每个页面里引用Q而不惛_到head.jsp中,N我们要在每个面里都增加q个D条的代码吗?我想我是不会q样做的。因为有一U更好的办法来解册U问题。那是采用模板面?BR>
template面的原理,其实是写一个servlet来实现页面的跌{Q然后在web.xml里面配置q个servletQ要用模板的q一cJSP文gQ都通过q个servlet来处理,使它们都转到模板面卛_。然后在模板面中includeq些面的内定w卛_?BR>
具体的做法,只要写一个template.jsp做ؓ模板面、一个TemplateDispatch.java做ؓ跌{的类可以了。然后在调用Ӟ直接指向q个SERVLETQ加一个参敎ͼ说明要用到哪个内定wp了。写个简单的例子如下Q?BR>template.jsp
=====================================
<% page contentType="text/html; charset=gb2312"%>
<%@ include file=“head.jsp?>
<%=(String)request.getAttribute(“body?%>
<%@ include file=“foot.jsp?>

TemplateDispatch
=====================================
public class TemplateDispatchextends HttpServlet{
    public void doGet(HttpServletRequest request,HttpServletResponse response){
         doPost(request,response);  
 }
    public void doPost(HttpServletRequest request,HttpServletResponse response){
        HttpSession session = request.getSession(true);
session.setAttribute(“body?“index.jsp?;
        RequestDispatcher rd = session.getServletContext().getRequestDispatcher("template.jsp");
        rd.forward(request,response);
}
}

web.xml
=====================================
  <servlet>
    <servlet-name>dispatch</servlet-name>
    <servlet-class>TemplateDispatchextends </servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatch</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

代码是即兴写的,没有做过试Q只是表达一下意思?BR>===========================================

如果觉得单的话,q可以扩展一下。通过配置文g配置内容,以及taglib来定义两个标{insert用来增加内容cvalue用来在模杉K直接昄内容?BR>
现在在回头想惛_面提到的问题Q是不是会比较容易解决了呢?如果面有什么变动的话,只要修改一下模杉K可以了。这栯不会犯漏掉哪个页面的错误?BR>

L 2005-02-02 16:00 发表评论
]]>
struts学习资源 http://m.tkk7.com/relax/archive/2005/02/02/921.htmlLLWed, 02 Feb 2005 07:50:00 GMThttp://m.tkk7.com/relax/archive/2005/02/02/921.htmlhttp://m.tkk7.com/relax/comments/921.htmlhttp://m.tkk7.com/relax/archive/2005/02/02/921.html#Feedback0http://m.tkk7.com/relax/comments/commentRss/921.htmlhttp://m.tkk7.com/relax/services/trackbacks/921.html深入了解Servlet 最新技?
http://java.sun.com/products/servlet/index.html
http://www.servlets.com

最新的JSP开发技?
http://java.sun.com/products/jsp
http://java.sun.com/products/jsp/docs.html

深入了解JavaBean:
http://java.sun.com/products/javabeans/

JSP标签技?
http://java.sun.com/products/jsp/tutorial/TagLibrariesTOC.html
http://jsptags.com

EJBlg开发技?
http://java.sun.com/products/ejb/index.html

深入了解XML:
http://www.w3.org/TR/2000/REC-xml-20001006
http://www.w3schools.com/xml/default.asp

Struts控制面板工具:
http://www.jamesholmes.com/struts/console/

Struts邮g列表:
  1.STRUTS-USER:面向Struts应用开发?BR>     FAQs:http://jakarta.apache.org/struts/faqs/
  2.STRUTS-DEV:面向Struts框架开发?BR>  
  订阅Qhttp://jakarta.apache.org/struts/using.html#lists
  搜烦Qhttp://jakarta.apache.org/site/mail2.html
 
Struts资源Q?BR>  主页Qhttp://jakarta.apache.org/struts
  资源Qhttp://jakarta.apache.org/struts/resources/index.html


L 2005-02-02 15:50 发表评论
]]>
JDBCq接数据库经验技巧集?http://m.tkk7.com/relax/archive/2005/02/01/891.htmlLLTue, 01 Feb 2005 04:26:00 GMThttp://m.tkk7.com/relax/archive/2005/02/01/891.htmlhttp://m.tkk7.com/relax/comments/891.htmlhttp://m.tkk7.com/relax/archive/2005/02/01/891.html#Feedback7http://m.tkk7.com/relax/comments/commentRss/891.htmlhttp://m.tkk7.com/relax/services/trackbacks/891.html
  一、连接各U数据库方式速查?/B>

  下面|列了各U数据库使用JDBCq接的方式,可以作ؓ一个手册用?

  1、Oracle8/8i/9i数据库(thin模式Q?

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID
String user="test";
String password="test";
Connection conn= DriverManager.getConnection(url,user,password);

  2、DB2数据?

Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/sample"; //sampleZ的数据库?
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);

  3、Sql Server7.0/2000数据?

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
//mydb为数据库
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);

  4、Sybase数据?

Class.forName("com.sybase.jdbc.SybDriver").newInstance();
String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDBZ的数据库?
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);

  5、Informix数据?

Class.forName("com.informix.jdbc.IfxDriver").newInstance();
String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;
user=testuser;password=testpassword"; //myDB为数据库?
Connection conn= DriverManager.getConnection(url);

  6、MySQL数据?

Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//myDB为数据库?
Connection conn= DriverManager.getConnection(url);

  7、PostgreSQL数据?

Class.forName("org.postgresql.Driver").newInstance();
String url ="jdbc:postgresql://localhost/myDB" //myDB为数据库?
String user="myuser";
String password="mypassword";
Connection conn= DriverManager.getConnection(url,user,password);

  8、access数据库直q用ODBC?BR>
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");
Connection conn = DriverManager.getConnection(url,"","");
Statement stmtNew=conn.createStatement() ;

  二、JDBCq接MySql方式

  下面是用JDBCq接MySql的一个小的教E?

  1、查N动程?BR>
  MySQL目前提供的java驱动E序为Connection/JQ可以从MySQL官方|站下蝲Qƈ扑ֈmysql-connector-java-3.0.15-ga-bin.jar文gQ此驱动E序为纯java驱动E序Q不需做其他配|?BR>
  2、动态指定classpath

  如果需要执行时动态指定classpathQ就在执行时采用Qcp方式。否则将上面?jar文g加入到classpath环境变量中?BR>
  3、加载驱动程?BR>
try{
 Class.forName(com.mysql.jdbc.Driver);
 System.out.println(Success loading Mysql Driver!);
}catch(Exception e)
{
 System.out.println(Error loading Mysql Driver!);
 e.printStackTrace();
}

  4、设|连接的url

jdbcQmysqlQ?/localhost/databasename[?pa=va][Qpa=va]

  三、以下列Z在用JDBC来连接Oracle数据库时可以使用的一些技?/B>

  1、在客户端Y件开发中使用Thin驱动E序

  在开发Java软g斚wQOracle的数据库提供了四U类型的驱动E序Q二U用于应用Y件、applets、servlets{客L软gQ另外二U用于数据库中的Java存储q程{服务器端Y件。在客户机端软g的开发中Q我们可以选择OCI驱动E序或Thin驱动E序。OCI驱动E序利用Java本地化接口(JNIQ,通过Oracle客户端Y件与数据库进行通讯。Thin驱动E序是纯Java驱动E序Q它直接与数据库q行通讯。ؓ了获得最高的性能QOracle在客L软g的开发中使用OCI驱动E序Q这g是正的。但我徏议用Thin驱动E序Q因为通过多次试发现Q在通常情况下,Thin驱动E序的性能都超q了OCI驱动E序?BR>
  2、关闭自动提交功能,提高pȝ性能

  在第一ơ徏立与数据库的q接Ӟ在缺省情况下Q连接是在自动提交模式下的。ؓ了获得更好的性能Q可以通过调用带布值false参数的ConnectioncȝsetAutoCommit()Ҏ关闭自动提交功能Q如下所C:

  conn.setAutoCommit(false);

  值得注意的是Q一旦关闭了自动提交功能Q我们就需要通过调用Connectioncȝcommit()和rollback()Ҏ来h工的方式对事务进行管理?BR>
  3、在动态SQL或有旉限制的命令中使用Statement对象

  在执行SQL命oӞ我们有二U选择Q可以用PreparedStatement对象Q也可以使用Statement对象。无论多次C用同一个SQL命oQPreparedStatement都只对它解析和编译一ơ。当使用Statement对象Ӟ每次执行一个SQL命oӞ都会对它q行解析和编译。这可能会你认为,使用PreparedStatement对象比用Statement对象的速度更快。然而,我进行的试表明Q在客户端Y件中Q情况ƈ非如此。因此,在有旉限制的SQL操作中,除非成批地处理SQL命oQ我们应当考虑使用Statement对象?BR>
  此外Q用Statement对象也得编写动态SQL命o更加单,因ؓ我们可以字W串q接在一P建立一个有效的SQL命o。因此,我认为,Statement对象可以使动态SQL命o的创建和执行变得更加单?BR>
  4、利用helper函数对动态SQL命oq行格式?BR>
  在创Z用Statement对象执行的动态SQL命oӞ我们需要处理一些格式化斚w的问题。例如,如果我们惛_Z个将名字O'Reilly插入表中的SQL命oQ则必须使用二个相连的?'”号替换O'Reilly中的?”号。完成这些工作的最好的Ҏ是创Z个完成替换操作的helperҎQ然后在q接字符串心服用公式表达一个SQL命oӞ使用创徏的helperҎ。与此类似的是,我们可以让helperҎ接受一个Date型的|然后让它输出ZOracle的to_date()函数的字W串表达式?BR>
  5、利用PreparedStatement对象提高数据库的M效率

  在用PreparedStatement对象执行SQL命oӞ命o被数据库q行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个PreparedStatement对象Ӟ它就会被再解析一ơ,但不会被再次~译。在~冲Z可以发现预编译的命oQƈ且可以重C用。在有大量用L企业U应用Y件中Q经怼重复执行相同的SQL命oQ用PreparedStatement对象带来的编译次数的减少能够提高数据库的M性能。如果不是在客户端创建、预备、执行PreparedStatementd需要的旉长于StatementdQ我会徏议在除动态SQL命o之外的所有情况下使用PreparedStatement对象?BR>
  6、在成批处理重复的插入或更新操作中用PreparedStatement对象

  如果成批地处理插入和更新操作Q就能够显著地减它们所需要的旉。Oracle提供的Statement?CallableStatementq不真正地支持批处理Q只有PreparedStatement对象才真正地支持批处理。我们可以用addBatch()和executeBatch()Ҏ选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()Ҏ和标准的executeUpdate()Ҏ选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制Q可以以如下所C的方式调用setExecuteBatch()Q?BR>
PreparedStatement pstmt3D null;
try {
 ((OraclePreparedStatement)pstmt).setExecuteBatch(30);
 ...
 pstmt.executeUpdate();
}

  调用setExecuteBatch()时指定的值是一个上限,当达到该值时Q就会自动地引发SQL命o执行Q标准的executeUpdate()Ҏ׃被作为批处理送到数据库中。我们可以通过调用PreparedStatementcȝsendBatch()Ҏ随时传输批处理Q务?BR>
  7、用Oracle locatorҎ插入、更新大对象QLOBQ?BR>
  Oracle的PreparedStatementcM完全支持BLOB和CLOB{大对象的处理,其是Thin驱动E序不支持利用PreparedStatement对象的setObject()和setBinaryStream()Ҏ讄BLOB的|也不支持利用setCharacterStream()Ҏ讄CLOB的倹{只有locator本n中的Ҏ才能够从数据库中获取LOBcd的倹{可以用PreparedStatement对象插入或更新LOBQ但需要用locator才能获取LOB的倹{由于存在这二个问题Q因此,我徏议用locator的方法来插入、更新或获取LOB的倹{?BR>
  8、用SQL92语法调用存储q程

  在调用存储过E时Q我们可以用SQL92或Oracle PL/SQLQ由于用Oracle PL/SQLq没有什么实际的好处Q而且会给以后l护你的应用E序的开发h员带来麻烦,因此Q我在调用存储过E时使用SQL92?BR>
  9、用Object SQL对象模式{Ud数据库中

  既然可以Oracle的数据库作ؓ一U面向对象的数据库来使用Q就可以考虑应用程序中的面向对象模式{到数据库中。目前的Ҏ是创建Java bean作ؓ伪装的数据库对象Q将它们的属性映到关系表中Q然后在q些bean中添加方法。尽这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的Q因此其他访问数据库的应用Y件无法利用对象模式。如果利用Oracle的面向对象的技术,可以通过创徏一个新的数据库对象cd在数据库中模仿其数据和操作,然后使用JPublisher{工L成自qJava beancR如果用这U方式,不但Java应用E序可以使用应用软g的对象模式,其他需要共享你的应用中的数据和操作的应用Y件也可以使用应用软g中的对象模式?BR>
  10、利用SQL完成数据库内的操?BR>
  我要向大家介l的最重要的经验是充分利用SQL的面向集合的Ҏ来解x据库处理需求,而不是用Java{过E化的编E语a?BR>
  如果~程人员要在一个表中查找许多行Q结果中的每个行都会查找其他表中的数据,最后,~程人员创徏了独立的UPDATE命o来成批地更新W一个表中的数据。与此类似的d可以通过在set子句中用多列子查询而在一个UPDATE命o中完成。当能够在单一的SQL命o中完成Q务,何必要让数据在网上流来流ȝQ我用户认真学习如何最大限度地发挥SQL的功能?


L 2005-02-01 12:26 发表评论
]]>
Java的破解和反破解之?http://m.tkk7.com/relax/archive/2005/02/01/889.htmlLLTue, 01 Feb 2005 03:25:00 GMThttp://m.tkk7.com/relax/archive/2005/02/01/889.htmlhttp://m.tkk7.com/relax/comments/889.htmlhttp://m.tkk7.com/relax/archive/2005/02/01/889.html#Feedback0http://m.tkk7.com/relax/comments/commentRss/889.htmlhttp://m.tkk7.com/relax/services/trackbacks/889.html久久学院
  java字节码能够很Ҏ被反~译大家都晓得啦Q今天下午我Z得到一个心仪已久的jbuilder opentoolsQ昨?.0 ReleasedQ新鲜出炉!但只能用14天,q怎么行,于是我不惜放下其他工作,研究了一把该软g加密Ҏ的破解和反破解,l合以前的一些经验,作文一与大家共飨Qƈ不是鼓励大家......

  破解之道Q?/STRONG>



  对一些提供license.keyQ包含授权信息的加密文gQ的软gQ一般这U文件会采用DES,RAS和CRC校验而且一般是二进制的Q即使有时输出成BASE64~码Q,直接修改文g是浪Ҏ间的Q你可以先反~译通过阅读源程序来探究解密q程Q如果过E是可逆的Q那么你自己实现一个加密过E,可以很容易的生成你自己想要的license keyQ如果过E不可逆也不是搞不定了,有些强度不大的加密算法还是可以用暴力破解法来搞定Q还有一U情冉|Ҏ字加密(一般指q期旉Q如果你能修改这个过期时间那么你可以多用一会儿了,用数学方法描qC下:

  假设集合 X 是明文包含的元素集合QY是Xl过法后的映射Q包含密文元素,Q如果有存在两个法A和BQ能使得{ Y QA-> X } = { Y -B-> X }QA法可逆,但B法是不可逆的Q生产方用A的逆算法加密授权信息(X:String) ?Y:byte[])Qƈ在Y件中用B法解密Q这样你搞不定了,但如果集合X的元素是有限的,假设只有0-9 Qnew Date().getTime()格式Q,那么法BqZ可逆但不可靠的Q因Z通过一个样本(一般都会给你评L的license啦!Q,是可以得到某些Y集合中元素在X集合中的逆映的Q这样你可以直接用这张映表来修改license?..

  反破解之?/STRONG>Q?

  如果是做产品或提供演C程序,加密q是有好处的Q加密的软g可以用上面提到的JODEQ一般都是对~译好的class文gq行CؕQ因为ƈ不是所有的W号都需要扰乱,如果你开发的是一个类库,或者某些类需要动态装载,那些公共API必M留符号不变,q样别h才能使用你的cd。先~写脚本寚w些需要保留的W号名称q行配置Q某些扰乱器能够调整字节码的序Q反编译更加困难。如果你用的代码Cؕ器能保证别h不能通过反编译来修改或代替你的classQ那么你q得注意不要用不可靠的加密算法?/SPAN>


L 2005-02-01 11:25 发表评论
]]>
վ֩ģ壺 ѹۿڵwwwСƵ| ֻ߿Ƭ| 99þĻƷ| պһҳƷ| 99뾫ƷƵѲ| ޹˾Ʒþþùһ | ޳a޳av| 24Сʱֱ߹ۿ| sss߲| Ƶ| Ļþ| 91Ʒѹۿ| ӰӴȫ߲| ۺ| 18ڵվ | ۺɫ| Ӱ߹ۿѸ| аӰԺ߹ۿ| AV߹ۿ| AV˾Ʒһ| ëƬַ߹ۿĻ| þþþþþþþѾƷ| ޹ƷAAAƬ| ëƬȫ| ˿ҳ| AvƷþ | av| պ޶| һѿ | ɫWW47| ޹˾þۺһ77| AVվ| Avһ| av| ĻƵһ| ƷƵ| ޾ƷƵ| СƵ߹ۿ| ĻƷַ| ޾Ʒþþþϼ| ޾ƷۺҰ|