??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美一区视久久,激情五月色综合国产精品,欧美中文字幕在线播放http://www.aygfsteel.com/simie/category/23718.htmlzh-cnTue, 31 Jul 2007 19:55:45 GMTTue, 31 Jul 2007 19:55:45 GMT60 java中相对\径,l对路径问题ȝhttp://www.aygfsteel.com/simie/archive/2007/07/29/133094.html和田?/dc:creator>和田?/author>Sun, 29 Jul 2007 03:08:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/29/133094.htmlhttp://www.aygfsteel.com/simie/comments/133094.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/29/133094.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/133094.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/133094.html  l对路径Q绝对\径就是你的主上的文件或目录在硬盘上真正的\径,(URL和物理\?例如Q?br>C:\xyz\test.txt 代表了test.txt文g的绝对\径?a >http://www.sun.com/index.htm也代表了一?br>URLl对路径?/p>

  相对路径Q相对与某个基准目录的\径。包含Web的相对\径(HTML中的相对目录Q,例如Q在
Servlet中,"/"代表Web应用的跟目录。和物理路径的相对表C。例如:(x)"./" 代表当前目录,
"../"代表上目录。这U类似的表示Q也是属于相对\径?/p>

另外关于URIQURL,URN{内容,请参考RFC相关文档标准?/p>

RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax,
(http://www.ietf.org/rfc/rfc2396.txt)


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

2.1服务器端的地址

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

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

2.22、客L(fng)的地址
 
       所有的html面中的相对地址都是相对于服务器根目?http://192.168.0.1/)的,
而不?跟目录下的该Web应用的目?http://192.168.0.1/webapp/的?
 Html中的form表单的action属性的地址应该是相对于服务器根目录(http://192.168.0.1/)的,
所以,如果提交到a.jsp为:(x)actionQ?/webapp/user/a.jsp"或action="<%=request.getContextPath()%>"/user/a.jspQ?br>  提交到servlet为actiomQ?/webapp/handleservlet"  
   Javascript也是在客L(fng)解析的,所以其相对路径和form表单一栗?
 

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


3. JSP/Servlet中获得当前应用的相对路径和绝对\?br>3.1 JSP中获得当前应用的相对路径和绝对\?br> 根目录所对应的绝对\?request.getRequestURI()
 文g的绝对\?nbsp;    :application.getRealPath(request.getRequestURI());
 当前web应用的绝对\?:application.getRealPath("/");
 取得h文g的上层目?new File(application.getRealPath(request.getRequestURI())).getParent()

3.2 Servlet中获得当前应用的相对路径和绝对\?br> 根目录所对应的绝对\?request.getServletPath();
 文g的绝对\?nbsp;   :request.getSession().getServletContext().getRealPath
(request.getRequestURI())   
 当前web应用的绝对\?:servletConfig.getServletContext().getRealPath("/");
     (ServletContext对象获得几种方式Q?br>       javax.servlet.http.HttpSession.getServletContext()
       javax.servlet.jsp.PageContext.getServletContext()
       javax.servlet.ServletConfig.getServletContext()
     )

4.java 的Class中获得相对\径,l对路径的方?br>4.1单独的JavacM获得l对路径
  Ҏ(gu)java.io.File的Doc文挡Q可?
 默认情况下new File("/")代表的目录ؓ(f)QSystem.getProperty("user.dir")?br> 一下程序获得执行类的当前\?br>package org.cheng.file;
import java.io.File;

public class FileTest {
    public static void main(String[] args) throws Exception {      

  System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));    

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

  System.out.println(ClassLoader.getSystemResource(""));       
  System.out.println(FileTest.class.getResource(""));       
  System.out.println(FileTest.class.getResource("/")); //Class文g所在\?nbsp;
  System.out.println(new File("/").getAbsolutePath());       
  System.out.println(System.getProperty("user.dir"));   
 }
}

4.2服务器中的Javac获得当前\径(来自|络Q?br>(1).Weblogic

WebApplication的系l文件根目录是你的weblogic安装所在根目录?br>例如Q如果你的weblogic安装在c:\bea\weblogic700.....
那么Q你的文件根路径是c:\.
所以,有两U方式能够让你访问你的服务器端的文gQ?br>a.使用l对路径Q?br>比如你的参数文件放在c:\yourconfig\yourconf.propertiesQ?br>直接使用 new FileInputStream("yourconfig/yourconf.properties");
b.使用相对路径Q?br>相对路径的根目录是你的webapplication的根路径Q即WEB-INF的上一U目录,你的参数文件放

在yourwebapp\yourconfig\yourconf.propertiesQ?br>q样使用Q?br>new FileInputStream("./yourconfig/yourconf.properties");
q两U方式均可,自己选择?/p>

(2).Tomcat

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

(3).Resin

不是你的JSP攄相对路径,是JSP引擎执行q个JSP~译成SERVLET
的\径ؓ(f)?比如用新建文件法试File f = new File("a.htm");
q个a.htm在resin的安装目录下

(4).如何ȝ对\径哪Q?/p>

在Java文g中getResource或getResourceAsStream均可

例:(x)getClass().getResourceAsStream(filePath);//filePath可以?/filename",q里?代表web

发布根\径下WEB-INF/classes

默认使用该方法的路径是:(x)WEB-INF/classes。已l在Tomcat中测试?/p>

5.d文g时的相对路径Q避免硬~码和绝对\径的使用。(来自|络Q?br>5.1 采用Spring的DI机制获得文gQ避免硬~码?br>   参考下面的q接内容Q?br>   http://www.javajia.net/viewtopic.php?p=90213&
5.2 配置文g的读?br> 参考下面的q接内容Q?br> http://dev.csdn.net/develop/article/39/39681.shtm
5.3 通过虚拟路径或相对\径读取一个xml文gQ避免硬~码
 参考下面的q接内容Q?br> http://club.gamvan.com/club/clubPage.jsp?iPage=1&tID=10708&ccID=8
 
6.Java中文件的常用操作Q复ӞUdQ删除,创徏{)Q来自网l)
 常用 java File 操作c?
 http://www.easydone.cn/014/200604022353065155.htm
 
 Java文g操作大全QJSP中)
 http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html

 java文g操作详解QJava中文|)
 http://www.51cto.com/html/2005/1108/10947.htm

 JAVA 如何创徏\删除\修改\复制目录?qing)文?br> http://www.gamvan.com/developer/java/2005/2/264.html

ȝQ?br> 通过上面内容的用,可以解决在Web应用服务器端Q移动文Ӟ查找文gQ复?br> 删除文g{操作,同时Ҏ(gu)务器的相对地址Q绝对地址概念更加清晰?br>参考URI,的RFC标准文挡。同时对Java.io.File. Java.net.URI.{内容了解透彻
对其他方面的理解可以更加深入和透彻?br>==================================================================================

参考资?
java/docs/

java.io.File
java.io.InputStream
java.io.OutputStream
java.io.FileInputStream
java.io.FileReader;
java.io.FileOutputStream
java.io.FileWriter;
java.net.URI
java.net.URL


l对路径与相对\径祥?br>http://www.webjx.com/htmldata/2005-02-26/1109430310.html

[『J道习(fn)l』]JSP和Servlet中的l对路径和相对\?br>http://w3china.org/blog/more.asp?name=pcthomas&id=9122&commentid=12376

JSP,Servlet,Class获得当前应用的相对\径和l对路径
http://cy.lzu.edu.cn/cy/club/clubPage.jsp?ccStyle=0&tID=886&ccID=77

如何获得当前文g路径
http://www.matrix.org.cn/resource/article/44/44113_java.html

通过Spring注入机制Q取得文?br>http://www.javajia.net/viewtopic.php?p=90213&

配置文g的读?
http://dev.csdn.net/develop/article/39/39681.shtm

d配置文g,通过虚拟路径或相对\径读取一个xml文gQ避免硬~码Q?
http://club.gamvan.com/club/clubPage.jsp?iPage=1&tID=10708&ccID=8

常用 java File 操作c?br>http://www.easydone.cn/014/200604022353065155.htm

Java文g操作大全
http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html

Java文g操作详解
http://www.51cto.com/html/2005/1108/10947.htm 



]]>
用JDK5.0自带工具解决实际工作中的问题http://www.aygfsteel.com/simie/archive/2007/07/10/129169.html和田?/dc:creator>和田?/author>Mon, 09 Jul 2007 16:04:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/10/129169.htmlhttp://www.aygfsteel.com/simie/comments/129169.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/10/129169.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/129169.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/129169.html By Benny.luo@Sun.com, 6/19/07  
SUN中国软g技术中?|浩/Benny Luo
 介:(x)
JDK 5.0, 代号老虎Q在以往的Java传统上加入了许多新的设计Q给Java语言带来了一些较大的变化Q比如泛型,元数据,可变个数参数Q静态导入类Q新U程架构Q自动装?拆箱{等新的以往没有的新Ҏ(gu)。同Ӟ在调试程序和解决性能各种问题斚wQJDK5.0同样加入了多个分析工h让开发者更加方便地调试他们自己的程序,它们包括了命令行调试工具Q图形界面调试工L(fng){?
 
JDK5.0包括的调试工P(x)
我们在这里对JDK5.0的调试工具做大致的概忉|的介绍Q然后希望通过介绍我自己在实际工作中用这些工兯决问题的实例来让大家对这些工h更深入的了解?/div>
 
JDK5.0里面加入了jstack, jconsole, jinfo, jmap, jdb, jstat, jps, 下面对这些工具做单介l:(x)
  • jstack -- 如果javaE序崩溃生成core文gQjstack工具可以用来获得core文g的java stack和native stack的信息,从而可以轻村֜知道javaE序是如何崩溃和在程序何处发生问题。另外,jstack工具q可以附属到正在q行的javaE序中,看到当时q行的javaE序的java stack和native stack的信? 如果现在q行的javaE序呈现hung的状态,jstack是非常有用的。目前只有在Solaris和Linux的JDK版本里面才有?
  • jconsole – jconsole是基于Java Management Extensions (JMX)的实时图形化监测工具Q这个工具利用了内徏到JVM里面的JMX指o(h)来提供实时的性能和资源的监控Q包括了JavaE序的内存用,Heap size, U程的状态,cȝ分配状态和I间使用{等?
  • jinfo – jinfo可以从core文g里面知道崩溃的Java应用E序的配|信息,目前只有在Solaris和Linux的JDK版本里面才有?
  • jmap – jmap 可以从core文g或进E中获得内存的具体匹配情况,包括Heap size, Perm size{等Q目前只有在Solaris和Linux的JDK版本里面才有?lt; /li>
  • jdb – jdb 用来对core文g和正在运行的Javaq程q行实时地调试,里面包含了丰富的命o(h)帮助(zhn)进行调试,它的功能和Sun studio里面所带的dbx非常怼Q但 jdb是专门用来针对Java应用E序的?
  • jstat – jstat利用了JVM内徏的指令对Java应用E序的资源和性能q行实时的命令行的监控,包括了对Heap size和垃圑֛收状늚监控{等?
  • jps – jps是用来查看JVM里面所有进E的具体状? 包括q程IDQ进E启动的路径{等?

另外Q还有些其他附带的工具在q里没有列出Q比如Heap Analysis Tool, kill -3 Ҏ(gu){等Q这些在JDK5.0之前有Q同样也是非常有用的性能调优工具Q大家可以参照相应的文档资料来学?fn),在文章后面也会(x)推荐一些相应的文档l大家作为参考?/p>

 好,说了q么多,让我们来看看JDK5.0自带的这些工具在现实工作能给我们带来什么帮助,下面是我和ISV一起共同工作的实际例子Q在q里把它们简单阐q出来,希望对大家有所帮助?/p>

jconsole和jstack使用实例Q?/h5>

在做q的目中,曄有几个是使用jstack和jconsole来解决问题的。在下面的例子中Q由于部分代码涉?qing)到公司名字Q我使用了xxx来代ѝ?/p>

1. 其中的一个是Web2.0的客P׃目前Sun Microsystem公司推出的Niagara服务器系列非帔R合|络斚w的多U程应用Qƈ且已l在业界非常出名Q所以他们决定用T2000服务器来试一下如果应用到他们自己的应用是否能够获得出众的性能?/div>
整个应用的架构如下:(x)
Apache 2.0.59 + Resin EE 2.1.17 + Jdk 1.5.0.07 + Oracle 9
q行的操作系l?
Solaris 10 Update 3 (11/06), EIS patches?
试工具Q?/div>
Apache benchmark tool.
在客L(fng)试环境中,我们分别做了Apache, Resin, Solaris的相应调_(d)其中包括了Apache使用Prefork模式Qƈ且调整了httpd.conf文g里面相应的ServerLimit, ListenBacklog,Maxclient{等|Resin服务器调整Jvm heap size, q行回收new generation和old generation, 最大线E数Qoracleq接数等{参敎ͼSolaris操作pȝ做了|络和系l的相应调整Q最l把整套pȝ搬进了生产环境,一切顺利进行,但当q入其中的一个论坛系l时却发现系l响应时间非常缓慢,用Apache Benchmark Tool加少量压力得到结果如下,׃是在生环境下所以不敢用大的压力:(x)

This is ApacheBench, Version 2.0.41-dev <$Revision: 1.121.2.12 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 2006 The Apache Software Foundation, http://www.apache.org/
Benchmarking free.xxx.com (be patient).....done
Server Software: Resin/2.1.17
Server Hostname: free.xxx.com
Server Port: 8080
Document Path: /forum/bbsMessageList.act?bbsThreadId=1580107
Document Length: 27012 bytes
Concurrency Level: 10
Time taken for tests: 92.148883 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Keep-Alive requests: 0
Total transferred: 2722500 bytes
HTML transferred: 2701200 bytes
Requests per second: 1.09 [#/sec] (mean)
Time per request: 9214.888 [ms] (mean)
Time per request: 921.489 [ms] (mean, across all concurrent requests)
Transfer rate: 28.84 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 9089 9187 139.4 9140 9789
Waiting: 3067 3163 138.3 3117 3766
Total: 9089 9187 139.4 9140 9789
Percentage of the requests served within a certain time (ms)
50% 9140
66% 9178
75% 9189
80% 9201
90% 9281
95% 9560
98% 9739
99% 9789
100% 9789 (longest request)

每一个请求的响应旉大概d8-9U时_(d)q个是客h不能接受的?/div>
 
q时我们军_采用JDK5.0自带的jstack来进行trouble-shoot,首先重新做加压测试,q行h?0个,d100个请求,q时对Resin服务器所L(fng)Javaq程间隔10U用jstack做一ơ采集工作。ؓ(f)什么要间隔10U?主要是想看看在这三十U内Javaq程是否都阻塞在同一个地斏V结果如下:(x)
 
大部分的U程都阻塞在同一个java stack上面:

Thread t@38: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- com._xxx.vportal.common.rpc.session.RemoteServiceGroupFactory.getMaxBalanceFactoryEntry() @bci=165,
line=180 (Interpreted frame)
- com._xxx.vportal.common.rpc.session.RemoteServiceGroupFactory.getService() @bci=80, line=195 (Interpreted
frame)
- com._xxx.vportal.common.rpc.session.RemoteServiceFactory.getSynSender() @bci=1, line=331 (Interpreted
frame)
- com._xxx.vportal.common.rpc.session.RemoteServiceSupport.synRequestHardTask(java.lang.String,
java.lang.Object) @bci=6, line=35 (Interpreted frame)
- com._xxx.vportal.amus.user.client.UserClientRpcImpl.getIconSigner(int, int) @bci=36, line=90 (Interpreted frame)
- net._xxx.forum.model.user.UserInfo.getLogoPath() @bci=109, line=546 (Interpreted frame)
- sun.reflect.GeneratedMethodAccessor13.invoke(java.lang.Object, java.lang.Object[]) @bci=36 (Interpreted frame)
- sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6, line=25
(Compiled frame)
- org.apache.velocity.runtime.parser.node.ASTReference.execute(java.lang.Object,
org.apache.velocity.context.InternalContextAdapter) @bci=40, line=207 (Compiled frame)
- org.apache.velocity.runtime.parser.node.ASTBlock.render(org.apache.velocity.context.InternalContextAdapter,
java.io.Writer) @bci=18, line=94 (Compiled frame)
- org.apache.velocity.runtime.parser.node.SimpleNode.render(org.apache.velocity.context.InternalContextAdapter,
java.io.Writer) @bci=18, line=271 (Interpreted frame)
-
org.apache.velocity.runtime.parser.node.ASTIfStatement.render(org.apache.velocity.context.InternalContextAdapter,
java.io.Writer) @bci=63, line=128 (Interpreted frame)
- org.apache.velocity.runtime.parser.node.ASTBlock.render(org.apache.velocity.context.InternalContextAdapter,
java.io.Writer) @bci=18, line=94 (Compiled frame)
- org.apache.velocity.runtime.directive.Foreach.render(org.apache.velocity.context.InternalContextAdapter,
java.io.Writer, org.apache.velocity.runtime.parser.node.Node) @bci=95, line=344 (Interpreted frame)
- org.apache.velocity.runtime.parser.node.ASTDirective.render(org.apache.velocity.context.InternalContextAdapter,
java.io.Writer) @bci=14, line=153 (Interpreted frame)
- org.apache.velocity.runtime.parser.node.SimpleNode.render(org.apache.velocity.context.InternalContextAdapter,
java.io.Writer) @bci=18, line=271 (Interpreted frame)
- org.apache.velocity.app.Velocity.evaluate(org.apache.velocity.context.Context, java.io.Writer, java.lang.String,
java.io.Reader) @bci=102, line=359 (Interpreted frame)
- org.apache.velocity.app.Velocity.evaluate(org.apache.velocity.context.Context, java.io.Writer,
java.lang.String, java.lang.String) @bci=18, line=253 (Interpreted frame)
- net._xxx.forum.util.velocity.VelocityUtil.getVelocityEvaluate(java.util.Map, java.io.Writer,
java.lang.String) @bci=14, line=35 (Interpreted frame)
- net._xxx.forum.action.forum.BbsMessageListAction.go() @bci=1284, line=268 (Interpreted
frame)

net._xxx.forum.action.AbstractAction.execute() @bci=1, line=39 (

..............

 和应用的开发h员交后Q发现这些有问题的程序,都是和论坛系l中Socket调用有关Q当用户打开一个页面是Q页面中的用户信息需要同qSocket的方式调用相册那边的数据Q这个操作存在bugQ经q用L(fng)重新同步更新E序Q问题解冟?/div>
 
解决后的实测的数据如? 效果非常理想Q?/div>
This is ApacheBench, Version 2.0.41-dev <$Revision: 1.121.2.12 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 2006 The Apache Software Foundation, http://www.apache.org/
Benchmarking free.xxx.com (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
Completed 35000 requests
Completed 40000 requests
Completed 45000 requests
Finished 50000 requests
Server Software: Apache/2.0.59
Server Hostname: free.xxx.com
Server Port: 80
Document Path: /forum/bbsMessageList.act?bbsThreadId=1581280
Document Length: 27508 bytes
Concurrency Level: 30
Time taken for tests: 252.583749 seconds
Complete requests: 50000
Failed requests: 0
Write errors: 0
Total transferred: 1384158363 bytes
HTML transferred: 1375408188 bytes
Requests per second: 197.95 [#/sec] (mean)
Time per request: 151.550 [ms] (mean)
Time per request: 5.052 [ms] (mean, across all concurrent requests)
Transfer rate: 5351.56 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.4 0 11
Processing: 45 150 154.1 117 4349
Waiting: 41 145 153.7 112 4346
Total: 45 150 154.1 117 4349
Percentage of the requests served within a certain time (ms)
50% 117
66% 142
75% 163
80% 180
90% 241
95% 321
98% 478
99% 764
100% 4349 (longest re
2. 另外的一个是最q做的,我们有个教育行业斚w的ISV上来实验室做T2000的Benchmark实验Q我们花了一天的旉部v整个架构Q包括安装Solaris操作pȝQ应用服务器Q数据库?amp; amp; amp; lt; /div>
整个应用的架构如下:(x)
Tomcat + Jdk 1.5 + Oracle 10g
q行的操作系l?
Solaris 10 Update 3 (11/06), EIS patches?
试工具Q?/div>
LoadRunner 8.1
在实验的初段QTomcat, Oracle 10g服务器都是架讑֜T2000上,我们在对T2000服务器的OSQ网l,应用服务器做了必要的调整后,发现其表现还是不如人意?amp; #160;
 
我们使用Loadrunner做测试,用户上到?00个同时ƈ?0个P代时已经出现问题,有许多的h都被d住,不能正常地进行?/div>
 
q时我们军_使用jconsole和jstack来看看系l出C什么问题?/div>
A. 首先我们需要在Tomcat的启动脚本catalina.sh里面加入JVM选项Q?
     Dcom.sun.management.jmxremote
     把tomcat服务器javaq程|于JDK5.0的性能监控范围之内?/div>
 
B. 然后我们用jconsoleq接到tomcat服务器的javaq程Q发现基本上Heap size, 垃圾回收都比较正常,但发现tomcat服务器的大部分线E有问题Q都处于被Block的状态?
     观察每条U程的stack trace, 发现它们基本上都被堵塞在uk.org.primrose.pool.core.Pool.put和uk.org.primrose.pool.core.Pool.get()的SyncHack同步机制上,我们试了改大数据连接池的大,发现l果是一L(fng)?
jdk5_1
C.q个l论在jstack的结果中同样得到了验证,使用jstackq接到tomcat服务器javaq程Qƈ观察l果?
jdk5_2

D. 最后我们决定用tomcat服务器的q接池配|来代替Primrose数据库连接池Q更改以后,发现l果比较理想?/div>

E. 后来Q我们把Oracle数据库徏立在另外的一台服务器X4200上,而Tomcat应用服务器依然放在T2000上,使用千兆|络交换机,同样圎ͼ使用Tomcat服务器自qq接池配|表现较为理惟?/div>
以上两个是我对JDK5.0工具的一些实际操作的例子Q在q里和大家分享一下,希望对大家有所帮助。而Sun Microsystem公司也在不断地完善JDKQ在新的JDK版本里面加入来多的实用的方便开发者开发和调试的新Ҏ(gu),比如在最新的JDK6.0里面内嵌了Dtrace里面许多关于JavaE序中内存,Ҏ(gu)Q线E等{新的探针,通过q些探针和Dtrace,我们可以更加方便地调试JavaE序?/div>


]]>利用JAVA操作EXCEL文ghttp://www.aygfsteel.com/simie/archive/2007/07/08/128853.html和田?/dc:creator>和田?/author>Sun, 08 Jul 2007 02:18:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/08/128853.htmlhttp://www.aygfsteel.com/simie/comments/128853.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/08/128853.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/128853.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/128853.html使用Windows操作pȝ的朋友对ExcelQ电(sh)子表|一定不?x)陌生,但是要用Java语言来操UExcel文gq不是一件容易的事。在Web应用日益盛行的今天,通过Web来操作Excel文g的需求越来越强烈Q目前较为流行的操作是在JSP或Servlet 中创Z个CSV Qcomma separated valuesQ文Ӟq将q个文g以MIMEQtext/csvcdq回l浏览器Q接着览器调用Excelq且昄CSV文g。这样只是说可以讉K到Excel文gQ但是还不能真正的操UExcel文gQ本文将l大家一个惊喜,向大家介l一个开放源码项目,Java Excel APIQ用它大家可以方便地操纵Excel文g了?/blockquote>

JAVA EXCEL API?/span>

Java Excel是一开放源码项目,通过它Java开发h员可以读取Excel文g的内宏V创建新的Excel文g、更新已l存在的Excel文g。用该API非Windows操作pȝ也可以通过UJava应用来处理Excel数据表。因为是使用Java~写的,所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的讉K?/p>

现在发布的稳定版本是V2.0Q提供以下功能:(x)

  • 从Excel 95?7?000{格式的文g中读取数据;
  • dExcel公式Q可以读取Excel 97以后的公式)Q?
  • 生成Excel数据表(格式为Excel 97Q;
  • 支持字体、数字、日期的格式化;
  • 支持单元格的阴媄操作Q以?qing)颜色操作?
  • 修改已经存在的数据表Q?

现在q不支持以下功能Q但不久׃(x)提供了:(x)

  1. 不能够读取图表信息;
  2. 可以读,但是不能生成公式QQ何类型公式最后的计算值都可以dQ?




回页?/font>


应用CZ

1 从Excel文gd数据?/font>

Java Excel API既可以从本地文gpȝ的一个文?.xls)Q也可以从输入流中读取Excel数据表。读取Excel数据表的W一步是创徏Workbook(术语Q工作薄)Q下面的代码片段举例说明了应该如何操作:(x)(完整代码见ExcelReading.java)

import java.io.*;
            import jxl.*;
            … … … …
            try
            {
            //构徏Workbook对象, 只读Workbook对象
            //直接从本地文件创建Workbook
            //从输入流创徏Workbook
            InputStream is = new FileInputStream(sourcefile);
            jxl.Workbook rwb = Workbook.getWorkbook(is);
            }
            catch (Exception e)
            {
            e.printStackTrace();
            }
            

一旦创ZWorkbookQ我们就可以通过它来讉KExcel Sheet(术语Q工作表)。参考下面的代码片段Q?/p>
//获取W一张Sheet?
            Sheet rs = rwb.getSheet(0);
            

我们既可能通过Sheet的名U来讉K它,也可以通过下标来访问它。如果通过下标来访问的话,要注意的一Ҏ(gu)下标?开始,像数组一栗?/p>

一旦得CSheetQ我们就可以通过它来讉KExcel Cell(术语Q单元格)。参考下面的代码片段Q?/p>
//获取W一行,W一列的?
            Cell c00 = rs.getCell(0, 0);
            String strc00 = c00.getContents();
            //获取W一行,W二列的?
            Cell c10 = rs.getCell(1, 0);
            String strc10 = c10.getContents();
            //获取W二行,W二列的?
            Cell c11 = rs.getCell(1, 1);
            String strc11 = c11.getContents();
            System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
            System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
            System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());
            

如果仅仅是取得Cell的|我们可以方便地通过getContents()Ҏ(gu)Q它可以Q何类型的Cell值都作ؓ(f)一个字W串q回。示例代码中Cell(0, 0)是文本型QCell(1, 0)是数字型QCell(1,1)是日期型Q通过getContents()Q三U类型的q回值都是字W型?/p>

如果有需要知道Cell内容的确切类型,API也提供了一pd的方法。参考下面的代码片段Q?/p>
String strc00 = null;
            double strc10 = 0.00;
            Date strc11 = null;
            Cell c00 = rs.getCell(0, 0);
            Cell c10 = rs.getCell(1, 0);
            Cell c11 = rs.getCell(1, 1);
            if(c00.getType() == CellType.LABEL)
            {
            LabelCell labelc00 = (LabelCell)c00;
            strc00 = labelc00.getString();
            }
            if(c10.getType() == CellType.NUMBER)
            {
            NmberCell numc10 = (NumberCell)c10;
            strc10 = numc10.getValue();
            }
            if(c11.getType() == CellType.DATE)
            {
            DateCell datec11 = (DateCell)c11;
            strc11 = datec11.getDate();
            }
            System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
            System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
            System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());
            

在得到Cell对象后,通过getType()Ҏ(gu)可以获得该单元格的类型,然后与API提供的基本类型相匚wQ强制{换成相应的类型,最后调用相应的取值方法getXXX()Q就可以得到定cd的倹{API提供了以下基本类型,与Excel的数据格式相对应Q如下图所C:(x)




每种cd的具体意义,请参见Java Excel API Document?/p>

当你完成对Excel?sh)子表格数据的处理后Q一定要使用close()Ҏ(gu)来关闭先前创建的对象Q以释放d数据表的q程中所占用的内存空_(d)在读取大量数据时昑־ؓ(f)重要。参考如下代码片D:(x)

//操作完成Ӟ关闭对象Q释攑֍用的内存I间
            rwb.close();
            

Java Excel API提供了许多访问Excel数据表的Ҏ(gu)Q在q里我只要地介绍几个常用的方法,其它的方法请参考附录中的Java Excel API Document?/p>

WorkbookcL供的Ҏ(gu)

1. int getNumberOfSheets()
获得工作薄(WorkbookQ中工作表(SheetQ的个数Q示例:(x)

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            int sheets = rwb.getNumberOfSheets();
            

2. Sheet[] getSheets()
q回工作薄(WorkbookQ中工作表(SheetQ对象数l,CZQ?

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            Sheet[] sheets = rwb.getSheets();
            

3. String getVersion()
q回正在使用的API的版本号Q好像是没什么太大的作用?

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            String apiVersion = rwb.getVersion();
            

Sheet接口提供的方?/strong>

1) String getName()
获取Sheet的名UͼCZQ?

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            String sheetName = rs.getName();
            

2) int getColumns()
获取Sheet表中所包含的d敎ͼCZQ?

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            int rsColumns = rs.getColumns();
            

3) Cell[] getColumn(int column)
获取某一列的所有单元格Q返回的是单元格对象数组Q示例:(x)

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            Cell[] cell = rs.getColumn(0);
            

4) int getRows()
获取Sheet表中所包含的总行敎ͼCZQ?

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            int rsRows = rs.getRows();
            

5) Cell[] getRow(int row)
获取某一行的所有单元格Q返回的是单元格对象数组Q示例子Q?

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            Cell[] cell = rs.getRow(0);
            

6) Cell getCell(int column, int row)
获取指定单元格的对象引用Q需要注意的是它的两个参敎ͼW一个是列数Q第二个是行敎ͼq与通常的行、列l合有些不同?

jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            Cell cell = rs.getCell(0, 0);
            

2 生成新的Excel工作?/font>

下面的代码主要是向大家介l如何生成简单的Excel工作表,在这里单元格的内Ҏ(gu)不带M修饰?如:(x)字体Q颜色等{?Q所有的内容都作为字W串写入?完整代码见ExcelWriting.java)

与读取Excel工作表相|首先要用Workbookcȝ工厂Ҏ(gu)创徏一个可写入的工作薄(Workbook)对象Q这里要注意的是Q只能通过API提供的工厂方法来创徏WorkbookQ而不能用WritableWorkbook的构造函敎ͼ因ؓ(f)cWritableWorkbook的构造函Cؓ(f)protectedcd。示例代码片D如下:(x)

import java.io.*;
            import jxl.*;
            import jxl.write.*;
            … … … …
            try
            {
            //构徏Workbook对象, 只读Workbook对象
            //Method 1Q创建可写入的Excel工作?
            jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));
            //Method 2Q将WritableWorkbook直接写入到输出流
            /*
            OutputStream os = new FileOutputStream(targetfile);
            jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);
            */
            }
            catch (Exception e)
            {
            e.printStackTrace();
            }
            

API提供了两U方式来处理可写入的输出,一U是直接生成本地文gQ如果文件名不带全\径的话,~省的文件会(x)定位在当前目录,如果文g名带有全路径的话Q则生成的Excel文g则会(x)定位在相应的目录Q另外一U是Excel对象直接写入到输出流Q例如:(x)用户通过览器来讉KWeb服务器,如果HTTP头设|正的话,览器自动调用客L(fng)的Excel应用E序Q来昄动态生成的Excel?sh)子表格?/p>

接下来就是要创徏工作表,创徏工作表的Ҏ(gu)与创建工作薄的方法几乎一P同样是通过工厂模式Ҏ(gu)获得相应的对象,该方法需要两个参敎ͼ一个是工作表的名称Q另一个是工作表在工作薄中的位|,参考下面的代码片段Q?/p>
//创徏Excel工作?
            jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);
            

"q锅也支好了Q材料也准备齐全了,可以开始下锅了Q?Q现在要做的只是实例化API所提供的Excel基本数据cdQƈ它们添加到工作表中可以了Q参考下面的代码片段Q?/p>
//1.dLabel对象
            jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell");
            ws.addCell(labelC);
            //d带有字型Formatting的对?
            jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
            jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);
            jxl.write.Label labelCF = new jxl.write.Label(1, 0, "This is a Label Cell", wcfF);
            ws.addCell(labelCF);
            //d带有字体颜色Formatting的对?
            jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
            UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
            jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
            jxl.write.Label labelCFC = new jxl.write.Label(1, 0, "This is a Label Cell", wcfFC);
            ws.addCell(labelCF);
            //2.dNumber对象
            jxl.write.Number labelN = new jxl.write.Number(0, 1, 3.1415926);
            ws.addCell(labelN);
            //d带有formatting的Number对象
            jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
            jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);
            jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
            ws.addCell(labelNF);
            //3.dBoolean对象
            jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);
            ws.addCell(labelB);
            //4.dDateTime对象
            jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());
            ws.addCell(labelDT);
            //d带有formatting的DateFormat对象
            jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
            jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);
            jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.util.Date(), wcfDF);
            ws.addCell(labelDTF);
            

q里有两点大家要引v大家的注意。第一点,在构造单元格Ӟ单元格在工作表中的位|就已经定了。一旦创建后Q单元格的位|是不能够变更的Q尽单元格的内Ҏ(gu)可以改变的。第二点Q单元格的定位是按照下面q样的规?column, row)Q而且下标都是?开始,例如QA1被存储在(0, 0)QB1被存储在(1, 0)?/p>

最后,不要忘记关闭打开的Excel工作薄对象,以释攑֍用的内存Q参见下面的代码片段Q?/p>
//写入Exel工作?
            wwb.write();
            //关闭Excel工作薄对?
            wwb.close();
            

q可能与dExcel文g的操作有少不同Q在关闭Excel对象之前Q你必须要先调用write()Ҏ(gu)Q因为先前的操作都是存储在缓存中的,所以要通过该方法将操作的内容保存在文g中。如果你先关闭了Excel对象Q那么只能得C张空的工作薄了?/p>

3 拯、更新Excel工作?/font>

接下来简要介l一下如何更C个已l存在的工作薄,主要是下面二步操作,W一步是构造只ȝExcel工作薄,W二步是利用已经创徏的Excel工作薄创建新的可写入的Excel工作薄,参考下面的代码片段Q?完整代码见ExcelModifying.java)

//创徏只读的Excel工作薄的对象
            jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourcefile));
            //创徏可写入的Excel工作薄对?
            jxl.write.WritableWorkbook  wwb = Workbook.createWorkbook(new File(targetfile), rw);
            //dW一张工作表
            jxl.write.WritableSheet ws = wwb.getSheet(0);
            //获得W一个单元格对象
            jxl.write.WritableCell wc = ws.getWritableCell(0, 0);
            //判断单元格的cd, 做出相应的{?
            if(wc.getType() == CellType.LABEL)
            {
            Label l = (Label)wc;
            l.setString("The value has been modified.");
            }
            //写入Excel对象
            wwb.write();
            //关闭可写入的Excel对象
            wwb.close();
            //关闭只读的Excel对象
            rw.close();
            

之所以用这U方式构建Excel对象Q完全是因ؓ(f)效率的原因,因ؓ(f)上面的示例才是API的主要应用。ؓ(f)了提高性能Q在d工作表时Q与数据相关的一些输Z息,所有的格式信息Q如Q字体、颜色等{,是不被处理的Q因为我们的目的是获得行数据的|既没有了修饎ͼ也不?x)对行数据的g生什么媄响。唯一的不利之处就是,在内存中?x)同时保存两个同L(fng)工作表,q样当工作表体积比较大时Q会(x)占用相当大的内存Q但现在好像内存的大ƈ不是什么关键因素了?/p>

一旦获得了可写入的工作表对象,我们可以对单元格对象进行更新的操作了,在这里我们不必调用API提供的add()Ҏ(gu)Q因为单元格已经于工作表当中Q所以我们只需要调用相应的setXXX()Ҏ(gu)Q就可以完成更新的操作了?/p>

单元格原有的格式化修饰是不能去掉的Q我们还是可以将新的单元g饰加上去Q以使单元格的内容以不同的Ş式表现?/p>

新生成的工作表对象是可写入的Q我们除了更新原有的单元格外Q还可以d新的单元格到工作表中Q这与示?的操作是完全一L(fng)?/p>

最后,不要忘记调用write()Ҏ(gu)Q将更新的内容写入到文g中,然后关闭工作薄对象,q里有两个工作薄对象要关闭,一个是只读的,另外一个是可写入的?/p>



回页?/font>


本文只是对Java Excel API中常用的Ҏ(gu)作了介绍Q要x详尽C解APIQ请大家参考API文档Q或源代码。Java Excel API是一个开放源码项目,请大家关注它的最新进展,有兴的朋友也可以申请加入这个项目,或者是提出宝贵的意见?/p>

参考资?

  1. Java Excel API 文档
  2. http://www.andykhan.com/jexcelapi/


关于作?/span>

 

叫我Rubber吧,我是一个JavaqP希望我们能成为朋友,我的EamilQ?tim@trend.com.cnQ我的联pȝ(sh)?755-83501377



]]>
Java Web Start入门基础教程http://www.aygfsteel.com/simie/archive/2007/07/06/128526.html和田?/dc:creator>和田?/author>Fri, 06 Jul 2007 03:34:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/06/128526.htmlhttp://www.aygfsteel.com/simie/comments/128526.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/06/128526.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/128526.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/128526.html阅读全文

]]>
java中四U操作xml方式的比?/title><link>http://www.aygfsteel.com/simie/archive/2007/07/06/128525.html</link><dc:creator>和田?/dc:creator><author>和田?/author><pubDate>Fri, 06 Jul 2007 03:31:00 GMT</pubDate><guid>http://www.aygfsteel.com/simie/archive/2007/07/06/128525.html</guid><wfw:comment>http://www.aygfsteel.com/simie/comments/128525.html</wfw:comment><comments>http://www.aygfsteel.com/simie/archive/2007/07/06/128525.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/simie/comments/commentRss/128525.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/simie/services/trackbacks/128525.html</trackback:ping><description><![CDATA[ <strong>1. 介绍</strong> <p>    <strong>1QDOMQJAXP Crimson解析器)</strong></p> <p>    DOM是用与^台和语言无关的方式表CXML文档的官方W3C标准。DOM是以层次l构l织的节Ҏ(gu)信息片断的集合。这个层ơ结构允许开发h员在?wi)中L特定信息。分析该l构通常需要加载整个文档和构造层ơ结构,然后才能做Q何工作。由于它是基于信息层ơ的Q因而DOM被认为是Z?wi)或Z对象的。DOM以及(qing)q义的基于树(wi)的处理具有几个优炏V首先,׃?wi)在内存中是持久的,因此可以修改它以便应用程序能?gu)据和l构作出更改。它q可以在M时候在?wi)中上下DQ而不是像SAX那样是一ơ性的处理。DOM使用h也要单得多?/p> <p>    <strong>2QSAX</strong></p> <p>    SAX处理的优炚w常类g媒体的优点。分析能够立卛_始,而不是等待所有的数据被处理。而且Q由于应用程序只是在d数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优炏V事实上Q应用程序甚至不必解析整个文档;它可以在某个条g得到满时停止解析。一般来_(d)SAXq比它的替代者DOM快许多?/p> <p>    选择DOMq是选择SAXQ?对于需要自q写代码来处理XML文档的开发h员来_(d) 选择DOMq是SAX解析模型是一个非帔R要的设计决策?DOM采用建立?wi)Şl构的方式访问XML文档Q而SAX采用的事件模型?/p> <p>    DOM解析器把XML文档转化Z个包含其内容的树(wi)Qƈ可以Ҏ(gu)(wi)q行遍历。用DOM解析模型的优Ҏ(gu)~程Ҏ(gu)Q开发h员只需要调用徏?wi)的指o(h)Q然后利用navigation APIs讉K所需的树(wi)节点来完成Q务。可以很Ҏ(gu)的添加和修改?wi)中的元素。然而由于用DOM解析器的时候需要处理整个XML文档Q所以对性能和内存的要求比较高,其是遇到很大的XML文g的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频J的改变的服务中?/p> <p>    SAX解析器采用了Z事g的模型,它在解析XML文档的时候可以触发一pd的事Ӟ当发现给定的tag的时候,它可以激zM个回调方法,告诉该方法制定的标签已经扑ֈ。SAX对内存的要求通常?x)比较低Q因为它让开发h员自己来军_所要处理的tag.特别是当开发h员只需要处理文档中所包含的部分数据时QSAXq种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会(x)比较困难Q而且很难同时讉K同一个文档中的多处不同数据?/p> <p>    <strong>3QJDOM </strong><a ><strong><u><font color=#0000ff>http://www.jdom.org</font></u></strong></a></p> <p>    JDOM的目的是成ؓ(f)Java特定文档模型Q它化与XML的交互ƈ且比使用DOM实现更快。由于是W一个Java特定模型QJDOM一直得到大力推q和促进。正在考虑通过“Java规范hJSR-102”它最l用?#8220;Java标准扩展”。从2000q初已l开始了JDOM开发?/p> <p>    JDOM与DOM主要有两斚w不同。首先,JDOM仅用具体类而不使用接口。这在某些方面简化了APIQ但是也限制了灵zL。第二,API大量使用了Collectionsc,化了那些已经熟?zhn)q些cȝJava开发者的使用?/p> <p>    JDOM文档声明其目的是“使用20%Q或更少Q的_֊解决80%Q或更多QJava/XML问题”Q根据学?fn)曲U假定ؓ(f)20%Q。JDOM对于大多数Java/XML应用E序来说当然是有用的Qƈ且大多数开发者发现API比DOMҎ(gu)理解得多。JDOMq包括对E序行ؓ(f)的相当广泛检查以防止用户做Q何在XML中无意义的事。然而,它仍需要?zhn)充分理解XML以便做一些超出基本的工作Q或者甚至理解某些情况下的错误)。这也许是比学习(fn)DOM或JDOM接口都更有意义的工作?/p> <p>    JDOM自n不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档Q尽它q可以将以前构造的DOM表示作ؓ(f)输入Q。它包含一些{换器以将JDOM表示输出成SAX2事g、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码?/p> <p>    <strong>4QDOM4J </strong><a ><strong><u><font color=#0000ff>http://dom4j.sourceforge.net</font></u></strong></a></p> <p>    虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一U智能分支。它合ƈ了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及(qing)用于大文档或化文档的基于事件的处理。它q提供了构徏文档表示的选项Q它通过DOM4J API和标准DOM接口hq行讉K功能。从2000下半q开始,它就一直处于开发之中?/p> <p>    为支持所有这些功能,DOM4J使用接口和抽象基本类Ҏ(gu)。DOM4J大量使用了API中的Collectionsc,但是在许多情况下Q它q提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是Q虽然DOM4J付出了更复杂的API的代P但是它提供了比JDOM大得多的灉|性?/p> <p>    在添加灵zL、XPath集成和对大文档处理的目标ӞDOM4J的目标与JDOM是一L(fng)Q针对Java开发者的易用性和直观操作。它q致力于成ؓ(f)比JDOM更完整的解决Ҏ(gu)Q实现在本质上处理所有Java/XML问题的目标。在完成该目标时Q它比JDOM更少防止不正的应用E序行ؓ(f)?/p> <p>    DOM4J是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的Y件。如今你可以看到来多的Java软g都在使用DOM4J来读写XMLQ特别值得一提的是连Sun的JAXM也在用DOM4J.</p> <p>   <strong> 2…… 比较</strong></p> <p>    1QDOM4J性能最好,qSun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4JQ例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文g。如果不考虑可移植性,那就采用DOM4J.</p> <p>    2QJDOM和DOM在性能试时表C佻I在测?0M文档时内存溢出。在文档情况下q值得考虑使用DOM和JDOM.虽然JDOM的开发者已l说明他们期望在正式发行版前专注性能问题Q但是从性能观点来看Q它实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现q泛应用于多U编E语a。它q是许多其它与XML相关的标准的基础Q因为它正式获得W3C推荐Q与Z非标准的Java模型相对Q,所以在某些cd的项目中可能也需要它Q如在JavaScript中用DOMQ?/p> <p>    3QSAX表现较好Q这要依赖于它特定的解析方式Q事仉动。一个SAX即到来的XML,但ƈ没有载入到内存(当然当XML被dӞ?x)有部分文档暂时隐藏在内存中Q?/p> 3. <span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">四种</span><span lang=EN-US style="COLOR: black"><font face="Times New Roman">xml</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作方式的基本用方?/span><span lang=EN-US style="COLOR: black"><font face="Times New Roman"> <br><br>xml</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文gQ?br clear=all></span><span lang=EN-US style="COLOR: black"><font face="Times New Roman"><br style="mso-special-character: line-break"><br style="mso-special-character: line-break"><o:p></o:p></font></span> <div style="BORDER-RIGHT: #cccccc 0.75pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #cccccc 0.75pt solid; PADDING-LEFT: 4pt; BACKGROUND: #fdfddf; PADDING-BOTTOM: 4pt; BORDER-LEFT: #cccccc 0.75pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: #cccccc 0.75pt solid"> <p class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; MARGIN: 3.75pt 15pt; BORDER-LEFT: medium none; WORD-BREAK: break-all; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none; mso-border-alt: solid #CCCCCC .75pt; mso-padding-alt: 4.0pt 4.0pt 4.0pt 4.0pt"><font size=3><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">?xml version="1.0" encoding="GB2312"?</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">RESULT</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">VALUE</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> </span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">NO</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">A1234</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">/NO</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> </span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">ADDR</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q四川省</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">X</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">D?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">P</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">/ADDR</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">/VALUE</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">VALUE</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> </span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">NO</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">B1234</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">/NO</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma"> </span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> </span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma"> Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">ADDR</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q四川省</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">l<</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">/ADDR</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">/VALUE</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">/RESULT</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br><br>1</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">DOM <br><br>import java.io.*; <br>import java.util.*; <br>import org.w3c.dom.*; <br>import javax.xml.parsers.*; <br><br>public class MyXMLReader{ <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma"> </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">public static void main(String arge[]){ <br><br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">long lasting =System.currentTimeMillis(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">try{ <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">File f=new File("data_10k.xml"); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">DocumentBuilder builder=factory.newDocumentBuilder(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">Document doc = builder.parse(f); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">NodeList nl = doc.getElementsByTagName("VALUE"); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">for (int i=0;i</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">nl.getLength();i++){ <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">    </span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.print("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">车牌L(fng)</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue()); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">    </span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.println("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">车主地址</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue()); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma"> </span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> </span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma"> </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">} <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">}catch(Exception e){ <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">e.printStackTrace(); <br>} <br><br>2</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">SAX <br><br>import org.xml.sax.*; <br>import org.xml.sax.helpers.*; <br>import javax.xml.parsers.*; <br><br>public class MyXMLReader extends DefaultHandler { <br><br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma"> </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">java.util.Stack tags = new java.util.Stack(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma"> </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">public MyXMLReader() { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">super(); <br>} <br><br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma"> </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">public static void main(String args[]) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">long lasting = System.currentTimeMillis(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">try { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">SAXParserFactory sf = SAXParserFactory.newInstance(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">SAXParser sp = sf.newSAXParser(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">MyXMLReader reader = new MyXMLReader(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">sp.parse(new InputSource("data_10k.xml"), reader); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">} catch (Exception e) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">e.printStackTrace(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">} <br><br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.println("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">q行旉Q?/span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">" + (System.currentTimeMillis() - lasting) + "</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">毫秒</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">");} <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">public void characters(char ch[], int start, int length) throws SAXException { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">String tag = (String) tags.peek(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">if (tag.equals("NO")) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.print("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">车牌L(fng)Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">" + new String(ch, start, length)); <br>} <br>if (tag.equals("ADDR")) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.println("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">地址</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">:" + new String(ch, start, length)); <br>} <br>} <br><br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">public void startElement(String uri,String localName,String qName,Attributes attrs) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">tags.push(qName);} <br>} <br><br>3</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> JDOM <br><br>import java.io.*; <br>import java.util.*; <br>import org.jdom.*; <br>import org.jdom.input.*; <br><br>public class MyXMLReader { <br><br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma"> </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">public static void main(String arge[]) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">long lasting = System.currentTimeMillis(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">try { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">SAXBuilder builder = new SAXBuilder(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">Document doc = builder.build(new File("data_10k.xml")); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">Element foo = doc.getRootElement(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">List allChildren = foo.getChildren(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">for(int i=0;i</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">allChildren.size();i++) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">    </span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.print("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">车牌L(fng)</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">:" + ((Element)allChildren.get(i)).getChild("NO").getText()); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">    </span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.println("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">车主地址</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">:" + ((Element)allChildren.get(i)).getChild("ADDR").getText()); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">} <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">} catch (Exception e) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">e.printStackTrace(); <br>} <br><br>} <br><br>4</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">Q?/span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">DOM4J <br><br>import java.io.*; <br>import java.util.*; <br>import org.dom4j.*; <br>import org.dom4j.io.*; <br><br>public class MyXMLReader { <br><br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma"> </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">public static void main(String arge[]) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">long lasting = System.currentTimeMillis(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">try { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">File f = new File("data_10k.xml"); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">SAXReader reader = new SAXReader(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">Document doc = reader.read(f); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">Element root = doc.getRootElement(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">Element foo; <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">for (Iterator i = root.elementIterator("VALUE"); i.hasNext()<v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"> <v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shape id=_x0000_i1025 style="WIDTH: 24pt; HEIGHT: 24pt" alt="" type="#_x0000_t75"></v:shape>{ <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">    </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">foo = (Element) i.next(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">    </span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.print("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">车牌L(fng)</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">:" + foo.elementText("NO")); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">    </span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.println("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">车主地址</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">:" + foo.elementText("ADDR")); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">} <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">  </span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">} catch (Exception e) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">   </span></em></strong></font><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"><font size=3>e.printStackTrace(); <br>} <br>) <o:p></o:p></font></span></em></strong></p> </div> <img src ="http://www.aygfsteel.com/simie/aggbug/128525.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/simie/" target="_blank">和田?/a> 2007-07-06 11:31 <a href="http://www.aygfsteel.com/simie/archive/2007/07/06/128525.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个读取xml文g内容的类http://www.aygfsteel.com/simie/archive/2007/07/03/127844.html和田?/dc:creator>和田?/author>Tue, 03 Jul 2007 06:55:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/03/127844.htmlhttp://www.aygfsteel.com/simie/comments/127844.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/03/127844.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127844.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127844.htmlpackage project.util.xml;

import java.io.*;
import java.util.*;
import javax.servlet.http.*;
import org.apache.log4j.*;
import org.jdom.*;
import org.jdom.input.*;

/**
* <p>Title: <font color="steelblue" size="10">dxml文g信息</font></p>
* <p>Description: <font color="steelblue">从XML配置文g中获得配|信息。excerpt form jdom?lt;/font></p>
* <p>Copyright: <font color="steelblue">Copyright (c) 2004</font></p>
* <p>Company: <font color="steelblue">Harmonious</font></p>
* @author <font color="steelblue">TZL</font>
* @version <font color="steelblue">1.0</font>
*/

public class XMLReader {
/*
#讄根的输出配置Q格式ؓ(f) "info [2004-05-01 22:35:30] [name]logname(b.c) [line] 86 msg-->log信息"
log4j.rootLogger=DEBUG, rootAppender
log4j.appender.rootAppender=org.apache.log4j.RollingFileAppender
log4j.appender.rootAppender.File=e:/MapXtremeSmpl.log
log4j.appender.rootAppender.MaxFileSize=1000KB
log4j.appender.rootAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.rootAppender.layout.ConversionPattern=%-5p [%d{yyyy-mm-dd HH:mm:ss}] [name] %c{2} [line] %L msg--> %m%n
*/
static public Logger log = Logger.getLogger(XMLReader.class);
protected Element m_RootElement = null;
protected String m_webAppPath = null;

/**
* <font color="orange">构造函数?lt;/font>
* @param xmlFile <font color="steelblue">要读取的配置文g的绝对\径?lt;/font>
*/
public XMLReader(String xmlFile) {
m_webAppPath = null;
try {
PatternLayout layout = new PatternLayout("%-5p %d{yyyy-MM-dd HH:mm:ss} [name] %c{2} [line] %L [msg] %m%n");
ConsoleAppender appender = new ConsoleAppender(/*new SimpleLayout(),*/layout, "System.err");
log.addAppender(appender);

SAXBuilder builder = new SAXBuilder();
documentQnbspdoc = null;
doc = builder.build(new FileInputStream(xmlFile));
m_RootElement = doc.getRootElement();
}
catch (IOException ex) {
log.error("XMLReader构造时出现IO错误:" + ex.toString());
}
catch (JDOMException ex1) {
log.error("XMLReader构造时分析XML文g出错:" + ex1.toString());
}
catch (Exception ex) {
log.error("XMLReader 构造出?" + ex.toString());
}
}

/**
* <font color="orange">构造函数。配|文件必L定ؓ(f)发布的应用的根目录下?XmlConfig/Config.xml?lt;/font>
* @param servletObj <font color="steelblue">随便一个HttpServlet对象?lt;/font>
*/
public XMLReader(HttpServlet servletObj) {
m_webAppPath = servletObj.getServletContext().getRealPath("/");
String configFileName = m_webAppPath + "XmlConfig/Config.xml";

try {
PatternLayout layout = new PatternLayout("%-5p %d{yyyy-MM-dd HH:mm:ss} [name] %c{2} [line] %L [msg] %m%n");
ConsoleAppender appender = new ConsoleAppender( /*new SimpleLayout(),*/layout, "System.err");
log.addAppender(appender);

SAXBuilder builder = new SAXBuilder();
documentQnbspdoc = null;
doc = builder.build(new FileInputStream(configFileName));
m_RootElement = doc.getRootElement();
}
catch (IOException ex) {
log.error("XMLReader构造时出现IO错误Q?XmlConfig/Config.xmlQ?" + ex.toString());
}
catch (JDOMException ex1) {
log.error("XMLReader构造时分析XML文g出错Q?XmlConfig/Config.xmlQ?" + ex1.toString());
}
catch (Exception ex) {
log.error("XMLReader构造出错(/XmlConfig/Config.xmlQ?" + ex.toString());
}
}

/**
* <font color="orange">web应用发布在web服务器的l对路径根目录,最后已l有目录分割W?lt;/font>
* @return <font color="tomato">q回web应用发布在web服务器的l对路径的根目录?lt;/font>
*/
public String getWebAppPath() {
return m_webAppPath;
}

/**
* <font color="orange">从配|文件中获得配置信息?lt;/font>
* @param key <font color="steelblue">要获取的配置名称?lt;/font>
* @param curRootName <font color="steelblue">查找的v始节点名Uͼ如果为null从根开始查找?lt;/font>
* @return <font color="tomato">配置的字W串?lt;/font>
*/
public String getElementvalue(String curRootName, String key) {
String value = null;
Element curRoot = getElement(null, curRootName);
if (null == curRoot) {
curRoot = m_RootElement;
}
Element keyNode = getElement(curRoot, key);
if (null != keyNode) {
value = keyNode.getTextTrim();

}
return value;
}

/**
* <font color="orange">Ҏ(gu)名字获得节点。广度遍历,递归调用?lt;/font>
* @param nodeName <font color="steelblue">节点的名字?lt;/font>
* @param curRoot <font color="steelblue"> 从开始查扄起始节点Q如果ؓ(f)null从根开始查找?lt;/font>
* @return <font color="tomato">q回从指定节点下扑ֈ的第一个节炏V如果没有返回null?lt;/font>
*/
private Element getElement(Element curRoot, String nodeName) {
Element retElement = null;

if (null == nodeName)
return m_RootElement;

if (null == curRoot) {
curRoot = m_RootElement;
}

if (null != curRoot) {
retElement = curRoot.getChild(nodeName);
if (null == retElement) {
List nestElements = curRoot.getChildren();
Iterator iterator = nestElements.iterator();
while (iterator.hasNext() && null == retElement) {
retElement = getElement( (Element) iterator.next(), nodeName);
}
}
}

return retElement;
}

/**
* <font color="orange">获得指定节点的属性?lt;/font>
* @param elementName <font color="steelblue">节点的名U?lt;/font>
* @param attName <font color="steelblue">要获得的属性的名称?lt;/font>
* @return <font color="tomato">要查扄属性的倹{?lt;/font>
*/
public String getElementAtrribute(String elementName, String attName)
{
Element el = getElement(null, elementName);
if (null == el)
return null;

return el.getAttributevalue(attName);
}

}

]]>
从网上抓取指定URL源码的方?/title><link>http://www.aygfsteel.com/simie/archive/2007/07/03/127841.html</link><dc:creator>和田?/dc:creator><author>和田?/author><pubDate>Tue, 03 Jul 2007 06:52:00 GMT</pubDate><guid>http://www.aygfsteel.com/simie/archive/2007/07/03/127841.html</guid><wfw:comment>http://www.aygfsteel.com/simie/comments/127841.html</wfw:comment><comments>http://www.aygfsteel.com/simie/archive/2007/07/03/127841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/simie/comments/commentRss/127841.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/simie/services/trackbacks/127841.html</trackback:ping><description><![CDATA[<strong>引言<br></strong>  在做无线目的时候,与通讯公司的数据通讯有一部分是通过Q݋Q交互的Q所以必要动态抓取通讯公司提供的固定的Internet上的数据Q便研究了一下如何抓取固定url上的数据Q现与大家分享一下?br><br>  cdGetPageCodeQ有一个方法GetSourceQ通过属性传递参敎ͼ入参控制的是要取得URL的地址Q代理服务器的设|及(qing)输出方式的控Ӟq里大家可以再扩展自q需要,我这里只提供了两U方式,一U是直接写到本地的某个文件中Q另外一U就是返回字W串的。类里已l作了比较详l的注释Q我惛_家很Ҏ(gu)q明白了,如果实在不明白, 那就msn上问吧Q݋QIQyubo@x263.net?br><br>  调用方式Q?br>  #region 试获取q程|页<br><br><br> <table borderColor=#666666 cellSpacing=4 borderColorDark=#cccccc cellPadding=0 width="100%" bgColor=#cccccc borderColorLight=#666666 border=1> <tbody> <tr> <td style="WORD-BREAK: break-all" align=left><br>GetPageCode gpc = new GetPageCode();<br>  gpc.Url="http://ppcode.com";<br>  gpc.ProxyState=1;//使用代理服务器,0Z使用Q设|ؓ(f)1后下面的代理讄才v作用<br>  gpc.ProxyAddress="http://proxyName.com";//代理服务器地址<br>  gpc.ProxyPort="80";//代理服务器的端口<br>  gpc.ProxyAccount="proxy";//代理服务器̎?br>  gpc.ProxyPassword="password";//代理服务器密?br>  gpc.ProxyDomain="bqc";//代理服务器域<br>  gpc.OutFilePath=filePath;//讄输出文g路径的地方,如果不设|,则返回字W串<br>  gpc.GetSource();//处理<br>  string tempErr=gpc.NoteMessage;//如果出错Q这里会(x)提示<br>  string tempCode=gpc.OutString;//q回的字W串<br>  #endregion<br>  cM码:(x)<br>  using System;<br>  using System.Collections;<br>  using System.ComponentModel;<br>  using System.Data;<br>  using System.Drawing;<br>  using System.IO;<br>  using System.Net;<br>  using System.Text;<br>  using System.Web;<br>  namespace Test.Com<br>  {<br>   /// <summary><br>   /// 功能Q取得Internet上的URL늚源码<br>   /// 创徏Q?004-03-22<br>   /// 作者:(x)Rexsp MSN:yubo@x263.net<br>  /// </summary><br>   public class GetPageCode<br>   {<br>   #region U有变量<br>  /// <summary><br>  /// |页URL地址<br>  /// </summary><br>  private string url=null;<br>  /// <summary><br>  /// 是否使用代码服务器:(x)0 不?nbsp; 1 使用代理服务?br>  /// </summary><br>  private int proxyState=0;<br>  /// <summary><br>  /// 代理服务器地址<br>  /// </summary><br>  private string proxyAddress=null;<br>  /// <summary><br>  /// 代理服务器端?br>  /// </summary><br>  private string proxyPort=null;<br>  /// <summary><br>  /// 代理服务器用户名<br>  /// </summary><br>  private string proxyAccount=null;<br>  /// <summary><br>  /// 代理服务器密?br>  /// </summary><br>  private string proxyPassword=null;<br>  /// <summary><br>  /// 代理服务器域<br>  /// </summary><br>  private string proxyDomain=null;<br> /// <summary><br>  /// 输出文g路径<br>  /// </summary><br>  private string outFilePath=null;<br>  /// <summary><br>  /// 输出的字W串<br>  /// </summary><br>  private string outString=null;<br>  /// <summary><br>  /// 提示信息<br>  /// </summary><br>  private string noteMessage;<br><br>  #endregion<br><br>  #region 公共属?br>  /// <summary><br>  /// Ʋ读取的URL地址<br>  /// </summary><br>  public string Url<br>  {<br>   get{return url;}<br>   set{url=value;}<br>  }<br>  /// <summary><br>  /// 是否使用代理服务器标?br>  /// </summary><br>  public int ProxyState<br>  {<br>   get{return proxyState;}<br>   set{proxyState=value;}<br>  }<br>  /// <summary><br>  /// 代理服务器地址<br>  /// </summary><br>  public string ProxyAddress<br>  {<br>   get{return proxyAddress;}<br>   set{proxyAddress=value;}<br>  }<br>  /// <summary><br><br>  /// 代理服务器端?br>  /// </summary><br>  public string ProxyPort<br>  {<br>   get{return proxyPort;}<br>   set{proxyPort=value;}<br>  }<br>  /// <summary><br>  /// 代理服务器̎?br>  /// </summary><br>  public string ProxyAccount<br>  {<br>   get{return proxyAccount;}<br>   set{proxyAccount=value;}<br>  }<br>  /// <summary><br>  /// 代理服务器密?br>  /// </summary><br>  public string ProxyPassword<br>  {<br>   get{return proxyPassword;}<br>   set{proxyPassword=value;}<br>  }<br>  /// <summary><br>  /// 代理服务器域<br>  /// </summary><br>  public string ProxyDomain<br>  {<br>   get{return proxyDomain;}<br>   set{proxyDomain=value;}<br>  }<br>  /// <summary><br>  /// 输出文g路径<br>  /// </summary><br>  public string OutFilePath<br>  {<br>   get{return outFilePath;}<br><br>  set{outFilePath=value;}<br>  }<br>  /// <summary><br>  /// q回的字W串<br>  /// </summary><br>  public string OutString<br>  {<br>   get{return outString;}<br>   <br>  }<br>  /// <summary><br>  /// q回提示信息<br>  /// </summary><br>  public string NoteMessage<br>  {<br>   get{return noteMessage;}<br>   <br>  }<br>  <br>  #endregion<br>  <br>  #region 构造函?br>  public GetPageCode()<br>  {<br>  }<br>  #endregion<br><br>  #region 公共Ҏ(gu)<br>  /// <summary><br>  /// d指定URL地址Q存到指定文件中<br>  /// </summary><br>  public void GetSource() <br>  { <br>   WebRequest request = WebRequest.Create(this.url);<br>   //使用代理服务器的处理<br>   if(this.proxyState==1)<br>   {<br>    //默认d80端口的数?br><br>    if(this.proxyPort==null)<br>     this.ProxyPort="80";<br><br>    WebProxy myProxy=new WebProxy(); <br>    myProxy = (WebProxy)request.Proxy; <br>    myProxy.Address = new Uri(this.ProxyAddress+":"+this.ProxyPort); <br>    myProxy.Credentials = new NetworkCredential(this.proxyAccount, this.proxyPassword, this.ProxyDomain);<br>    request.Proxy = myProxy; <br>   }<br>   try<br>   <br>   {<br>    //h服务<br>    WebResponse response = request.GetResponse();<br>    //q回信息<br>    Stream resStream = response.GetResponseStream(); <br>    StreamReader sr = new StreamReader(resStream, System.Text.Encoding.Default);<br>    string tempCode= sr.ReadToEnd();<br>    resStream.Close(); <br>    sr.Close();<br><br>    //如果输出文g路径为空Q便得到的内容赋给OutString属?br>    if(this.outFilePath==null)<br>    {<br>     this.outString=tempCode;<br>    }<br>    else<br>    {<br><br>     FileInfo fi = new FileInfo(this.outFilePath);<br>     //如果存在文g则先q掉<br>     if(fi.Exists)<br>      fi.Delete();<br>     StreamWriter sw = new StreamWriter(this.outFilePath,true,Encoding.Default);<br>     sw.Write(tempCode);<br>     sw.Flush();<br>     sw.Close();<br>    }<br>   }<br>   catch<br>   {<br>    this.noteMessage="出错了,h查网l是否连?";<br>     }<br><br>      }<br>   #endregion<br><br>   }<br>  }<br></td> </tr> </tbody> </table> <img src ="http://www.aygfsteel.com/simie/aggbug/127841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/simie/" target="_blank">和田?/a> 2007-07-03 14:52 <a href="http://www.aygfsteel.com/simie/archive/2007/07/03/127841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java SE 6中的JDBC 4.0增强http://www.aygfsteel.com/simie/archive/2007/07/02/127660.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 11:39:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127660.htmlhttp://www.aygfsteel.com/simie/comments/127660.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127660.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127660.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127660.htmlJava SE 6中的JDBC 4.0增强

旉Q?006-10-25
作者:(x)Srini Penchikala
览ơ数Q? 5760
本文关键字:(x)JDOJDBCSQLJJavaSrini Penchikalajdbcmustangjava se 6RowIDdriverannotation驱动E序注释
文章工具
推荐l朋?src="http://dev2dev.bea.com.cn/images/letter001.gif" 推荐l朋?/font>
打印文章 打印文章

   Java Platform, Standard EditionQJava SEQ版?Q代码名U?a >MustangQ现在已l推ZW二?a >beta版本Qƈ计划于今q十月䆾交付使用。Java SE 6包括几处?a >Java Database Connectivity Q?a target=_blank>JDBCQAPI的增强。这些增强将被发布ؓ(f)JDBC 4.0版本。新JDBC功能的主要目标是提供更ؓ(f)单的设计方式和更好的开发h员体验。本文概要说明了JDBC 4.0增强Q以?qing)它们给企业Java开发h员带来的好处。我们将借助一个用Apache Derby作ؓ(f)后端数据库而构建的h处理CZ应用E序Q对新的JDBC功能q行探讨?/p>

Java SE 6.0

  Java SE 6.0版本的主要目标是提供兼容性、稳定性和高质量。这个版本中有几处有的增强Q尤其是在监控与理QJMXQ、Web service、脚本语a支持Q用Rhino脚本引擎JSR 223JavaScript技术与Java源代码集成在一P、数据库q接?/font>、注释支持和安全性方面。JDBC API中还增加了几个新功能Q从新的RowId支持到更多的SQLException子类?/p>

JDBC 4.0功能

  借助Mustang中包含的Java SE Service Provider机制QJava开发h员不再需要用像Class.forName()q样的代码显式地加蝲JDBC驱动E序Q就能注册JDBC驱动E序。通过在调用DriverManager.getConnection()Ҏ(gu)时自动定位合适的驱动E序QDriverManagercd以做到这一炏V这个功能是向后兼容的,所以无需修改现有的JDBC代码?/p>

   在访问关pL据库的Java应用E序中,通过最化我们需要编写的“模板”代码QJDBC 4.0q改善了开发h员体验。它q提供实用程序类Q以改进JDBC驱动E序的注册和卸蝲机制Q以?qing)管理数据源和连接对象?/p>

   借助JDBC 4.0QJava开发h员现在可以用Annotations指定SQL查询Q从而利用Java SE 5.0Q?a >TigerQ版本中提供的元数据支持。基于注释的SQL查询允许在Java代码中用Annotation关键字指定SQL查询字符丌Ӏ这P我们׃必在两个不同文g中查看JDBC代码以及(qing)q些代码中调用的数据库查询了。例如,如果有一个叫做getActiveLoans()的方法,用于获取h处理数据库中的当前贷ƾ,可以使用@Query(sql="SELECT * FROM LoanApplicationDetails WHERE LoanStatus = 'A'")注释来修饰它?/p>

   此外QJava SE 6开发工具包QJDK 6Q的最后版本——与q行时环境(JRE 6Q相反——将?x)有一个基于与它绑定在一L(fng)Apache Derby的数据库。这帮助开发h员理解新的JDBC功能Q而不必单独下载、安装和配置数据库品?/p>

   JDBC 4.0中加入的主要功能包括Q?/p>

  • 自动加蝲JDBC驱动E序cR?
  • q接理增强?
  • 支持RowId SQL cd?
  • 使用Annotations的DataSet SQL实现?
  • 处理增强的SQL异常?
  • 支持SQL XML?

  q存在其他功能,比如对大对象QBLOB/CLOBQ的改进支持和National Character Set Support。接下来的内容将?x)详l分析这些功能?/p>

自动加蝲JDBC驱动E序

  在JDBC 4.0中,调用getConnectionҎ(gu)Ӟ不再需要用Class.forName()昑ּ地加载JDBC驱动E序Q因为DriverManager会(x)试着从初始化时加载的以及(qing)使用与当前应用程序相同的cd载器昑ּ加蝲的JDBC驱动E序中,扑և合适的驱动E序来?/p>

   DriverManagerҎ(gu)getConnection和getDrivers已经增强为支持Java SE Service Provider机制QSPMQ。根据SPMQ服务被定义Zl众所周知的接口和抽象c,而服务提供程序则是服务的特定实现。它q指定在META-INF/services目录中保存服务提供程序配|文件。JDBC 4.0驱动E序必须包含文gMETA-INF/services/java.sql.Driver。这个文件包含JDBC驱动E序的java.sql.Driver实现的名U。例如,要加载JDBC驱动E序以连接到Apache Derby数据库,META-INF/services/java.sql.Driver文gp包含以下:(x)

   org.apache.derby.jdbc.EmbeddedDriver

   让我们尽快了解如何用这Ҏ(gu)功能加蝲JDBC驱动E序理器。下面的列表昄了加载JDBC驱动E序通常使用的示例代码。我们假定需要连接到一个Apache Derby数据库,因ؓ(f)我们在文章后面提到的CZ应用E序中将使用q个数据库:(x)

 Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection conn

=DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword);

  但是在JDBC 4.0中,我们不需要Class.forName()q一行。我们只要调用getConnection()可以获得数据库q接?/p>

   注意Q这仅适用于在单机模式中获得数据库q接。如果用某U数据库q接池来理q接Q代码将?x)有所区别?/p>

q接理

  在JDBC 4.0之前Q我们依赖于JDBC URL来定义数据源q接。现在有了JDBC 4.0Q我们只要提供一l参敎ͼ比如L名称和端口号Q给标准的连接工厂机Ӟp获得CQ意数据源的连接。Connection和Statement接口中加入了新的Ҏ(gu)Q以便在理池环境中的Statement对象时可以支持连接状态跟t改q和更大的灵zL。元数据工具Q?a >JSR-175Q用于管理活动连接。我们还可以获得元数据信息,比如zdq接的状态,q可以把q接指定为标准的QConnectionQ用于单机应用程序)、池化的QPooledConnectionQ或者甚x用于XA事务的分布式q接QXAConnectionQ。注意,我们没有直接使用XAConnection。它是由诸如WebLogic、WebSphere或JBossq样的Java EE应用服务器内部的事务理器来使用的?/p>

RowId支持

  RowID接口被添加到JDBC 4.0中以支持ROWID数据cdQOracle和DB2{数据库也支持这U数据类型。当有多条记录没有惟一标识W列Q而且需要在不允许复制的CollectionQ比如HashtableQ中保存查询输出ӞRowId很有用。我们可以用ResultSet的getRowId()Ҏ(gu)来获得RowIdQƈ使用PreparedStatement的setRowId()Ҏ(gu)在查询中使用RowId?/p>

   关于RowId对象要记住的一仉要事情是Q分别在PreparedStatement和ResultSet中用set或updateҎ(gu)ӞRowId对象的值无法在数据源之间移植,可以认ؓ(f)它是特定于数据源的。所以,止在不同的Connection和ResultSet对象之间׃n它?/p>

   DatabaseMetaData中的getRowIdLifetime()Ҏ(gu)可用于确定RowId对象的生存期有效性。表1中列Zq回值或行id可能取的倹{?/p>
RowId ?/th> 描述
ROWID_UNSUPPORTED 不支持ROWID数据cd?/td>
ROWID_VALID_OTHER RowID的生存期依赖于数据库厂商实现?/td>
ROWID_VALID_TRANSACTION 只要在数据库表中行未被删除,RowID的生存期在当前的事务中?/td>
ROWID_VALID_SESSION 只要在数据库表中行未被删除,RowID的生存期在当前会(x)话的持箋旉中?/td>
ROWID_VALID_FOREVER 只要在数据库表中行未被删除,RowID的生存期是无限的?/td>

Z注释的SQL查询

  JDBC 4.0规范利用注释QJava SE 5中加入)允许开发h员把SQL查询与Javacd联在一P同时不用~写大量的代码。此外,通过使用GenericsQ?a >JSR 014Q和元数据(JSR 175QAPIQ我们可以把SQL查询与Java对象兌在一P从而指定查询输入和输出参数。我们还可以把查询结果绑定到Javac,以加速对查询输出的处理。我们无需~写通常用于把查询结果填充到Java对象中的所有代码。在Java代码中指定SQL查询Ӟ?U主要的注释QSelect和Update?/p>

Select注释

  Select注释用于在JavacM指定选择查询Q以便用getҎ(gu)从数据库表中获取数据。表2昄了Select注释的各U属性以?qing)它们的用法?/p>
名称 cd 描述
sql String SQL Select查询字符丌Ӏ?/td>
value String 与sql属性相同?/td>
tableName String 在其上调用sql的数据库表的名称?/td>
readOnly、connected?scrollable Boolean 标志Q分别用于指C回的DataSet是只ȝq是可更新的Q是否连接到后端数据库,在connected模式中用时是否可以滚动?/td>
allColumnsMapped Boolean 标志Q用于指Csql注释元素中的列名是否一对一地映到DataSet中的字段?/td>

  下面是Select注释的一个例子,用于从贷ƾ数据库获得所有当前贷ƾ:(x)

interface LoanAppDetailsQuery extends BaseQuery {
@Select("SELECT * FROM LoanDetais where LoanStatus = 'A'")
DataSet<LoanApplication> getAllActiveLoans();
}

  sql注释也支持I/O参数Q参数标记由一个问号后面跟一个整数来表示Q。下面是参数化sql查询的一个例子:(x)

interface LoanAppDetailsQuery extends BaseQuery {
@Select(sql="SELECT * from LoanDetails
where borrowerFirstName= 1 and borrowerLastName= 2")
DataSet<LoanApplication> getLoanDetailsByBorrowerName(String borrFirstName,
String borrLastName);
}

Update注释

  Update注释用于修饰Query接口Ҏ(gu)Q用于更新数据库表中的一条或多条记录。每个Update注释都必d含一个sql注释cd的元素。下面是Update注释的一个例子:(x)

interface LoanAppDetailsQuery extends BaseQuery {
@Update(sql="update LoanDetails set LoanStatus = 1
where loanId = 2")
boolean updateLoanStatus(String loanStatus, int loanId);
}

处理增强的SQL异常

  异常处理是Java~程的一个重要组成部分,特别是当q接到后端关pL据库或在后端关系数据库上q行查询的时候。我们一直用SQLExceptioncL指示与数据库相关的错误?a target=_blank>JDBC 4.0在SQLException处理斚w有几处增强。下面是JDBC 4.0版本中的一些增强,在处理SQLExceptions时它们可以ؓ(f)开发h员带来更好的体验Q?/p>

  • 新的SQLException子类
  • 支持因果关系
  • 支持增强的for-each循环

新的SQLExceptionc?

  JDBC 4.0中创ZSQLException的新子类Q以便ؓ(f)JavaE序员提供一U编写更多可UL错误处理代码的手DcJDBC 4.0中引入了2cL的SQLExceptionQ?/p>

  • SQL非瞬时异?
  • SQL瞬时异常

  非瞬时异常:(x)同一Ҏ(gu)作重试失败时抛出此异常,直到SQLException的原因得到纠正ؓ(f)止。表3昄了JDBC 4.0中加入的新异常类Q它们都是SQLNonTransientException的子c(SQLStatecd定义在SQL 2003规范中。)Q?/p>
异常c?/th> SQLState?/th>
SQLFeatureNotSupportedException 0A
SQLNonTransientConnectionException 08
SQLDataException 22
SQLIntegrityConstraintViolationException 23
SQLInvalidAuthorizationException 28
SQLSyntaxErrorException 42

  瞬时异常Q?/strong>当操作在没有M应用E序U功能进行干涉的情况下重试,前面p|的JDBC操作能够成功时抛出此异常。表4中列Z对SQLTransientExceptionq行扩展的新异常?/p>
异常c?/th> SQLState?/th>
SQLTransientConnectionException 08
SQLTransactionRollbackException 40
SQLTimeoutException None

因果关系

  现在QSQLExceptioncL持配备有异常机制Q也UCؓ(f)Cause工具Q的Java SEQ这U机制让我们能够处理JDBC操作中抛出的多种异常Q如果后端数据库支持多异常功能)。这U场景发生在执行一条可能抛出多个SQLException的语句时?/p>

   我们可以使用SQLException中的getNextException()Ҏ(gu)Q通过异常链进行P代。下面给Z些用于处理SQLException因果关系的示例代码:(x)

catch(SQLException ex) {
while(ex != null) {
LOG.error("SQL State:" + ex.getSQLState());
LOG.error("Error Code:" + ex.getErrorCode());
LOG.error("Message:" + ex.getMessage());
Throwable t = ex.getCause();
while(t != null) {
LOG.error("Cause:" + t);
t = t.getCause();
}
ex = ex.getNextException();
}
}

增强的For-Each循环

  SQLExceptioncdCIterable接口Qؓ(f)Java SE 5中加入的for-each循环功能提供支持。@环的D遍历SQLException?qing)其原因。下面给Z个代码片D,对SQLException中加入的for-each循环q行了说明?/p>

catch(SQLException ex) {
for(Throwable e : ex ) {
LOG.error("Error occurred: " + e);
}
}

对国家字W集转换的支?/h3>

  下面列出了处理国家字W集QNational Character SetQ时JDBCcM所做的增强Q?/p>

  • JDBC数据cdQ加入了新的JDBC数据cdQ比如NCHAR、NVARCHAR、LONGNVARCHAR和NCLOB?
  • PreparedStatementQ加入了新方法setNString、setNCharacterStream和setNClob?
  • CallableStatementQ加入了新方法getNClob、getNString和getNCharacterStream?
  • ResultSetQ接口加入了新方法updateNClob、updateNString和updateNCharacterStream?

对大对象QBLOB和CLOBQ的增强支持

  下面列出了JDBC 4.0中对处理LOB所做的增强Q?/p>

  • ConnectionQ加入了新方法(createBlob()、createClob()和createNClob()Q以创徏BLOB、CLOB和NCLOB对象的新实例?
  • PreparedStatementQ加入了新方法setBlob()、setClob()和setNClob()Q以便用InputStream对象插入BLOB对象Q以?qing)用Reader对象插入CLOB和NCLOB对象?
  • LOBQBlob、Clob和NClob接口中加入了新方法(free()Q,以便释放q些对象占用的资源?

  现在Q让我们看一看java.sql和javax.jdbc包中加入的一些新c,以及(qing)它们提供了哪些服务?/p>

JDBC 4.0 APIQ新c?/h3>

RowId (java.sql)

  正如前面提过的那Pq个接口代表着数据库中的一个SQL ROWID倹{ROWID是一个内|的SQL数据cdQ用于识别数据库表中的特定数据行。ROWID通常用在q样的查询中Q该查询从输没有惟一ID列的表中q回行?/p>

   CallableStatement、PreparedStatement和ResultSet接口中的Ҏ(gu)Q比如getRowId和setRowIdQ允许程序员讉KSQL ROWID倹{接口还提供一个方法(叫做getBytes()Q把ROWID的D回ؓ(f)字节数组。DatabaseMetaData接口有一个叫做getRowIdLifetime的新Ҏ(gu)Q可用于定RowId对象的生存期。RowId的作用域可以是下?U类型之一Q?/p>

  • 在其中创建RowId的数据库事务的持l时间?
  • 在其中创建RowId的会(x)话的持箋旉?
  • 数据库表中的标识行,只要它尚未被删除?

DataSet (java.sql)

  DataSet接口Z执行SQL查询q回的数据提供类型安全的视图。DataSet可以在已q接或未q接模式中进行操作。当在已q接模式中用时Q其功能cM于ResultSet。而在未连接模式中使用ӞDataSet的功能则cM于CachedRowSet。因为DataSet扩展了List接口Q我们可以遍历查询返回的行?/p>

   现有的类中还加入了几个新Ҏ(gu)Q比如ConnectionQcreateSQLXML、isValidQ和ResultSetQgetRowIdQ?/p>

CZ应用E序

  本文中用的CZ应用E序是一个贷Ƒ֤理应用程序,它包含一个贷ƾ查N面,用户可以在这个页面上输入一个贷ƾID以获得有兌Ƅ详细信息Q然后提交表单。贷ƾ查N面调用一个控制器对象Q而此控制器对象又调用DAO对象来访问后端数据库Q从而获得有兌Ƅ详细信息。这些详l信息包括借款人姓名、贷N额和h到期旉Q它们均?x)显C在一个贷ƾ详l信息页面上。在后端数据库中Q我们用一个叫做LoanApplicationDetails的表来保存贷Ƒֺ用程序的详细信息?/p>

   CZ应用E序的用例是获得特定hID的贷ƾ详l信息。在注册hqҎ(gu)g品和利率锁定它之后,可以获得这些贷ƾ详l信息了。贷Ƒ֤理应用程序的目l节如表5所C?/p>
名称 ?/th>
Project Name JdbcApp
Project Directory c:\dev\projects\JdbcApp
DB Directory c:\dev\dbservers\apache\derby
JDK Directory c:\dev\java\jdk_1.6.0
IDE Directory c:\dev\tools\eclipse
Database Apache Derby 10.1.2.1
JDK 6.0 (beta 2 release)
IDE Eclipse 3.1
Unit Testing JUnit 4
Build Ant 1.6.5

  下表列出了连接贷ƾ详l信息Apache Derby数据库时需要用到的JDBC参数。这些参数都保存在一个叫?em>derby.properties的文本文件中Q该文g位于目基目录下?em>etc/jdbc目录中(参见?Q?/p>
名称 ?/th>
JDBC Driver File LoanApp\META-INF\services\java.sql.driver
Driver org.apache.derby.ClientDriver
URL jdbc:derby:derbyDB
User Id user1
Password user1

  注意QApache Derby数据库提?cJDBC驱动E序QEmbedded DriverQorg.apache.derby.jdbc.EmbeddedDriverQ和Client/Server DriverQorg.apache.derby.jdbc.ClientDriverQ。在CZ应用E序中我使用的是Client/Server Driver版本?/p>

   下面l出用于启动Derby数据库服务器和用ij工具创徏新数据库的命令?/p>

   要启动Derby Network ServerQ打开一个命令提C,然后q行以下命o(h)Q修改DERBY_INSTALL和JAVA_HOME环境变量Q从而媄响本地环境)?/p>

set DERBY_INSTALL=C:\dev\dbservers\db-derby-10.1.2.1-bin
set JAVA_HOME=C:\dev\java\jdk1.6.0
set DERBY_INSTALL=C:\dev\dbservers\db-derby-10.1.3.1-bin
set CLASSPATH=%CLASSPATH%;%DERBY_INSTALL%\lib\derby.jar;
%DERBY_INSTALL%\lib\derbytools.jar;
%DERBY_INSTALL%\lib\derbynet.jar;
cd %DERBY_INSTALL%\frameworks\ NetworkServer\bin
startNetworkServer.bat

  要连接到数据库服务器和创建测试数据库Q打开另一个命令提C,然后q行以下命o(h)。确保修改了DERBY_INSTALL和JAVA_HOME环境变量Q以适应环境?/p>

set JAVA_HOME=C:\dev\java\jdk1.6.0
set DERBY_INSTALL=C:\dev\dbservers\db-derby-10.1.3.1-bin
set CLASSPATH=%DERBY_INSTALL%\lib\derbyclient.jar;
%DERBY_INSTALL%\lib\derbytools.jar;.
%JAVA_HOME%\bin\java org.apache.derby.tools.ij
connect 'jdbc:derby://localhost:1527/LoanDB;create=true';

  用于~译Java源代码的classpath讄应该包含位于目ȝ录下lib目录中的derby.jar?em>junit4.jar文g。我们还需要在classpath中包?em>etc?em>etc/jdbc?em>etc/log4j目录Q这样应用程序就能访问JDBC属性和Log4J配置文g。我创徏了一个Ant~译脚本Q位?em>JdbcApp/build目录中)Q以自动化编译和打包Java代码的Q务?/p>

   用于试h详细信息数据讉K对象的测试类叫做LoanAppDetailsDAOTest。我们传入参敎ͼ比如hID和借款人姓名)以获得贷ƾ详l信息?/p>

   下面的内容给Z一些代码示例,q些代码是关于JDBC 4.0规范的JDBC驱动E序自动加蝲和给予注释的SQL查询功能的?/p>

自动加蝲JDBC驱动E序

  BaseDAO抽象cL一个叫做getConnection的方法,用于获得一个数据库q接。下面的代码片段昄了这个方法(注意Q我们不必注册JDBC驱动E序Q。只?em>java.sql.Driver文g中存在正的驱动E序名称Qorg.apache.derby.jdbc.ClientDriverQ,可以自动加载JDBC驱动E序?/p>

protected Connection getConnection() throws DAOException {
// Load JDBC properties first
if (jdbcUrl == null || jdbcUser == null ||
jdbcPassword == null) {
loadJdbcProperties();
}
// Get Connection
Connection conn = null;
try {
conn = DriverManager.getConnection(jdbcUrl, jdbcUser,
jdbcPassword);
} catch (SQLException sqle) {
throw new DAOException("Error in getting a DB connection.",
sqle);
}
return conn;
}

SQL注释

  LoanAppDetailsQuery接口有带有注释的SQL查询Q用于获得当前贷ƾ(条g是loanstatus="A"Q的列表和基于贷ƾh姓名的贷ƾ详l信息(在一个贷ƾh借贷多笔N的情况下Q。我们在本文的前面部分曾见过q些SQL注释。下面给出的CZ代码说明了如何调用用Annotation定义的SQL查询?/p>

public DataSet<LoanAppDetails> getAllActiveLoans() throws Exception {
// Get Connection
Connection conn = getConnection();
LoanAppDetailsQuery query = null;
DataSet<LoanAppDetails> loanDetails = null;
query = QueryObjectFactory.createQueryObject(
LoanAppDetailsQuery.class, conn);
loanDetails = query.getAllActiveLoans();
return loanDetails;
}
public DataSet<LoanAppDetails> getLoanDetailsByBorrowerName(
String borrFirstName, String borrLastName) throws Exception {
// Get Connection
Connection conn = getConnection();
LoanAppDetailsQuery query = null;
DataSet<LoanAppDetails> loanDetails = null;
query = QueryObjectFactory.createQueryObject(
LoanAppDetailsQuery.class, conn);
loanDetails = query.getLoanDetailsByBorrowerName(
borrFirstName,borrLastName);
return loanDetails;
}

l束?/h3>

  在用SQLӞJDBC 4.0可以提供开发的便性ƈ改善开发h员体验。JDBC 4.0的另一个目标是提供企业U的JDBC功能Q把API公开l涵盖范围更q的工具集,以便更好地管理JDBC资源。此外,JDBC 4.0 API为JDBC驱动E序提供了一条迁U\径,从而与J2EE Connector架构QJCAQ保持兼宏V这使得JDBC厂商能够l箋实现JDBC技术Connector API。当在企业面向服务架构QService Oriented ArchitectureQSOAQ应用程序中使用JDBC数据源时Q这一点很重要Q因为在企业USOA应用E序中,可以把JDBC数据源部|ؓ(f)企业服务ȝQEnterprise Service BusQESBQ架构中的另一个适配器,而不必ؓ(f)JDBC数据源编写ESB特定实现代码?/p>

   在本文中Q我们讨ZJDBC 4.0中的增强Q比如RowId支持、JDBC驱动E序加蝲和基于Annotations的SQL。JDBC 4.0中还加入其他功能,以便在未来支持SQL 2003规范。要了解有关JDBC 4.0规范的更多信息,请参?a >规范文档?/p>

参考资?/h3>
 作者简?/span>
Srini Penchikala 是一位在Flagstar银行工作的信息系l学U问题专家?/td>


]]>Java NIO API详解 http://www.aygfsteel.com/simie/archive/2007/07/02/127524.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 05:07:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127524.htmlhttp://www.aygfsteel.com/simie/comments/127524.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127524.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127524.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127524.html阅读全文

]]>
JAVA反编译工L(fng)选(转蝲Q?/title><link>http://www.aygfsteel.com/simie/archive/2007/07/02/127512.html</link><dc:creator>和田?/dc:creator><author>和田?/author><pubDate>Mon, 02 Jul 2007 04:50:00 GMT</pubDate><guid>http://www.aygfsteel.com/simie/archive/2007/07/02/127512.html</guid><wfw:comment>http://www.aygfsteel.com/simie/comments/127512.html</wfw:comment><comments>http://www.aygfsteel.com/simie/archive/2007/07/02/127512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/simie/comments/commentRss/127512.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/simie/services/trackbacks/127512.html</trackback:ping><description><![CDATA[<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">最q整理以前写的东东,发现2004q底的时候对比各cJava反编译器时记下来的一心得,也不知道是不是有点儿q时了,仅供大家参考吧?/font></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">=====================================================================</font></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">1995</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">5</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">月由</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">SUN</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">公司发布的,׃其安全性高、代码优化、跨q_{特性,q速取代了很多传统高语言Q占据了企业U网l应用开发等诸多领域的霸d位?/span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不过Q?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最H出的跨q_优势使得它不能被~译成本C码,而要以中间代码的形式q行在虚拟机环境中,q?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的反~译要比别的高语言Ҏ(gu)实现Qƈ且反~译的代码经q优化后几乎可以与源代码相媲?/span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Z更好C护知识权,避免本公司的智力成果L被hH取Q开发者有必要对反~译工具深入了解Q以便有针对性地采取保护措施?/span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目前Q比较流行的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反编译工兯q?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">30</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">U,其中有三Ƒ֠U精品:(x)</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang=EN-US style="FONT-SIZE: 14pt; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">一?span style="FONT: 7pt 'Times New Roman'">         </span></font></span></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用q泛?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD<o:p></o:p></font></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在众多的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反编译工具中Q有几种非常著名的工具用了相同的核心引擎—?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q其中主要包括:(x)</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Front End Plus</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">mDeJava</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Decafe Pro</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Cavaj Java Decompiler</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">DJ Java Decompiler</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">NMI’s Java Class Viewer</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和国产的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">源代码反~译专家{等?/span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本n是一个命令行工具Q没有图形界面,上述的这些工具大多是?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核的基之上加了一个图形界面而已。这么多U品的共同选择Q可证?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反编译领域中的尊贵地位?/span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">W者用来测试的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本?/span><font face="Times New Roman"><st1:chsdate ISROCDATE="False" ISLUNARDATE="False" DAY="30" MONTH="12" YEAR="1899" W:ST="on"><span lang=EN-US style="FONT-SIZE: 14pt">1.5.8</span></st1:chsdate><span lang=EN-US style="FONT-SIZE: 14pt">f?/span></font></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 14pt"><img src="http://www.360doc.com/DownloadImg/2633/488247_1.jpg"></span></font></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Microsoft Visual C++</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发的Q运行速度非常快,可以处理很复杂的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">~译文g。众多的参数?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以灉|应付多种加密手段Qo(h)反编译的代码更加优化和易诅R由?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数太多Q没必要一一解释Q其中有几个最常用的如下:(x)</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman"><span style="mso-spacerun: yes">         </span>-d <dir>- </font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于指定输出文g的目?/span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span><font face="宋体, MS Song" size=3> </font> <p> </p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman"><span style="mso-spacerun: yes">         </span>-s <ext>- </font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">输出文g扩展?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">(</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">默认?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">: .jad)</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q通常都会(x)把输出文件扩展名直接指定?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">.java</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q以方便修改的重新编译?/span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman"><span style="mso-spacerun: yes">         </span>-8<span style="mso-spacerun: yes">       </span>- </font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Unicode</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字符转换?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">ANSI</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字符Ԍ如果输出字符串是中文的话一定要加上q个参数才能正确昄?/span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最常用的反~译指o(h)如下所C:(x)</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Jad –d c:\javasource –s .java -8 javatest.class<o:p></o:p></font></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q条指o(h)当前目录下?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">javatest.class</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反编译ؓ(f)</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">javatest.java</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q保存在</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">c:\javasource</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目录里,其中的提CZؓ(f)中文Q而不?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Unicode</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码?/span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang=EN-US style="FONT-SIZE: 14pt; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">二?span style="FONT: 7pt 'Times New Roman'">         </span></font></span></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">源码开攄</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE<o:p></o:p></font></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是全球最大的开源项目网?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Sourceforge.net</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的成员,不要以ؓ(f)源码开攑ְ瞧它,在所有的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反编译器中,</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的反~译效果是最好的Q尤其是对付一些常见的加密手段Q例如؜淆技术等Q更是出cL_V?/span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本n也是U?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发的Q最q越来越多的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反编译Y件也选择</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来做它们的核心引擎,例如</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JCavaj Java Decompiler</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">BTJ (Back To Java)</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">jEdit's JavaInsight plugin</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">{?/span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个可q行?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAR</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文gQ在</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">windows</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境下双d可运行?/span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><img src="http://www.360doc.com/DownloadImg/2633/488247_2.jpg"></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要特别说明的是,</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不是通过常规?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Open->File</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方式来加蝲</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">~译后的cLӞ</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">*.class</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q或是类包(</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">*.jar</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q的Q而是通过?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Options</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">菜单中的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Set Classpath</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来实现的Q单独的cL件可以将它的上一U目录作?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Classpath</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">输入Q然后再选择</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Reload Classpath</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">卛_?/span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><img src="http://www.360doc.com/DownloadImg/2633/488247_3.jpg">   <img src="http://www.360doc.com/DownloadImg/2633/488247_4.jpg"></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">新加入的cd或是cȝ名字?x)在左侧H口出现Q双ȝ包名可以展开目录?wi)结构,双击需要反~译的类名则在右上角的窗口中直接昄反编译后的源代码?/span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><o:p><font face="Times New Roman"> </font></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang=EN-US style="FONT-SIZE: 14pt; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">三?span style="FONT: 7pt 'Times New Roman'">         </span></font></span></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">独树(wi)一帜的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">DAVA<o:p></o:p></font></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">DAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不是一个独立的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反编译器Q而是</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码优化工具</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Soot</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一部分?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Soot</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一hU?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发的Q也是一个独立的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAR</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包,但却不能通过双击直接q行Q而是?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一样在命o(h)行状态运行?/span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p><img src="http://www.360doc.com/DownloadImg/2633/488247_5.jpg"></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Soot</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对环境变量的配置要求非常严格Q通常情况下要?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">CLASSPATH</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做如下设|:(x)</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Set CLASSPATH=%CLASSPATH%;c:\sootdir\sootclasses-<st1:chsdate ISROCDATE="False" ISLUNARDATE="False" DAY="30" MONTH="12" YEAR="1899" W:ST="on">2.1.0</st1:chsdate>.jar;.;<o:p></o:p></font></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其中?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">c:\sootdir\</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是下载的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">soot</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cd攄的\径,</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">CLASSPATH</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">末尾?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">.;</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代表了当前目录,如果不加上这个的?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Soot</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">l常?x)报一个找不到cȝ错误?/span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman"><span style="mso-tab-count: 1">      </span>DAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是作?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Soot</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一个参C用的Q通常的用法如下:(x)</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Java soot.Main –f dava –d c:\javasource javatest<o:p></o:p></font></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意最后的cd不用?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">.class</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后缀Q因为它默认是处?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">class</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文gQ这个操作与前述?/span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的参数效果相同?/span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">DAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采取了流E优化的方式q行反编译,与传l反~译思\不尽相同Q但却对改变?gu)程cȝ加密Ҏ(gu)有独特的反编译效果?/span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><o:p><font face="Times New Roman"> </font></o:p></span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上述的三U工具各有千U,但效果都非常不错。经试Q它们基本上都可以把</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JDK</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自带的一些例E完全反~译Q然后不加Q何修改可再编译成功,q能正常q行Q?/span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q文中工具均l过本h亲手试Q当时用的是jdk1.4.2_03Q现在离写文章的时候过了一q多了,jdk都出?.5了,怕是有些E序也不太好反编了)</span></p> <p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">/*原创作品Q{载请注明出处*/</span></p> </dir> <img src ="http://www.aygfsteel.com/simie/aggbug/127512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/simie/" target="_blank">和田?/a> 2007-07-02 12:50 <a href="http://www.aygfsteel.com/simie/archive/2007/07/02/127512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Java应用E序中动态分配CPU资源http://www.aygfsteel.com/simie/archive/2007/07/02/127510.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 04:48:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127510.htmlhttp://www.aygfsteel.com/simie/comments/127510.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127510.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127510.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127510.html 

Java的线E调度操作在q行时是与^台无关的。一个多dpȝ需要在d之间实现QoS(Quality of Service)理Ӟ如果CPU资源的分配基于JavaU程的优先Q那么它在不同^Cq行时的效果是很N的。本文利用协调式多Q务模型,提出一个与q_无关、ƈ且能在Q务间动态分配CPU资源的方案?
  现在Q由于计机pȝ已经从hZ互逐步向机Z互{化,计算机和计算Z间的业务对于旉的要求非帔R。Y件系l对于业务的支持已经不仅表现为对不同业务的逻辑和数?法+数据l构)支持Q而且q表Cؓ(f)对同时处理不同Q务的时效?d响应速度)支持。一般,d响应的速度可以通过法优化?qing)ƈ行运分担负载等手段来提高。但是,用户业务逻辑的复杂度军_了算法优化的发挥I间Q硬件规模决定了所能够承担负蝲的大。我们利用Javaq_的特点,借鉴协调式多d思想QCPU资源能够在Q务间动态分配,从而ؓ(f)旉要求强的d分配更多的CPUq行资源。这也可以充分利用现有硬Ӟ为用户业务提供最大的保障?/p>

  用Java解决问题

  本着软gpȝl构和现实系l结构一致的思想Q开发复杂业务服务的E序一般按照计机d和现实业务对应的思\Q最lŞ成一个大规模的多dpȝ。由于其跨^台性,Javapȝ可以随着业务的扩大,qx地升U到各种gq_上。由于Java自n的发展及(qing)其应用场合的不断扩大Q用它实现多dpȝ已经成ؓ(f)当前的应用方向。在J2EE(Java2 Enterprise Edition)推出以后QSun公司已经Java的重心放在了服务器端(Server Side)pȝ的构造上。由于客?服务器模型固有的多对一的关p,服务器端E序也必然是一个多dpȝ?/p>

  在Java多Q务应用中Q动态地CPU资源在Q务间分配有很重要的意义。比如一个Inte.Net服务商的pȝ往往有多UQ务同时运行,有HTTP、FTP、MAIL{协议的支持Q也有商务、娱乐、生zR咨询等业务的服务。在白天Q网站希望系l的CPU资源量保障|上用户的服务质量,提高?sh)子商务{Q务的响应速度;晚上则希望让自己的娱乐服务和资料下蝲可能满下班后Z的需要。另外,在新兴的|管(比如TMNQ?Telecommunication Management.Network){应用领域中Q服务程序往往需要支持成千上万个q发响应事g的被理对象(MOQManaged Object)。对于被理对象执行的操作,不同用户在不同时d往有不同的旉要求?/p>

  Ҏ(gu)选择

  在考虑动态分配CPU资源的实施方案时Q往往有以下两点要求:(x)

  1. d分利用现有硬件资源,在系l空闲时Q让低优先d也能够得到系l所能给予的最快响应?/p>

  2.当硬件资源超负荷q行Ӟ虽然pȝ中有大规模、多数量的Q务不能处理,但它不应受媄响,而能够顺利处理那些能够被处理的、最重要的高优先UQ务?/p>

  多Q务系l要用多U程实现的最单方法就是将U程和Q务一一对应Q动态调整线E的优先U,利用U程调度来完成CPU资源在不同Q务间动态分配。这U思\在以前用本地化代码(Native Code)Q充分利用特定硬件和操作pȝ技巧的基础上是基本可行的。但在跨q_的Java环境中,q个思\对仅有小规模d数的单系l才可行Q原因有以下两点Q?/p>

  1. Java的线E虽然在~程角度(API)是与q_无关的,但它的运行效果却和不同操作系l^台密切相兟뀂ؓ(f)了利用更多的CPU资源QJava中的一个线E?Thread)对应着不同操作pȝ下的一个真实线E。因为Java虚拟机没有实现线E的调度Q所以这些Java的线E在不同操作pȝ调度下运行的差异性也比较明显。例如在Windowspȝ中,不仅U程的优先񔞮于Java API参数规定的十个优先Q而且微Y明确反对E序员动态调整线E优先。即使在操作pȝ中有_的优先权Q让U程优先U的参数和真实线E的优先U对应,不同操作pȝ的调度方式也?x)有许多不同。这最l会(x)造成代码在不同^C的行为变得不可预。这很难满_杂的、大规模q发d的众多优先需求,从而很难达到用户业务需要达到的效果?/p>

  2. ׃在Javapȝ中,U程被包装在一个Java语言的对象类—Thread中,所以ؓ(f)了完成Java语言对象和操作系l线E的对应QJavaU程的系l开销q是比较大的(在NT 4.0中,q_每个U程大致占用30KB内存)。因此如果让Thread对象个数和成千上万的d数同比例增长Q就昄是不合理的?/p>

  lg所qͼҎ(gu)q发多Q务的大规模需求和Javaq_固有的特点,惌利用Java Thread对象的优先调整CPU资源的分配是非常困难的,所以应该尽量避免让U程和Q务直接对应,也尽量避免用操作系l线E优先的调度机制?/p>

  解决Ҏ(gu)

  Ҏ(gu)以上分析Q问题的症结在于Q多dpȝ中的d在Java语言中的对应以及(qing)d间的怺调度?/p>

  从本质上看,一个Q务就是一pd对象Ҏ(gu)的调用序列,与Java的Thread对象或者别的类的对象没有必然联pR在避免使用不同操作pȝU程调度且同时Java虚拟机又没有U程调度能力的情况下Q要x造一个协调式多Q务系l,让各个Q务相互配合就成了最直接的思\。协调式多Q务系l一般有以下特点Q?/p>

  1. d由消息驱动,消息的响应代码完成Q务逻辑的处?

  2. 消息队列完成消息的存储和理Q从而利用消息处理的ơ序体现d优先U的不同;

  3. d中耗时的消息响应逻辑能够d攑ּCPU资源Q让别的d执行(像Windows 3.1中的Yield函数、Visual Basic中的DoEvents语句)?/p>

  可能Z巧合QJava语言h构造协调式多Q务系l天然的条g。Java对象的方法不仅是一个函数调用,它还是一个Java.lang.reflect.Methodcȝ对象。而所有对象的Ҏ(gu)都可以通过MethodcȝinvokeҎ(gu)调用。如果能使每个Q务所对应的一pdҎ(gu)全部以对象Ş式包装成消息Q放到消息队列中Q然后再按照自己的优先񔽎法队列中的消息取出,执行其Method对象的invoke调用Q那么一个基本的协调式多dpȝŞ成了。其中,d的优先和线E的优先U没有绑定关pR该pȝ的主体调度函数可以设|成一?#8220;d@?#8221;Q按照需要的优先U算法处理消息队列。对于有多重循环、外讄待等耗时操作的消息响应函敎ͼ可以在响应函数内部递归调用M调度函数,q一ơ调用把原来?#8220;d@?#8221;Ҏ(gu)在消息队列长度减到一定程?或者ؓ(f)I?后退出。退出后Q函数返回,执行刚才没有完成的消息响应逻辑Q这样就非常自然地实C协调式系l中dd攑ּCPU资源的要求?/p>

  如果仅仅做到q一步,完成一个像Windows 3.1中的多Q务系l,实际只用了一个线E,没有利用Java多线E的特点。应该注意到Q虽然Javapȝ中线E调度与q_相关Q但是相同优先的线E之间分时运行的特点基本上是不受特定q_影响的。各个相同优先的线E共享CPU资源Q而线E又被映成了Java语言中的Thread对象。这些对象就可以被认为是CPU资源的代表。Thread与线E执行代码主体的接口—Runnable之间是多对一的关pR一个Runnable可以被多个Thread执行。只要将Runnable的执行代码设|成上述的消息调度函敎ͼq和消息队列对应上,那么可以通过控制为它服务的Thread个数来决定消息队列执行的快慢Qƈ且在q行时可以动态地新增(new)和退出Thread对象。这样就能Q意调整不同消息队列在执行时所占用CPU资源的多。至此,M一个Java调用都可以在Thread个数不同的消息队列中选择Qƈ可以调整q些消息队列服务的Thread个数Q从而实现在q行时调整Q务所占用的CPU资源?/p>

  U观整个Ҏ(gu)Q由于仅仅基于Java语言固有的Method对象Q不同Q务间动态分配CPU资源q没有对d的性质?qing)其处理程有Q何限Ӟ那么在消息队列中没有高优先消息Ӟ低优先消息的处理函数自然会(x)全部占用CPU资源。在不同消息队列处理速度L讄Ӟq没有将特定的消息限制在快的或者慢的消息队列上。如果系l的负荷出(比如消息队列长度过一定限?Q只要将队列中低优先U消息换出或者拒l不能处理的消息q入Q那么系l的q行可以基本上不受负荷压力的媄响,从而最大保障用L(fng)关键业务需求?/p>

  当然Q协调式多Q务的思想也有其局限性,主要是它的调度_度比较大。系l能够保证的_度是一ơ消息处理过E。如果消息处理逻辑非常Ҏ(gu)Q那么编Eh员就必须再处理函数内部,让系l主动让出CPU资源。这虽然需要在处理消息响应逻辑时增加一个考虑因素Q但是,在Windowspȝ盛行的今天,q是一个已l被普遍接受的思\。由于方案中q没有局限ؓ(f)消息队列服务的线E数目,所以一个长旉的消息响应只?x)媄响一个线E,而不?x)对整个pȝ产生致命的媄响。除了调度粒度的问题以外Q还有访问消息队列操作在各个U程间互斥的问题。取出消息的q程是串行化的,因此对于q一瓉的解x案就是:(x)假设取出一条消息的操作相对于处理消息的消耗可以忽略不计,那么对于多次调用且仅有两三行响应逻辑的消息,~程人员通过函数调用可以直接执行?/p>

  前面比较详细地阐qC多Q务系l中d的划分以?qing)执行等内容。虽然这些是一个系l的核心Q但是在一个实用的pȝ中,q需要Q务间的同步、互斥等机制。在上述框架内,互斥可以单地用Java的Synchronized机制实现。由于Q务可以主动让出执行权限,要实现等?Waitd中止)和通知(Notifydl箋)Q从而实CQ务同步也比较容易了?/p>

]]>
վ֩ģ壺 | ʡ| ƽԶ| ˮ| | | ͡| ˮ| | | Ͳ| °| | ԭ| | ̨| | | | | ʯ| | ԫ| ̨| | | ̫| ˳| | | ״| п| | ֻ| ͩ| | ɽ| ˮ| | | |