??xml version="1.0" encoding="utf-8" standalone="yes"?>中国亚洲女人69内射少妇,久久精品国产亚洲AV不卡,亚洲啪啪AV无码片http://m.tkk7.com/byterat/category/16469.htmlzh-cnFri, 11 Jan 2008 13:06:38 GMTFri, 11 Jan 2008 13:06:38 GMT60java对应javascript的escape,unescape函数http://m.tkk7.com/byterat/archive/2008/01/11/174681.html比特?/dc:creator>比特?/author>Fri, 11 Jan 2008 09:08:00 GMThttp://m.tkk7.com/byterat/archive/2008/01/11/174681.htmlhttp://m.tkk7.com/byterat/comments/174681.htmlhttp://m.tkk7.com/byterat/archive/2008/01/11/174681.html#Feedback0http://m.tkk7.com/byterat/comments/commentRss/174681.htmlhttp://m.tkk7.com/byterat/services/trackbacks/174681.html/**
 * 加码解码工具
 * @author lwm
 *
 */

public class Encode {
 
 /*
  * 对应javascript的escape()函数, 加码后的串可直接使用javascript的unescape()q行解码
  */
 public static String escape(String src) {
  int i;
  char j;
  StringBuffer tmp = new StringBuffer();
  tmp.ensureCapacity(src.length() * 6);
  for (i = 0; i < src.length(); i++) {
   j = src.charAt(i);
   if (Character.isDigit(j) || Character.isLowerCase(j)
     || Character.isUpperCase(j))
    tmp.append(j);
   else if (j < 256) {
    tmp.append("%");
    if (j < 16)
     tmp.append("0");
    tmp.append(Integer.toString(j, 16));
   } else {
    tmp.append("%u");
    tmp.append(Integer.toString(j, 16));
   }
  }
  return tmp.toString();
 }

 /*
  * 对应javascript的unescape()函数, 可对javascript的escape()q行解码
  */
 public static String unescape(String src) {
  StringBuffer tmp = new StringBuffer();
  tmp.ensureCapacity(src.length());
  int lastPos = 0, pos = 0;
  char ch;
  while (lastPos < src.length()) {
   pos = src.indexOf("%", lastPos);
   if (pos == lastPos) {
    if (src.charAt(pos + 1) == 'u') {
     ch = (char) Integer.parseInt(src
       .substring(pos + 2, pos + 6), 16);
     tmp.append(ch);
     lastPos = pos + 6;
    } else {
     ch = (char) Integer.parseInt(src
       .substring(pos + 1, pos + 3), 16);
     tmp.append(ch);
     lastPos = pos + 3;
    }
   } else {
    if (pos == -1) {
     tmp.append(src.substring(lastPos));
     lastPos = src.length();
    } else {
     tmp.append(src.substring(lastPos, pos));
     lastPos = pos;
    }
   }
  }
  return tmp.toString();
 }

}



]]>
一些Java的知识点!http://m.tkk7.com/byterat/archive/2007/12/19/168658.html比特?/dc:creator>比特?/author>Wed, 19 Dec 2007 06:54:00 GMThttp://m.tkk7.com/byterat/archive/2007/12/19/168658.htmlhttp://m.tkk7.com/byterat/comments/168658.htmlhttp://m.tkk7.com/byterat/archive/2007/12/19/168658.html#Feedback0http://m.tkk7.com/byterat/comments/commentRss/168658.htmlhttp://m.tkk7.com/byterat/services/trackbacks/168658.html
2. 服务器一般都有线E池Q线E资源是可以重复利用的。你2000个用户在U,不见得能?00个用户同Ӟ或者说q发Q访问。再_只要对象不是太大Q我宁愿?00个拷贝,也不惌用户在这?00个Q务的队列里等待?br />
3. 两个DB之间的复制数据,每个DB各自使用自己的Sequane来生成id。复制数据时Q如果DB中的外键是由DBl护的,则不会生id冲突Q如果外键是由外部程序维护的Q则可能会生错误!

4. 对于非static的类的数据成员来?在该cM生的实例中都有一?q且怺独立(修改后ƈ不媄响其他实?, 但static的数据成员则变成了每个类只有一?卛_该类产生的所有实例共享这一个数据成? 该数据成员的改变会媄响到其他的实? 而static的方法则是让你不用创建对象及能调用这个方?

5. ThreadLocal的作用就是将l常要用到的对象的引用放到属于线E自q一个存储空间中Q在该线E的执行q程中,可以通过cȝ静态的ThreadLocal来方便的获取到这个对象,而不用通过参数的Ş式传来传厅R?

]]>
一个用算法比较各U语a性能的网站!http://m.tkk7.com/byterat/archive/2007/12/13/167535.html比特?/dc:creator>比特?/author>Thu, 13 Dec 2007 08:34:00 GMThttp://m.tkk7.com/byterat/archive/2007/12/13/167535.htmlhttp://m.tkk7.com/byterat/comments/167535.htmlhttp://m.tkk7.com/byterat/archive/2007/12/13/167535.html#Feedback0http://m.tkk7.com/byterat/comments/commentRss/167535.htmlhttp://m.tkk7.com/byterat/services/trackbacks/167535.html在一个老外的Blog上看Cq个|站Q发现原来是一个以C语言为基准的性能比较|站Q?br style="font-family: " />
Javaq算不错QRuby׃怎么样了Q?在脚本语a中居然排在了最后!

看来Q解析性的语言玩v来是单方便了Q可是却是以损失性能ZLQ?/span>

]]>
一个用来测试httpServercd服务的工PQABhttp://m.tkk7.com/byterat/archive/2007/10/23/155295.html比特?/dc:creator>比特?/author>Tue, 23 Oct 2007 06:53:00 GMThttp://m.tkk7.com/byterat/archive/2007/10/23/155295.htmlhttp://m.tkk7.com/byterat/comments/155295.htmlhttp://m.tkk7.com/byterat/archive/2007/10/23/155295.html#Feedback0http://m.tkk7.com/byterat/comments/commentRss/155295.htmlhttp://m.tkk7.com/byterat/services/trackbacks/155295.html

]]>
Java的java.nio.Buffer~冲区基http://m.tkk7.com/byterat/archive/2007/08/01/133757.html比特?/dc:creator>比特?/author>Wed, 01 Aug 2007 03:13:00 GMThttp://m.tkk7.com/byterat/archive/2007/08/01/133757.htmlhttp://m.tkk7.com/byterat/comments/133757.htmlhttp://m.tkk7.com/byterat/archive/2007/08/01/133757.html#Feedback0http://m.tkk7.com/byterat/comments/commentRss/133757.htmlhttp://m.tkk7.com/byterat/services/trackbacks/133757.html~冲区基

抽象cBuffer是java.nio包支持缓冲区的基?Buffer 的工作方式就象内存中用于d基本数据cd?RandomAccessFile 。象 RandomAccessFile 一P使用 Buffer Q所执行的下一个操作(读/写)在当前某个位|发生。执行读Q写操作中的M个都会改变那个位|,所以在写操作之后进行读操作不会d刚才所写的内容Q而会d刚才所写内容之后的数据?Buffer 提供了四个指C方法,用于讉KU性结构(从最高值到最低|Q?

capacity() Q表明缓冲区的容量大? 一旦确定了大小, 不能再改变;
limit() Q告诉您到目前ؓ止已l往~冲区填了多字节,或者让您用 :limit(int newLimit) 来改变这个限?
position() Q告诉您当前的位|,以执行下一个读Q写操作
mark() Qؓ了稍后用 reset() q行重新讄而记住某个位|?
flip() Q交换限制指针和位置指针Q然后将位置|ؓ 0Qƈ废弃已经做的mark标记

~冲区的基本操作是读 get() 和写 put() Q然而,q些Ҏ在子cM都是针对每种数据cd的特定方法。ؓ了说明这一情况Q让我们研究一个简单示例,该示例演CZ从同一个缓冲区d写一个字W。在清单 1 中, flip() Ҏ交换限制和位|,然后位|置?0Qƈ废弃标记Q让您读刚才所写的数据Q?


清单 1. 读/写示?br>import java.nio.*;
...
CharBuffer buff = ...;
buff.put('A');
buff.flip();
char c = buff.get();
System.out.println("An A: " + c);
 


现在让我们研I一些具体的 Buffer 子类?

 

~冲区类?/p>

Merlin h 7 U特定的 Buffer cdQ每U类型对应着一个基本数据类型(不包?booleanQ:

ByteBuffer       //存放M除booleancd外的其他基本cd
CharBuffer       //存放char
DoubleBuffer     //存放double
FloatBuffer      //存放float
IntBuffer        //存放int
LongBuffer       //存放long
ShortBuffer      //存放short

在本文后面,我将讨论W?8 U类?MappedByteBuffer Q它用于内存映射文g。如果您必须使用的类型不是这些基本类型,则可以先?ByteBuffer 获得字节cdQ然后将其{换成 Object 或其它Q何类型?


创徏~冲?br>一共有两种cd的缓冲区Q直接缓冲区和非直接~冲区?br>
在创建缓冲区Ӟ可以要求创徏直接~冲区,创徏直接~冲区的成本要比创徏间接~冲区高Q但q可以ɘq行时环境直接在该缓冲区上进行较快的本机 I/O 操作。因为创建直接缓冲区所增加的成本,所以直接缓冲区只用于长生存期的~冲区,而不用于短生存期、一ơ性且用完׃弃的~冲区。而且Q只能在 ByteBuffer q个U别上创建直接缓冲区Q如果希望用其它类型,则必d Buffer 转换成更具体的类型?br>
判断一个缓冲区是否是直接缓冲区Q可以调用isDirect()Ҏ?br>
有三U方式来获取一个缓冲区的对象:
a. 调用allocate()或者allocateDirect()Ҏ直接分配Q其中allocateDirect()q回的是直接~冲区?br>b. 包装一个数l,如:
      byte[] b = new byte[1024];
      ByteBuffer bb = ByteBuffer.wrap(b);
c. 内存映射Q即调用FileChannel的map()Ҏ?br>
~冲区基本属?br>q几个属性是每个~冲区都有的q且是常用的操作?br>a. 定w(capacity),~冲区大?br>b. 限制(limit),W一个不应被d或写入的字节的烦引,L于定w?br>c. 位置(position)Q下一个被d或写入的字节的烦引,L于限制?br>d. clear()ҎQ设|limit为capacityQposition??br>e. filp()ҎQ设|limit为当前positionQ然后设|position??br>f. rewind()ҎQ保持limit不变Q设|position??br>
~冲区数据操?br>操作包括了读取和写入数据两种?br>d数据使用get()及其pdҎQ除boolean外,每一U类型包括了对应的get()ҎQ如getInt(),getChar(){,get()Ҏ用来d字节Q支持相对和l对索引两种方式?br>写入数据使用put()及其pdҎQ和get()Ҏ是对应的?br>
package nio;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class BufferDemo ...{

    
    public static void main(String[] args) throws Exception...{
        //分配一个非直接~冲?br>        ByteBuffer bb = ByteBuffer.allocate(100);
        //向缓冲区写入0?00的字节制
        for(int i = 0; i <100; i++)...{
            byte b = (byte) (Math.random() * 100);
            bb.put(b);
        }
        
        System.out.println("写入文g前的~冲区数?);
        bb.flip();
        while(bb.hasRemaining())
            System.out.print(bb.get() + " ");
        System.out.println();
        
        //获取一个关联到文gbuffer.txt的信?br>        FileChannel fc = new FileOutputStream("buffer.txt").getChannel();
        //缓冲区数据写到文g?br>        bb.flip();
        fc.write(bb);
        //防止~存
        fc.force(true);
        //关闭信道
        fc.close();
        bb = null;
        fc = null;
        
        //下面从文件中d数据
        fc = new FileInputStream("buffer.txt").getChannel();
        ByteBuffer bb2 = ByteBuffer.allocate((int) fc.size());
        fc.read(bb2);
        System.out.println("从文件读取的~冲区数?);
        bb2.flip();
        while(bb2.hasRemaining())
            System.out.print(bb2.get() + " ");
        System.out.println();
        fc.close();
        bb2 = null;
        fc = null;
        

    }

}

内存映射文g

W?8 U?Buffer cd MappedByteBuffer 只是一U特D的 ByteBuffer ?MappedByteBuffer 文件所在区域直接映到内存。通常Q该区域包含整个文gQ但也可以只映射部分文g。所以,必须指定要映文件的哪部分。而且Q与其它 Buffer 对象一Pq里没有构造函敎ͼ必须?java.nio.channels.FileChannel ?map() Ҏ来获?MappedByteBuffer 。此外,无需q多涉及通道可以用 getChannel() Ҏ?FileInputStream ?FileOutputStream 获取 FileChannel 。通过从命令行传入文g名来d文本文g的内容,清单 4 昄?MappedByteBuffer Q?


清单 4. d内存映射文本文g
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
public class ReadFileBuff {
  public static void main(String args[]) throws IOException {
     if (args.length != 0) {
      String filename = args[0];
      FileInputStream fis = new FileInputStream(filename);
      FileChannel channel = fis.getChannel();
      int length = (int)channel.size();
      MappedByteBuffer byteBuffer =
        channel.map(FileChannel.MapMode.READ_ONLY, 0, length);
      Charset charset = Charset.forName("ISO-8859-1");
      CharsetDecoder decoder = charset.newDecoder();
      CharBuffer charBuffer = decoder.decode(byteBuffer);
      for (int i=0, n=charBuffer.length(); i<n; i++) {
        System.out.print(charBuffer.get());
      }
    }
  }
}



]]>
Java的位UL?/title><link>http://m.tkk7.com/byterat/archive/2007/08/01/133746.html</link><dc:creator>比特?/dc:creator><author>比特?/author><pubDate>Wed, 01 Aug 2007 02:12:00 GMT</pubDate><guid>http://m.tkk7.com/byterat/archive/2007/08/01/133746.html</guid><wfw:comment>http://m.tkk7.com/byterat/comments/133746.html</wfw:comment><comments>http://m.tkk7.com/byterat/archive/2007/08/01/133746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/byterat/comments/commentRss/133746.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/byterat/services/trackbacks/133746.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"> <ol> <li>左移操作: x << n<br>x可以是byte, short, char, int, long基本cd, n(位移?只能是int?br><br>~译器的执行步骤:<br>1) 如果x是byte, short, charcd, 则将x提升为int;<br>2) 如果x是byte, short, char, intcd, 则n被重新赋?q程?取n的补码的?位再转成十进制的int?相当对n?2? n=n%32);<br>   如果x是long? 则n被重新赋?q程?取n的补码的?位再转成十进制的int?相当对n?4? n=n%64);<br>   (因ؓintcd?个字??2?Ud32位将没有M意义.对于long则是?4)<br>3) 对x左移n个位? 整个表达式生一个新?x的g?;</li> <li><<是左Uȝ?列x<<1,是x的内容左UM?x的内容ƈ不改?</li> <li>>>是带W号位的右移W号,x>>1是x的内容右UM?如果开头是1则补1,?责补0,(x的内容ƈ不改?.</li> <li>>>>是不带符号位的右U?x>>>1是x的内容右UM?开头补0(x的内容ƈ不改?</li> </ol> </span> <img src ="http://m.tkk7.com/byterat/aggbug/133746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/byterat/" target="_blank">比特?/a> 2007-08-01 10:12 <a href="http://m.tkk7.com/byterat/archive/2007/08/01/133746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaE序中的多线E??http://m.tkk7.com/byterat/archive/2007/07/30/133239.html比特?/dc:creator>比特?/author>Mon, 30 Jul 2007 01:36:00 GMThttp://m.tkk7.com/byterat/archive/2007/07/30/133239.htmlhttp://m.tkk7.com/byterat/comments/133239.htmlhttp://m.tkk7.com/byterat/archive/2007/07/30/133239.html#Feedback0http://m.tkk7.com/byterat/comments/commentRss/133239.htmlhttp://m.tkk7.com/byterat/services/trackbacks/133239.html原文地址 http://www.programbbs.com/doc/2433.htm
Z么会排队{待Q?

下面的这个简单的 Java E序完成四项不相关的d。这LE序有单个控制线E,控制在这四个d之间U性地Ud。此外,因ؓ所需的资??打印机、磁盘、数据库和显C屏 -- ׃g和Y件的限制都有内在的潜伏时_所以每Q务都包含明显的等待时间。因此,E序在访问数据库之前必须{待打印机完成打印文件的dQ等{。如果您正在{待E序的完成,则这是对计算资源和您的时间的一U拙劣用。改q此E序的一U方法是使它成ؓ多线E的?/div>
 
四项不相关的d
 

class myclass {
    static public void main(String args[]) {
        print_a_file();
        manipulate_another_file();
        access_database();
        draw_picture_on_screen();
    }
}

在本例中Q每Q务在开始之前必ȝ待前一Q务完成,即所涉及的Q务毫不相关也是这栗但是,在现实生zMQ我们经怋用多U程模型。我们在处理某些d的同时也可以让孩子、配偶和父母完成别的d。例如,我在写信的同时可能打发我的儿子去邮局买邮。用软g术语来说Q这UCؓ多个控制Q或执行Q线E?/p>

可以用两U不同的Ҏ来获得多个控制线E:

多个q程
在大多数操作pȝ中都可以创徏多个q程。当一个程序启动时Q它可以为即开始的每项d创徏一个进E,q允许它们同时运行。当一个程序因{待|络讉K或用戯入而被dӞ另一个程序还可以q行Q这样就增加了资源利用率。但是,按照q种方式创徏每个q程要付Z定的代hQ设|一个进E要占用相当一部分处理器时间和内存资源。而且Q大多数操作pȝ不允许进E访问其他进E的内存I间。因此,q程间的通信很不方便Qƈ且也不会它自己提供l容易的~程模型?


U程
U程也称型进E?(LWP)。因为线E只能在单个q程的作用域内活动,所以创建线E比创徏q程要廉价得多。这P因ؓU程允许协作和数据交换,q且在计资源方面非常廉P所以线E比q程更可取。线E需要操作系l的支持Q因此不是所有的机器都提供线E。Java ~程语言Q作为相当新的一U语aQ已线E支持与语言本n合ؓ一体,q样对U程提供了强健的支持?


使用 Java ~程语言实现U程
Java ~程语言使多U程如此单有效,以致于某些程序员说它实际上是自然的。尽在 Java 中用线E比在其他语a中要Ҏ得多Q仍然有一些概念需要掌握。要C的一仉要的事情?main() 函数也是一个线E,q可用来做有用的工作。程序员只有在需要多个线E时才需要创建新的线E?/p>

Thread c?
Thread cL一个具体的c,即不是抽象类Q该cd装了U程的行为。要创徏一个线E,E序员必dZ个从 Thread cd出的新类。程序员必须覆盖 Thread ?run() 函数来完成有用的工作。用户ƈ不直接调用此函数Q而是必须调用 Thread ?start() 函数Q该函数再调?run()。下面的代码说明了它的用法:

创徏两个新线E?/p>

import java.util.*;

class TimePrinter extends Thread {
    int pauseTime;

    String name;

    public TimePrinter(int x, String n) {
        pauseTime = x;
        name = n;
    }

    public void run() {
        while (true) {
            try {
                System.out.println(name + ":"
                        + new Date(System.currentTimeMillis()));
                Thread.sleep(pauseTime);
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }

    static public void main(String args[]) {
        TimePrinter tp1 = new TimePrinter(1000, "Fast Guy");
        tp1.start();
        TimePrinter tp2 = new TimePrinter(3000, "Slow Guy");
        tp2.start();

    }
}

在本例中Q我们可以看C个简单的E序Q它按两个不同的旉间隔Q? U和 3 U)在屏q上昄当前旉。这是通过创徏两个新线E来完成的,包括 main() ׃个线E。但是,因ؓ有时要作为线E运行的cd能已l是某个cdơ的一部分Q所以就不能再按q种机制创徏U程。虽然在同一个类中可以实CQ意数量的接口Q但 Java ~程语言只允怸个类有一个父cR同Ӟ某些E序员避免从 Thread cd出,因ؓ它强加了cdơ。对于这U情况,p runnable 接口?/p>

Runnable 接口
此接口只有一个函敎ͼrun()Q此函数必须由实C此接口的cd现。但是,p行这个类而论Q其语义与前一个示例稍有不同。我们可以用 runnable 接口改写前一个示例。(不同的部分用黑体表示。)

创徏两个新线E而不强加cd?/p>

import java.util.*;

class TimePrinter implements Runnable {
    int pauseTime;

    String name;

    public TimePrinter(int x, String n) {
        pauseTime = x;
        name = n;
    }

    public void run() {
        while (true) {
            try {
                System.out.println(name + ":"
                        + new Date(System.currentTimeMillis()));
                Thread.sleep(pauseTime);
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }

    static public void main(String args[]) {
        Thread t1 = new Thread(new TimePrinter(1000, "Fast Guy"));
        t1.start();
        Thread t2 = new Thread(new TimePrinter(3000, "Slow Guy"));
        t2.start();

    }
}

h意,当?runnable 接口Ӟ您不能直接创建所需cȝ对象q运行它Q必M Thread cȝ一个实例内部运行它。许多程序员更喜?runnable 接口Q因Z Thread cȝ承会强加cdơ?/p>

synchronized 关键?
到目前ؓ止,我们看到的示例都只是以非常简单的方式来利用线E。只有最的数据,而且不会出现两个U程讉K同一个对象的情况。但是,在大多数有用的程序中Q线E之间通常有信息流。试考虑一个金融应用程序,它有一?Account 对象Q如下例中所C:

一个银行中的多Ҏ?/p>

public class Account {
    String holderName;

    float amount;

    public Account(String name, float amt) {
        holderName = name;
        amount = amt;
    }

    public void deposit(float amt) {
        amount += amt;
    }

    public void withdraw(float amt) {
        amount -= amt;
    }

    public float checkBalance() {
        return amount;
    }
}

在此代码样例中潜伏着一个错误。如果此cȝ于单U程应用E序Q不会有M问题。但是,在多U程应用E序的情况中Q不同的U程有可能同时讉K同一?Account 对象Q比如说一个联合帐L所有者在不同?ATM 上同时进行访问。在q种情况下,存入和支出就可能以这L方式发生Q一个事务被另一个事务覆盖。这U情况将是灾难性的。但是,Java ~程语言提供了一U简单的机制来防止发生这U覆盖。每个对象在q行旉有一个关联的锁。这个锁可通过为方法添加关键字 synchronized 来获得。这P修订q的 Account 对象Q如下所C)不会遭受像数据损坏q样的错误:

对一个银行中的多Ҏ动进行同步处?/p>

public class Account {
    String holderName;

    float amount;

    public Account(String name, float amt) {
        holderName = name;
        amount = amt;
    }

    public synchronized void deposit(float amt) {
        amount += amt;
    }

    public synchronized void withdraw(float amt) {
        amount -= amt;
    }

    public float checkBalance() {
        return amount;
    }
}

deposit() ?withdraw() 函数都需要这个锁来进行操作,所以当一个函数运行时Q另一个函数就被阻塞。请注意QcheckBalance() 未作更改Q它严格是一个读函数。因?checkBalance() 未作同步处理Q所以Q何其他方法都不会d它,它也不会dM其他ҎQ不那些方法是否进行了同步处理?/p>

Java ~程语言中的高多线E支?/p>

U程l?
U程是被个别创徏的,但可以将它们归类到线E组中,以便于调试和监视。只能在创徏U程的同时将它与一个线E组相关联。在使用大量U程的程序中Q用线E组l织U程可能很有帮助。可以将它们看作是计机上的目录和文件结构?/p>

U程间发?
当线E在l箋执行前需要等待一个条件时Q仅?synchronized 关键字是不够的。虽?synchronized 关键字阻止ƈ发更C个对象,但它没有实现U程间发信。Object cMؓ此提供了三个函数Qwait()、notify() ?notifyAll()。以全球气候预程序ؓ例。这些程序通过地球分多单元,在每个@环中Q每个单元的计算都是隔离q行的,直到q些D于稳定,然后盔R单元之间׃交换一些数据。所以,从本质上Ԍ在每个@环中各个U程都必ȝ待所有线E完成各自的d以后才能q入下一个@环。这个模型称为屏蔽同步,下例说明了这个模型:

屏蔽同步

public class BSync {
    int totalThreads;

    int currentThreads;

    public BSync(int x) {
        totalThreads = x;
        currentThreads = 0;
    }

    public synchronized void waitForAll() {
        currentThreads++;
        if (currentThreads < totalThreads) {
            try {
                wait();
            } catch (Exception e) {
            }
        } else {
            currentThreads = 0;
            notifyAll();
        }
    }
}

当对一个线E调?wait() Ӟ该线E就被有效阻塞,只到另一个线E对同一个对象调?notify() ?notifyAll() 为止。因此,在前一个示例中Q不同的U程在完成它们的工作以后调?waitForAll() 函数Q最后一个线E将触发 notifyAll() 函数Q该函数释放所有的U程。第三个函数 notify() 只通知一个正在等待的U程Q当Ҏơ只能由一个线E用的资源q行讉K限制Ӟq个函数很有用。但是,不可能预知哪个线E会获得q个通知Q因取决?Java 虚拟?(JVM) 调度法?/p>

?CPU 让给另一个线E?
当线E放弃某个稀有的资源Q如数据库连接或|络端口Q时Q它可能调用 yield() 函数临时降低自己的优先Q以便某个其他线E能够运行?/p>

守护U程
有两cȝE:用户U程和守护线E。用LE是那些完成有用工作的线E。守护线E是那些仅提供辅助功能的U程。Thread cL供了 setDaemon() 函数。Java E序运行到所有用LE终止,然后它将破坏所有的守护U程。在 Java 虚拟?(JVM) 中,即?main l束以后Q如果另一个用LE仍在运行,则程序仍然可以l运行?/p>

避免不提倡用的Ҏ
不提倡用的Ҏ是ؓ支持向后兼容性而保留的那些ҎQ它们在以后的版本中可能出现Q也可能不出现。Java 多线E支持在版本 1.1 和版?1.2 中做了重大修订,stop()、suspend() ?resume() 函数已不提倡用。这些函数在 JVM 中可能引入微妙的错误。虽然函数名可能听v来很׃hQ但h制诱惑不要用它们?

调试U程化的E序
在线E化的程序中Q可能发生的某些常见而讨厌的情况是死锁、活锁、内存损坏和资源耗尽?/p>

死锁
死锁可能是多U程E序最常见的问题。当一个线E需要一个资源而另一个线E持有该资源的锁Ӟ׃发生死锁。这U情况通常很难。但是,解决Ҏ却相当好Q在所有的U程中按相同的次序获取所有资源锁。例如,如果有四个资?—A、B、C ?D ?q且一个线E可能要获取四个资源中Q何一个资源的锁,则请保在获取对 B 的锁之前首先获取?A 的锁Q依此类推。如?#8220;U程 1”希望获取?B ?C 的锁Q?#8220;U程 2”获取?A、C ?D 的锁Q则q一技术可能导致阻塞,但它永远不会在这四个锁上造成死锁?/p>

z锁
当一个线E忙于接受新d以致它永q没有机会完成Q何Q务时Q就会发生活锁。这个线E最l将出~冲区ƈDE序崩溃。试想一个秘书需要录入一信Q但她一直在忙于接电话,所以这信永远不会被录入?/p>

内存损坏
如果明智C?synchronized 关键字,则完全可以避免内存错误这U气Mh的问题?/p>

资源耗尽
某些pȝ资源是有限的Q如文g描述W。多U程E序可能耗尽资源Q因为每个线E都可能希望有一个这L资源。如果线E数相当大,或者某个资源的侯选线E数q远过了可用的资源敎ͼ则最好用资源池。一个最好的CZ是数据库q接池。只要线E需要用一个数据库q接Q它׃池中取出一个,使用以后再将它返回池中。资源池也称源库?/p>

调试大量的线E?
有时一个程序因为有大量的线E在q行而极难调试。在q种情况下,下面的这个类可能会派上用场:

public class Probe extends Thread {
    public Probe() {
    }

    public void run() {

        while (true) {
            Thread[] x = new Thread[100];
            Thread.enumerate(x);

            for (int i = 0; i < 100; i++) {
                Thread t = x[i];
                if (t == null)
                    break;
                else
                    System.out.println(t.getName() + "\t" + t.getPriority()
                            + "\t" + t.isAlive() + "\t" + t.isDaemon());
            }
        }
    }
}

限制U程优先U和调度
Java U程模型涉及可以动态更改的U程优先U。本质上Q线E的优先U是?1 ?10 之间的一个数字,数字大表明d紧急。JVM 标准首先调用优先U较高的U程Q然后才调用优先U较低的U程。但是,该标准对h相同优先U的U程的处理是随机的。如何处理这些线E取决于基层的操作系l策略。在某些情况下,优先U相同的U程分时q行Q在另一些情况下Q线E将一直运行到l束。请CQJava 支持 10 个优先Q基层操作系l支持的优先U可能要得多,q样会造成一些؜乱。因此,只能优先作ؓ一U很_略的工具用。最后的控制可以通过明智C?yield() 函数来完成。通常情况下,请不要依靠线E优先来控制线E的状态?/p>


本文说明了在 Java E序中如何用线E。像是否应该使用U程q样的更重要的问题在很大E序上取决于手头的应用程序。决定是否在应用E序中用多U程的一U方法是Q估计可以ƈ行运行的代码量。ƈC以下几点Q?/p>

使用多线E不会增?CPU 的能力。但是如果?JVM 的本地线E实玎ͼ则不同的U程可以在不同的处理器上同时q行Q在?CPU 的机器中Q,从而?CPU 机器得到充分利用?
如果应用E序是计密集型的,q受 CPU 功能的制U,则只有多 CPU 机器能够从更多的U程中受益?
当应用程序必ȝ待缓慢的资源Q如|络q接或数据库q接Q时Q或者当应用E序是非交互式的Ӟ多线E通常是有利的?
Z Internet 的Y件有必要是多U程的;否则Q用户将感觉应用E序反映q钝。例如,当开发要支持大量客户机的服务器时Q多U程可以使编E较为容易。在q种情况下,每个U程可以Z同的客户或客L服务Q从而羃短了响应旉?/p>

某些E序员可能在 C 和其他语a中用过U程Q在那些语言中对U程没有语言支持。这些程序员可能通常都被搞得对线E失M信心?/p>



]]>dom4j 从文件中装蝲XML ?性能比较 Q?/title><link>http://m.tkk7.com/byterat/archive/2007/05/19/118483.html</link><dc:creator>比特?/dc:creator><author>比特?/author><pubDate>Fri, 18 May 2007 16:39:00 GMT</pubDate><guid>http://m.tkk7.com/byterat/archive/2007/05/19/118483.html</guid><wfw:comment>http://m.tkk7.com/byterat/comments/118483.html</wfw:comment><comments>http://m.tkk7.com/byterat/archive/2007/05/19/118483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/byterat/comments/commentRss/118483.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/byterat/services/trackbacks/118483.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"><span style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">众所周知Q?Java在从XML文g中装载内容到内存q程中,不论用何U方式,IO操作的开销都无可避免。本文尝试比较dom4j中的XPP3和SAX两种方式装蝲XML文g的性能Q以便将IO操作的开销降到最!</span><br><br>package gz.lwm;<br><br>import java.io.File;<br>import org.apache.log4j.Logger;<br>import org.dom4j.Document;<br>import org.dom4j.DocumentHelper;<br>import org.dom4j.io.SAXReader;<br>import org.dom4j.io.XPP3Reader;<br><br>public class TestDom4j { <br> private static final Logger log = Logger.getLogger(TestDom4j.class);<br> private static long bt;  <br> <br> public static void main(String[] args) {<br>  <span style="COLOR: #ff0000">Document doc = DocumentHelper.createDocument();</span>   <br>  //先运行getXmlSAX()<br>  bt = System.currentTimeMillis();<br>  String strXml = getXmlSAX("xml/test.xml");<br>  if(log.isDebugEnabled()){<br>   log.debug("\ngetXmlSAX() use time: " + (System.currentTimeMillis() - bt) + " millis\n");<br>  }</p> <p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">  //再运行getXmlXPP3()<br>  bt = System.currentTimeMillis();<br>  String s1 =getXmlXPP3("xml/test.xml");<br>  if(log.isDebugEnabled()){<br>   log.debug("\ngetXmlXPP3() use time: " + (System.currentTimeMillis() - bt) + " millis\n");<br>  }<br>  <br>  <br> }<br> <br> public static String getXmlSAX(String xmlFile){<br>  String result = "";<br>  try {<br>   SAXReader reader = new SAXReader();<br>   Document document = reader.read(new File(xmlFile));<br>   result = document.asXML();<br>  } catch (Exception e) {<br>   e.printStackTrace();<br>  }<br>  return result;<br> }<br> <br> public static String getXmlXPP3(String xmlFile){<br>  String result = "";<br>  try {<br>   XPP3Reader reader = new XPP3Reader();<br>   Document document = reader.read(new File(xmlFile));<br>   result = document.asXML();<br>  } catch (Exception e) {<br>   e.printStackTrace();<br>  }<br>  return result;<br> }</p> <p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"><br> <br>}<br><br><font color=#ff0000><span style="COLOR: #000000">有没有这一?<font color=#ff0000>Document doc = DocumentHelper.createDocument()</font>",Ҏ能的媄响很?特别是对大xml文g(管q没有用doc)</span></font><br><br>另外Q?getXmlXSAX()和getXmlXPP3()q行的先后次序对性能的媄响也很大Q?br><br>试Q?br>    在我的机器上Q对一?00k左右的XML文gq行多次试后的均值结果ؓQ?br><br>    getXmlXPP3() use time: 265 millis<br>    ...<br>    getXmlXSAX() use time: 359 millis<br>    ...<br><br>l论Q?br>    通过比较Q在dXML文g上,XPP3略ؓ优于SAXQ?br><br><br>注意Q?br><br>要运行例子,classpath需包含Q?br>dom4j-1.6.1.jar<br>jaxen-1.1-beta-10.jar<br>log4j-1.2.9.jar<br>pull-parser-2.1.10.jar<br>xpp3-1.1.4c.jar<br><br><br>参考:<br>dom4j :  <a >http://www.dom4j.org/</a><br>XPP   :  <a >http://www.extreme.indiana.edu/xgws/xsoap/xpp/</a><br></p> <img src ="http://m.tkk7.com/byterat/aggbug/118483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/byterat/" target="_blank">比特?/a> 2007-05-19 00:39 <a href="http://m.tkk7.com/byterat/archive/2007/05/19/118483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dom4j 两种创徏XML DocumentҎ中命名空间的差异!http://m.tkk7.com/byterat/archive/2007/05/17/118172.html比特?/dc:creator>比特?/author>Thu, 17 May 2007 13:08:00 GMThttp://m.tkk7.com/byterat/archive/2007/05/17/118172.htmlhttp://m.tkk7.com/byterat/comments/118172.htmlhttp://m.tkk7.com/byterat/archive/2007/05/17/118172.html#Feedback0http://m.tkk7.com/byterat/comments/commentRss/118172.htmlhttp://m.tkk7.com/byterat/services/trackbacks/118172.html   Namespace namespace ...

   //W一U方?br>   Document doc = DocumentHelper.createDocument();
   Element root = doc.addElement("Root", namespace.getURI());
   Element eResultMessage = root.addElement("ResultMessage");

   l果?
   <Root xmlns="http://aaaaaa"><ResultMessage>...</ResultMessage></Root>



   //W二U方?br>   Document doc = DocumentHelper.createDocument();
   Element root = doc.addElement(("Root");
   root.add(namespace);
   Element eResultMessage = root.addElement("ResultMessage");
   
   l果?
   <Root xmlns="
http://aaaaaa"><ResultMessage xmlns="">...</ResultMessage></Root>



]]>
Java正则表达式语?/title><link>http://m.tkk7.com/byterat/archive/2007/05/17/118014.html</link><dc:creator>比特?/dc:creator><author>比特?/author><pubDate>Thu, 17 May 2007 02:48:00 GMT</pubDate><guid>http://m.tkk7.com/byterat/archive/2007/05/17/118014.html</guid><wfw:comment>http://m.tkk7.com/byterat/comments/118014.html</wfw:comment><comments>http://m.tkk7.com/byterat/archive/2007/05/17/118014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/byterat/comments/commentRss/118014.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/byterat/services/trackbacks/118014.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">正则表达式语?nbsp; <br> </p> <p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">正则表达式是一U文本模式,包括普通字W(例如Qa ?z 之间的字母)和特D字W(UCؓ“元字W?#8221;Q。模式描q在搜烦文本时要匚w的一个或多个字符丌Ӏ?/p> <p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">正则表达式示?br> <br>表达?nbsp; 匚w  <br>/^\s*$/<br> 匚wI?br> <br>/\d{2}-\d{5}/<br> 验证׃位数字、一个连字符再加 5 位数字组成的 ID 受?br> <br>/<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/<br> 匚w HTML 标记?br> </p> <p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">下表包含了元字符的完整列表以及它们在正则表达式上下文中的行ؓQ?/p> <p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"> <br>字符  说明  <br>\<br> 下一字符标记为特D字W、文本、反向引用或八进制{义符。例如,“n”匚w字符“n”?#8220;\n”匚w换行W。序?#8220;\\”匚w“\”Q?#8220;\(”匚w“(”?br> <br>^<br> 匚w输入字符串开始的位置。如果设|了 RegExp 对象?Multiline 属性,^ q会?#8220;\n”?#8220;\r”之后的位|匹配?br> <br>$<br> 匚w输入字符串结位置。如果设|了 RegExp 对象?Multiline 属性,$ q会?#8220;\n”?#8220;\r”之前的位|匹配?br> <br>*<br> 零次或多ơ匹配前面的字符或子表达式。例如,zo* 匚w“z”?#8220;zoo”? {效?{0,}?br> <br>+<br> 一ơ或多次匚w前面的字W或子表辑ּ。例如,“zo+”?#8220;zo”?#8220;zoo”匚wQ但?#8220;z”不匹配? {效?{1,}?br> <br>?<br> 零次或一ơ匹配前面的字符或子表达式。例如,“do(es)?”匚w“do”?#8220;does”中的“do”? {效?{0,1}?br> <br>{n}<br> n 是非负整数。正好匹?n ơ。例如,“o{2}”?#8220;Bob”中的“o”不匹配,但与“food”中的两个“o”匚w?br> <br>{n,}<br> n 是非负整数。至匹?n ơ。例如,“o{2,}”不匹?#8220;Bob”中的“o”Q而匹?#8220;foooood”中的所?o?#8220;o{1,}”{效?#8220;o+”?#8220;o{0,}”{效?#8220;o*”?br> <br>{n,m}<br> M ?n 是非负整敎ͼ其中 n <= m。匹配至?n ơ,臛_ m ơ。例如,“o{1,3}”匚w“fooooood”中的头三?o?o{0,1}' {效?'o?'。注意:您不能将I格插入逗号和数字之间?br> <br>?<br> 当此字符紧随M其他限定W(*??、{n}、{n,}、{n,m}Q之后时Q匹配模式是“非贪心的”?#8220;非贪心的”模式匚w搜烦到的、尽可能短的字符Ԍ而默认的“贪心?#8221;模式匚w搜烦到的、尽可能长的字符丌Ӏ例如,在字W串“oooo”中,“o+?”只匹配单?#8220;o”Q?#8220;o+”匚w所?#8220;o”?br> <br>.<br> 匚w?#8220;\n”之外的Q何单个字W。若要匹配包?#8220;\n”在内的Q意字W,请用诸?#8220;[\s\S]”之类的模式?br> <br>(pattern)<br> 匚w pattern q捕莯匚w的子表达式。可以?$0…$9 属性从l果“匚w”集合中检索捕L匚w。若要匹配括号字W?( )Q请使用“\(”或?#8220;\)”?br> <br>(?:pattern)<br> 匚w pattern 但不捕获该匹配的子表辑ּQ即它是一个非捕获匚wQ不存储供以后用的匚w。这对于?#8220;or”字符 (|) l合模式部g的情况很有用。例如,'industr(?:y|ies) 是比 'industry|industries' 更经的表达式?br> <br>(?=pattern)<br> 执行正向预测先行搜烦的子表达式,该表辑ּ匚w处于匚w pattern 的字W串的v始点的字W串。它是一个非捕获匚wQ即不能捕获供以后用的匚w。例如,'Windows (?=95|98|NT|2000)' 匚w“Windows 2000”中的“Windows”Q但不匹?#8220;Windows 3.1”中的“Windows”。预先行不占用字符Q即发生匚w后,下一匚w的搜索紧随上一匚w之后Q而不是在l成预测先行的字W后?br> <br>(?!pattern)<br> 执行反向预测先行搜烦的子表达式,该表辑ּ匚w不处于匹?pattern 的字W串的v始点的搜索字W串。它是一个非捕获匚wQ即不能捕获供以后用的匚w。例如,'Windows (?!95|98|NT|2000)' 匚w“Windows 3.1”中的 “Windows”Q但不匹?#8220;Windows 2000”中的“Windows”。预先行不占用字符Q即发生匚w后,下一匚w的搜索紧随上一匚w之后Q而不是在l成预测先行的字W后?br> <br>x|y<br> 匚w x ?y。例如,'z|food' 匚w“z”?#8220;food”?(z|f)ood' 匚w“zood”?#8220;food”?<br> <br>[xyz]<br> 字符集。匹配包含的M字符。例如,“[abc]”匚w“plain”中的“a”?<br> <br>[^xyz]<br> 反向字符集。匹配未包含的Q何字W。例如,“[^abc]”匚w“plain”中的“p”?<br> <br>[a-z]<br> 字符范围。匹配指定范围内的Q何字W。例如,“[a-z]”匚w“a”?#8220;z”范围内的M写字母?<br> <br>[^a-z]<br> 反向范围字符。匹配不在指定的范围内的M字符。例如,“[^a-z]”匚wM不在“a”?#8220;z”范围内的M字符?<br> <br>\b<br> 匚w一个字边界Q即字与I格间的位置。例如,“er\b”匚w“never”中的“er”Q但不匹?#8220;verb”中的“er”?<br> <br>\B<br> 非字边界匚w?#8220;er\B”匚w“verb”中的“er”Q但不匹?#8220;never”中的“er”?<br> <br>\cx<br> 匚w x 指示的控制字W。例如,\cM 匚w Control-M 或回车符。x 的值必d A-Z ?a-z 之间。如果不是这P则假?c 是“c”字符本n?<br> <br>\d<br> 数字字符匚w。等效于 [0-9]?<br> <br>\D<br> 非数字字W匹配。等效于 [^0-9]?<br> <br>\f<br> 换页W匹配。等效于 \x0c ?\cL?br> <br>\n<br> 换行W匹配。等效于 \x0a ?\cJ?br> <br>\r<br> 匚w一个回车符。等效于 \x0d ?\cM?br> <br>\s<br> 匚wMI白字符Q包括空根{制表符、换늬{。与 [ \f\n\r\t\v] {效?br> <br>\S<br> 匚wM非空白字W。与 [^ \f\n\r\t\v] {效?<br> <br>\t<br> 制表W匹配。与 \x09 ?\cI {效?br> <br>\v<br> 垂直制表W匹配。与 \x0b ?\cK {效?br> <br>\w<br> 匚wM字类字符Q包括下划线。与“[A-Za-z0-9_]”{效?<br> <br>\W<br> 与Q何非单词字符匚w。与“[^A-Za-z0-9_]”{效?<br> <br>\xn<br> 匚w nQ此处的 n 是一个十六进制{义码。十六进制{义码必须正好是两位数ѝ例如,“\x41”匚w“A”?#8220;\x041”?#8220;\x04”&“1”{效。允许在正则表达式中使用 ASCII 代码?br> <br>\num<br> 匚w numQ此处的 num 是一个正整数。到捕获匚w的反向引用。例如,“(.)\1”匚w两个q箋的相同字W?<br> <br>\n<br> 标识一个八q制转义码或反向引用。如?\n 前面臛_?n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八q制?(0-7)Q那?n 是八q制转义码?br> <br>\nm<br> 标识一个八q制转义码或反向引用。如?\nm 前面臛_?nm 个捕获子表达式,那么 nm 是反向引用。如?\nm 前面臛_?n 个捕P?n 是反向引用,后面跟有字符 m。如果两U前面的情况都不存在Q则 \nm 匚w八进制?nmQ其?n ?m 是八q制数字 (0-7)?br> <br>\nml<br> ?n 是八q制?(0-3)Qm ?l 是八q制?(0-7) Ӟ匚w八进制{义码 nml?br> <br>\un<br> 匚w nQ其?n 是以四位十六q制数表C的 Unicode 字符。例如,\u00A9 匚w版权W号 (?)?br> <br></p> <img src ="http://m.tkk7.com/byterat/aggbug/118014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/byterat/" target="_blank">比特?/a> 2007-05-17 10:48 <a href="http://m.tkk7.com/byterat/archive/2007/05/17/118014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DOM 的?/title><link>http://m.tkk7.com/byterat/archive/2007/05/17/117987.html</link><dc:creator>比特?/dc:creator><author>比特?/author><pubDate>Thu, 17 May 2007 02:10:00 GMT</pubDate><guid>http://m.tkk7.com/byterat/archive/2007/05/17/117987.html</guid><wfw:comment>http://m.tkk7.com/byterat/comments/117987.html</wfw:comment><comments>http://m.tkk7.com/byterat/archive/2007/05/17/117987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/byterat/comments/commentRss/117987.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/byterat/services/trackbacks/117987.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">package com.sunrise.ocs.webservice.unicom.test;</p> <p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">import java.io.File;<br>import java.io.StringReader;<br>import java.io.StringWriter;</p> <p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">import javax.xml.parsers.DocumentBuilder;<br>import javax.xml.parsers.DocumentBuilderFactory;</p> <p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">import org.w3c.dom.Document;<br>import org.w3c.dom.Element;<br>import org.w3c.dom.Node;<br>import org.xml.sax.InputSource;</p> <p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">import com.sun.org.apache.xml.internal.serialize.OutputFormat;<br>import com.sun.org.apache.xml.internal.serialize.XMLSerializer;</p> <p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">public class TestDom {<br> <br> //xml串{换ؓdocument<br> public static Document xml2Document(String xml) {<br>  Document doc = null;<br>  try {<br>   DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();<br>   doc = builder.parse(new InputSource(new StringReader(xml)));<br>  } catch (Exception e) {<br>   e.printStackTrace();<br>  }<br>  return doc;<br> }<br> <br> //xml文g串{换ؓdocument<br> public static Document xmlFile2Document(String xmlFile) {<br>  Document doc = null;<br>  try {<br>   DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();<br>   doc = builder.parse(new File(xmlFile));<br>  } catch (Exception e) {<br>   e.printStackTrace();<br>  }<br>  return doc;<br> }<br> <br> //删除命名I间: xmlns="..."<br> public static String delNamespace(String xml) {<br>  String result = xml;<br>  try {<br>   Document doc = xml2Document(xml);<br>   Element root = doc.getDocumentElement();<br>   root.removeAttribute("xmlns");<br>   result = asXml(doc);<br>  } catch (Exception e) {<br>   e.printStackTrace();<br>  }<br>  return result;<br> }<br> <br> //doc转换为xml?br> public static String asXml(Document doc) {<br>  String strxml = "";<br>  try {<br>   OutputFormat format = new OutputFormat(doc);<br>   // format.setEncoding("UTF-8");<br>   StringWriter stringOut = new StringWriter();<br>   XMLSerializer serial = new XMLSerializer(stringOut, format);<br>   serial.asDOMSerializer();<br>   serial.serialize(doc.getDocumentElement());<br>   strxml = stringOut.toString();<br>  } catch (Exception e) {<br>   e.printStackTrace();<br>  }<br>  return strxml;<br> }<br> <br> //node转换为xml?br> public static String asXml(Node node, Document doc) {<br>  String strxml = "";<br>  try {<br>   OutputFormat format = new OutputFormat(doc);<br>   // format.setEncoding("UTF-8");<br>   StringWriter stringOut = new StringWriter();<br>   XMLSerializer serial = new XMLSerializer(stringOut, format);<br>   serial.asDOMSerializer();<br>   serial.serialize((Element)node);<br>   strxml = stringOut.toString();<br>  } catch (Exception e) {<br>   e.printStackTrace();<br>  }<br>  return strxml;<br> }<br>}<br></p> <img src ="http://m.tkk7.com/byterat/aggbug/117987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/byterat/" target="_blank">比特?/a> 2007-05-17 10:10 <a href="http://m.tkk7.com/byterat/archive/2007/05/17/117987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JdbcTemplate学习W记!http://m.tkk7.com/byterat/archive/2007/04/11/109978.html比特?/dc:creator>比特?/author>Wed, 11 Apr 2007 10:48:00 GMThttp://m.tkk7.com/byterat/archive/2007/04/11/109978.htmlhttp://m.tkk7.com/byterat/comments/109978.htmlhttp://m.tkk7.com/byterat/archive/2007/04/11/109978.html#Feedback0http://m.tkk7.com/byterat/comments/commentRss/109978.htmlhttp://m.tkk7.com/byterat/services/trackbacks/109978.html

1、用JdbcTemplate的execute()Ҏ执行SQL语句

代码

2、如果是UPDATE或INSERT,可以用update()Ҏ?
代码

3、带参数的更?
代码

代码

4、用JdbcTemplateq行查询Ӟ使用queryForXXX(){方?
代码

代码

代码

代码

JdbcTemplate我们用的JDBC的流E封装v来,包括了异常的捕捉、SQL的执行、查询结果的转换{等。spring大量使用Template Method模式来封装固定流E的动作QXXXTemplate{类别都是基于这U方式的实现?
除了大量使用Template Method来封装一些底层的操作l节Qspring也大量用callback方式cd调相关类别的Ҏ以提供JDBC相关cd的功能,使传l的JDBC的用者也能清楚了解spring所提供的相兛_装类别方法的使用?/p>

JDBC的PreparedStatement

代码

代码

代码

在getUser(id)里面使用UserRowMapper

代码

|上攉
org.springframework.jdbc.core.PreparedStatementCreator q回预编译SQL 不能于Object[]一L

代码

1.增删?
org.springframework.jdbc.core.JdbcTemplate c?必须指定数据源dataSource)
代码

?
代码

org.springframework.jdbc.core.PreparedStatementSetter 接口 处理预编译SQL
代码

2.查询JdbcTemplate.query(String,[Object[]/PreparedStatementSetter],RowMapper/RowCallbackHandler)
org.springframework.jdbc.core.RowMapper 记录映射接口 处理l果?
代码

org.springframework.jdbc.core.RowCallbackHandler 记录回调理器接?处理l果?
代码



]]>
(?制作可执行的JAR文g包及jar命o详解!http://m.tkk7.com/byterat/archive/2007/04/11/109970.html比特?/dc:creator>比特?/author>Wed, 11 Apr 2007 10:19:00 GMThttp://m.tkk7.com/byterat/archive/2007/04/11/109970.htmlhttp://m.tkk7.com/byterat/comments/109970.htmlhttp://m.tkk7.com/byterat/archive/2007/04/11/109970.html#Feedback1http://m.tkk7.com/byterat/comments/commentRss/109970.htmlhttp://m.tkk7.com/byterat/services/trackbacks/109970.html制作可执行的JAR文g包及jar命o详解


常常在网上看到有问:如何?nbsp;java E序~译?nbsp;.exe 文g。通常回答只有两种Q一U是制作一个可执行?nbsp;JAR 文g包,然后可以像.chm 文一样双击运行了Q而另一U是使用 JET 来进?nbsp;~译。但?nbsp;JET 是要用钱买的Q而且据说 JET 也不是能把所有的 Java E序都编译成执行文gQ性能也要打些折扣。所以,使用制作可执?nbsp;JAR 文g包的Ҏ是最佳选择了,何况它还能保?nbsp;Java 的跨q_Ҏ?nbsp;

下面来看看什么是 JAR 文g包吧Q?nbsp;

1. JAR 文g?nbsp;

JAR 文g是 Java Archive FileQ顾名思意Q它的应用是?nbsp;Java 息息相关的,?nbsp;Java 的一U文格式。JAR 文g非常cM ZIP 文g——准的_它就?nbsp;ZIP 文gQ所以叫它文件包。JAR 文g?nbsp;ZIP 文g唯一的区别就是在 JAR 文g的内容中Q包含了一?nbsp;META-INF/MANIFEST.MF 文gQ这个文件是在生?nbsp;JAR 文g的时候自动创建的。D个例子,如果我们h如下目录l构的一些文Ӟ 

  == 

  `-- test 

    `-- Test.class 

把它压羃?nbsp;ZIP 文g test.zipQ则q个 ZIP 文g的内部目录结构ؓQ?nbsp;

  test.zip 

  `-- test 

    `-- Test.class 

如果我们使用 JDK ?nbsp;jar 命o把它打成 JAR 文g?nbsp;test.jarQ则q个 JAR 文g的内部目录结构ؓQ?nbsp;

  test.jar 

  |-- META-INF 

  |  `-- MANIFEST.MF 

  `-- test 

    `--Test.class 

2. 创徏可执行的 JAR 文g?nbsp;

制作一个可执行?nbsp;JAR 文g包来发布你的E序?nbsp;JAR 文g包最典型的用法?nbsp;

Java E序是由若干?nbsp;.class 文gl成的。这?nbsp;.class 文g必须Ҏ它们所属的包不同而分U分目录存放Q运行前需要把所有用到的包的根目录指定给 CLASSPATH 环境变量或?nbsp;java 命o?nbsp;-cp 参数Q运行时q要到控制台下去使用 java 命o来运行,如果需要直接双击运行必d Windows 的批处理文g (.bat) 或?nbsp;Linux ?nbsp;Shell E序。因此,许多QJava 是一U方便开发者苦了用LE序设计语言?nbsp;

其实不然Q如果开发者能够制作一个可执行?nbsp;JAR 文g包交l用P那么用户使用h方便了。在 Windows 下安?nbsp;JRE (Java Runtime Environment) 的时候,安装文g会将 .jar 文g映射l?nbsp;javaw.exe 打开。那么,对于一个可执行?nbsp;JAR 文g包,用户只需要双d可以运行程序了Q和阅读 .chm 文一h?nbsp;(.chm 文默认是由 hh.exe 打开?。那么,现在的关键,是如何来创个可执行?nbsp;JAR 文g包?nbsp;

创徏可执行的 JAR 文g包,需要用带 cvfm 参数?nbsp;jar 命oQ同样以上述 test 目录ZQ命令如下: 

jar cvfm test.jar manifest.mf test 

q里 test.jar ?nbsp;manifest.mf 两个文gQ分别是对应的参?nbsp;f ?nbsp;mQ其重头戏在 manifest.mf。因创徏可执行的 JAR 文g包,光靠指定一?nbsp;manifest.mf 文g是不够的Q因?nbsp;MANIFEST ?nbsp;JAR 文g包的特征Q可执行?nbsp;JAR 文g包和不可执行?nbsp;JAR 文g包都包含 MANIFEST。关键在于可执行 JAR 文g包的 MANIFESTQ其内容包含?nbsp;Main-Class 一V这?nbsp;MANIFEST 中书写格式如下: 

Main-Class: 可执行主cd?包含包名) 

例如Q假设上例中?nbsp;Test.class 是属?nbsp;test 包的Q而且是可执行的类 (定义?nbsp;public static void main(String[]) Ҏ)Q那么这?nbsp;manifest.mf 可以~辑如下Q?nbsp;

Main-Class: test.Test <回R>; 

q个 manifest.mf 可以攑֜M位置Q也可以是其它的文g名,只需要有 Main-Class: test.Test 一行,且该行以一个回车符l束卛_。创Z manifest.mf 文g之后Q我们的目录l构变ؓQ?nbsp;

  == 

  |-- test 

  |  `-- Test.class 

  `-- manifest.mf 

q时候,需要到 test 目录的上U目录中M?nbsp;jar 命o来创?nbsp;JAR 文g包。也是在目录树中?#8220;==”表示的那个目录中Q用如下命令: 

jar cvfm test.jar manifest.mf test 

之后?#8220;==”目录中创Z test.jarQ这?nbsp;test.jar 是执行?nbsp;JAR 文g包。运行时只需要?nbsp;java -jar test.jar 命o卛_?nbsp;

需要注意的是,创徏?nbsp;JAR 文g包中需要包含完整的、与 Java E序的包l构对应的目录结构,像上例一栗?nbsp;Main-Class 指定的类Q也必须是完整的、包含包路径的类名,如上例的 test.TestQ而且在没有打?nbsp;JAR 文g包之前可以?nbsp;java <cd>; 来运行这个类Q即在上例中 java test.Test 是可以正运行的 (当然要在 CLASSPATH 正确的情况下)?nbsp;

3. jar 命o详解 

jar 是随 JDK 安装的,?nbsp;JDK 安装目录下的 bin 目录中,Windows 下文件名?nbsp;jar.exeQLinux 下文件名?nbsp;jar。它的运行需要用?nbsp;JDK 安装目录?nbsp;lib 目录中的 tools.jar 文g。不q我们除了安?nbsp;JDK 什么也不需要做Q因?nbsp;SUN 已经帮我们做好了。我们甚至不需要将 tools.jar 攑ֈ CLASSPATH 中?nbsp;

使用不带M?nbsp;jar 命o我们可以看到 jar 命o的用法如下: 

jar {ctxu}[vfm0M] [jar-文g] [manifest-文g] [-C 目录] 文g?nbsp;... 

其中 {ctxu} ?nbsp;jar 命o的子命oQ每?nbsp;jar 命o只能包含 ctxu 中的一个,它们分别表示Q?nbsp;

-c 创徏新的 JAR 文g?nbsp;

-t 列出 JAR 文g包的内容列表 

-x 展开 JAR 文g包的指定文g或者所有文?nbsp;

-u 更新已存在的 JAR 文g?nbsp;(d文g?nbsp;JAR 文g包中) 

[vfm0M] 中的选项可以任选,也可以不选,它们?nbsp;jar 命o的选项参数 

-v 生成详细报告q打印到标准输出 

-f 指定 JAR 文g名,通常q个参数是必ȝ 

-m 指定需要包含的 MANIFEST 清单文g 

-0 只存储,不压~,q样产生?nbsp;JAR 文g包会比不用该参数产生的体U大Q但速度更快 

-M 不生所有项的清单(MANIFEST〕文Ӟ此参C忽略 -m 参数 

[jar-文g] 即需要生成、查看、更新或者解开?nbsp;JAR 文g包,它是 -f 参数的附属参?nbsp;

[manifest-文g] ?nbsp;MANIFEST 清单文gQ它?nbsp;-m 参数的附属参?nbsp;

[-C 目录] 表示转到指定目录下去执行q个 jar 命o的操作。它相当于先使用 cd 命o转该目录下再执行不带 -C 参数?nbsp;jar 命oQ它只能在创建和更新 JAR 文g包的时候可用。   

文g?nbsp;... 指定一个文?目录列表Q这些文?目录是要添加到 JAR 文g包中的文?目录。如果指定了目录Q那?nbsp;jar 命o打包的时候会自动把该目录中的所有文件和子目录打入包中?nbsp;

下面举一些例子来说明 jar 命o的用法: 

1) jar cf test.jar test 

该命令没有执行过E的昄Q执行结果是在当前目录生成了 test.jar 文g。如果当前目录已l存?nbsp;test.jarQ那么该文g被覆盖?nbsp;

2) jar cvf test.jar test 

该命令与上例中的l果相同Q但是由?nbsp;v 参数的作用,昄Z打包q程Q如下: 

标明清单(manifest) 

增加Qtest/(d= 0) (写出= 0)(存储?nbsp;0%) 

增加Qtest/Test.class(d= 7) (写出= 6)(压羃?nbsp;14%) 

3) jar cvfM test.jar test 

该命令与 2) l果cMQ但在生成的 test.jar 中没有包?nbsp;META-INF/MANIFEST 文gQ打包过E的信息也略有差别: 

增加Qtest/(d= 0) (写出= 0)(存储?nbsp;0%) 

增加Qtest/Test.class(d= 7) (写出= 6)(压羃?nbsp;14%) 

4) jar cvfm test.jar manifest.mf test 

q行l果?nbsp;2) 怼Q显CZ息也相同Q只是生?nbsp;JAR 包中?nbsp;META-INF/MANIFEST 内容不同Q是包含?nbsp;manifest.mf 的内?nbsp;

5) jar tf test.jar 

?nbsp;test.jar 已经存在的情况下Q可以查?nbsp;test.jar 中的内容Q如对于 2) ?nbsp;3) 生成?nbsp;test.jar 分别应该此命令,l果如下Q?nbsp;

对于 2) 

META-INF/ 

META-INF/MANIFEST.MF 

test/ 

test/Test.class 

对于 3) 

test/ 

test/Test.class 

6) jar tvf test.jar 

除显C?nbsp;5) 中显C的内容外,q包括包内文件的详细信息Q如Q?nbsp;

0 Wed Jun 19 15:39:06 GMT 2002 META-INF/ 

86 Wed Jun 19 15:39:06 GMT 2002 META-INF/MANIFEST.MF 

0 Wed Jun 19 15:33:04 GMT 2002 test/ 

7 Wed Jun 19 15:33:04 GMT 2002 test/Test.class 

7) jar xf test.jar 

解开 test.jar 到当前目录,不显CZQ何信息,对于 2) 生成?nbsp;test.jarQ解开后的目录l构如下Q?nbsp;

  == 

  |-- META-INF 

  |  `-- MANIFEST 

  `-- test 

    `--Test.class 

8) jar xvf test.jar 

q行l果?nbsp;7) 相同Q对于解压过E有详细信息昄Q如Q?nbsp;

创徏QMETA-INF/ 

展开QMETA-INF/MANIFEST.MF 

创徏Qtest/ 

展开Qtest/Test.class 

9) jar uf test.jar manifest.mf 

?nbsp;test.jar 中添加了文g manifest.mfQ此使用 jar tf 来查?nbsp;test.jar 可以发现 test.jar 中比原来多了一?nbsp;manifest。这里顺便提一下,如果使用 -m 参数q指?nbsp;manifest.mf 文gQ那?nbsp;manifest.mf 是作为清单文?nbsp;MANIFEST 来用的Q它的内容会被添加到 MANIFEST 中;但是Q如果作Z般文件添加到 JAR 文g包中Q它跟一般文件无异?nbsp;

10) jar uvf test.jar manifest.mf 

?nbsp;9) l果相同Q同时有详细信息昄Q如Q?nbsp;

增加Qmanifest.mf(d= 17) (写出= 19)(压羃?nbsp;-11%) 

4. 关于 JAR 文g包的一些技?nbsp;

1) 使用 unzip 来解?nbsp;JAR 文g 

在介l?nbsp;JAR 文g的时候就已经说过了,JAR 文g实际上就?nbsp;ZIP 文gQ所以可以用常见的一些解?nbsp;ZIP 文g的工h解压 JAR 文gQ如 Windows 下的 WinZip、WinRAR {和 Linux 下的 unzip {。?nbsp;WinZip ?nbsp;WinRAR {来解压是因为它们解压比较直观,方便。而?nbsp;unzipQ则是因为它解压时可以?nbsp;-d 参数指定目标目录?nbsp;

在解压一?nbsp;JAR 文g的时候是不能使用 jar ?nbsp;-C 参数来指定解压的目标的,因ؓ -C 参数只在创徏或者更新包的时候可用。那么需要将文g解压到某个指定目录下的时候就需要先这?nbsp;JAR 文g拯到目标目录下Q再q行解压Q比较麻烦。如果?nbsp;unzipQ就不需要这么麻烦了Q只需要指定一?nbsp;-d 参数卛_。如Q?nbsp;

unzip test.jar -d dest/ 

2) 使用 WinZip 或?nbsp;WinRAR {工具创?nbsp;JAR 文g 

上面提到 JAR 文g是包含?nbsp;META-INF/MANIFEST ?nbsp;ZIP 文gQ所以,只需要?nbsp;WinZip、WinRAR {工具创建所需?nbsp;ZIP 压羃包,再往q个 ZIP 压羃包中d一个包?nbsp;MANIFEST 文g?nbsp;META-INF 目录卛_。对于?nbsp;jar 命o?nbsp;-m 参数指定清单文g的情况,只需要将q个 MANIFEST 按需要修改即可?nbsp;

3) 使用 jar 命o创徏 ZIP 文g 

有些 Linux 下提供了 unzip 命oQ但没有 zip 命oQ所以需要可以对 ZIP 文gq行解压Q即不能创徏 ZIP 文g。如要创Z?nbsp;ZIP 文gQ用带 -M 参数?nbsp;jar 命o卛_Q因?nbsp;-M 参数表示制作 JAR 包的时候不d MANIFEST 清单Q那么只需要在指定目标 JAR 文g的地方将 .jar 扩展名改?nbsp;.zip 扩展名,创徏的就是一个不折不扣的 ZIP 文g了,如将上一节的W?nbsp;3) 个例子略作改动: 

jar cvfM test.zip test


]]>
java与\?http://m.tkk7.com/byterat/archive/2007/04/04/108473.html比特?/dc:creator>比特?/author>Wed, 04 Apr 2007 08:49:00 GMThttp://m.tkk7.com/byterat/archive/2007/04/04/108473.htmlhttp://m.tkk7.com/byterat/comments/108473.htmlhttp://m.tkk7.com/byterat/archive/2007/04/04/108473.html#Feedback0http://m.tkk7.com/byterat/comments/commentRss/108473.htmlhttp://m.tkk7.com/byterat/services/trackbacks/108473.html 

import java.io.File;

public class Test {
    
public static void main(String[] args) {
         System.out.println(
"1:"+Thread.currentThread().getContextClassLoader().getResource(""));     

          System.out.println(
"2:"+Test.class.getClassLoader().getResource(""));        

          System.out.println(
"3:"+ClassLoader.getSystemResource(""));        
          System.out.println(
"4:"+Test.class.getResource(""));        
          System.out.println(
"5:"+Test.class.getResource("/")); //Class文g所在\?nbsp; 
          System.out.println("6:"+new File("").getAbsolutePath());        
          System.out.println(
"7:"+System.getProperty("user.dir"));  
          
          String s 
= ClassLoader.getSystemResource("").getPath();
          System.out.println(s.substring(
1));
          System.out.println(s.substring(
1).substring(0, s.lastIndexOf("/classes")));

    }

}


]]>
dom4j 直接往Element中加入符合格式的xml?http://m.tkk7.com/byterat/archive/2007/03/27/106692.html比特?/dc:creator>比特?/author>Tue, 27 Mar 2007 08:20:00 GMThttp://m.tkk7.com/byterat/archive/2007/03/27/106692.htmlhttp://m.tkk7.com/byterat/comments/106692.htmlhttp://m.tkk7.com/byterat/archive/2007/03/27/106692.html#Feedback0http://m.tkk7.com/byterat/comments/commentRss/106692.htmlhttp://m.tkk7.com/byterat/services/trackbacks/106692.html dom4j 直接往Element中加入符合格式的xml?

下面的代码直接往root元素插入W合格式的xml?

String strXml = "<aaa><bbb></bbb><ccc></ccc></aaa>";
Document doc = DocumentHelper.createDocument();
Element  root = doc.getRootElement();
root.add(DocumentHelper.parseText(strXml).getRootElement());


]]>
javaq回执行旉的方?/title><link>http://m.tkk7.com/byterat/archive/2007/03/27/106674.html</link><dc:creator>比特?/dc:creator><author>比特?/author><pubDate>Tue, 27 Mar 2007 07:11:00 GMT</pubDate><guid>http://m.tkk7.com/byterat/archive/2007/03/27/106674.html</guid><wfw:comment>http://m.tkk7.com/byterat/comments/106674.html</wfw:comment><comments>http://m.tkk7.com/byterat/archive/2007/03/27/106674.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/byterat/comments/commentRss/106674.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/byterat/services/trackbacks/106674.html</trackback:ping><description><![CDATA[ public long <font color="red">algo()</font>{<br />    int a = 0;<br />    String b = null;<br />    long st = System.currentTimeMillis();<br />    for (int i = 0; i < 2000000; i++){<br />      b = Integer.toString(a);<br />    }<br />    long et = System.currentTimeMillis();<br />    return (et - st);<br />  }<img src ="http://m.tkk7.com/byterat/aggbug/106674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/byterat/" target="_blank">比特?/a> 2007-03-27 15:11 <a href="http://m.tkk7.com/byterat/archive/2007/03/27/106674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(?玩{ XPath 和缺省命名空_Default NamespacesQ?/title><link>http://m.tkk7.com/byterat/archive/2007/03/21/105172.html</link><dc:creator>比特?/dc:creator><author>比特?/author><pubDate>Wed, 21 Mar 2007 02:13:00 GMT</pubDate><guid>http://m.tkk7.com/byterat/archive/2007/03/21/105172.html</guid><wfw:comment>http://m.tkk7.com/byterat/comments/105172.html</wfw:comment><comments>http://m.tkk7.com/byterat/archive/2007/03/21/105172.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/byterat/comments/commentRss/105172.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/byterat/services/trackbacks/105172.html</trackback:ping><description><![CDATA[ <p> <strong>玩{ XPath 和缺省命名空_Default NamespacesQ?/strong> <br /> <br /> <font face="Courier New" size="2">原文:http://www.edankert.com/defaultnamespaces.html<br />译文出?http://wakan.blog.51cto.com/blog/59583/7220</font> <br /> <br /> <br /> <font face="Courier New" size="2">诸如“ؓ什么用 XPath 的表辑ּq行查询Q却没有q回所期望的结果?”的问题通常都与命名I间QNameSpaceQ有养I而且l大多数是与~省命名I间QDefault NamespaceQ有兟뀂本文试图解释这个问题ƈ针对三种行?XPath 实现l出解决ҎQJaxen、JAXP XPPathFactory 以及 XSLT?br />内容列表<br />问题描述 <br />“前~Q命名空间”映?<br />Jaxen ?Dom4J <br />Jaxen ?XOM <br />Jaxen ?JDOM <br />JAXP XPathFactory <br />XSLT <br />l束?<br />资源 </font> </p> <p> <br /> <font face="Courier New" size="2">问题描述<br />看下q?XML: <br /><catalog><br />  <cd><br />    <artist>Sufjan Stevens</artist> <br />    <title>Illinois</title> <br />    <src>http://www.sufjan.com/</src> <br />  </cd> <br />  <cd> <br />    <artist>Stoat</artist> <br />    <title>Future come and get me</title><br />    <src>http://www.stoatmusic.com/</src> <br />  </cd> <br />  <cd> <br />    <artist>The White Stripes</artist> <br />    <title>Get behind me satan</title> <br />    <src>http://www.whitestripes.com/</src> <br />  </cd> <br /></catalog> </font> </p> <p> <font face="Courier New" size="2">    你可以用?/cd”来得到没有在Q何命名空间中定义的“cd”节炏V?</font> </p> <p> <br /> <font face="Courier New" size="2">    现在让我们来攚w这?XMLQ让它的所有元素都属于 'http://www.edankert.com/examples/' 命名I间中?br /> <br />    Z避免在每个不同的元素前都要加个前~Q我们在根元素上定义通常所说的~省命名I间。改造后?XML 如下Q?<br /> <br /><catalog xmlns="</font> <a > <font face="Courier New" size="2">http://www.edankert.com/examples/</font> </a> <font face="Courier New" size="2">"><br />  <cd> <br />    <artist>Sufjan Stevens</artist> <br />    <title>Illinois</title> <br />    <src>http://www.sufjan.com/</src> <br />  </cd> <br />  <cd> <br />    <artist>Stoat</artist> <br />    <title>Future come and get me</title> <br />    <src>http://www.stoatmusic.com/</src> <br />  </cd> <br />  <cd> <br />    <artist>The White Stripes</artist> <br />    <title>Get behind me satan</title> <br />    <src>http://www.whitestripes.com/</src> <br />  </cd> <br /></catalog> </font> </p> <p> <font face="Courier New" size="2">    当我们用与上文相同?XPath ?/cd”,得不到M元素。这是因为指定的 XPath q回的是所有不属于M命名I间的“cd”节点,而本例中Q所有的“cd”元素都属于~省的命名空间“http://www.edankert.com/examples/”?</font> </p> <p> <br /> <font face="Courier New" size="2">“前~Q命名空间”映?br />    Z取出命名I间“http://www.edankert.com/examples/”中的所有“cd”元素,我们需要对 XPath 表达式做一些额外的工作?<br /> <br />    Z解决q个问题QXPath 规范允许我们使用 QName 来指定元素或者属性。QName 可以是元素的直接名称QŞ如“element”)Q或者包含一个前~QŞ如“pre:element”)。这个前~需要映到一个命名空间的 URI 上。例如,如果把“pre”前~映射到“http://www.edankert.com/test”上Q则通过“pre:element”可以查扑և属于命名I间“http://www.edankert.com/test”的所?“element”元素?br /> <br />    在本例中Q我们把“edx”映到?http://www.edankert.com/examples/”命名空间上。通过 XPath?/edx:cd”就可以查找出属于?http://www.edankert.com/examples/”命名空间的所有“cd”元素。?<br /> <br />    XPath 处理器允许设|“前~Q命名空间”的映射Q但是,如何L,却要依赖于具体的实现。下文D例说?Jaxen (JDOM/dom4j/XOM)、JAXP 以及 XSLT 中是如何q行“前~Q命名空间”的映射的?/font> </p> <p> <font face="Courier New" size="2">Jaxen ?Dom4J<br />    下述代码从文件系l读入一?XML 文g?org.dom4j.Document 对象中,q且?Document 中查扑ֱ于“http://www.edankert.com/examples/”命名空间的所有“cd”元素?br /> <br />try {<br />  SAXReader reader = new SAXReader();<br />  Document document = reader.read( "file:catalog.xml");<br />  <br />  HashMap map = new HashMap();<br />  map.put( "edx", "</font> <a > <font face="Courier New" size="2">http://www.edankert.com/examples/</font> </a> <font face="Courier New" size="2">");<br />  <br />  XPath xpath = new Dom4jXPath( "http://edx:cd");<br />  xpath.setNamespaceContext( new SimpleNamespaceContext( map));<br />  <br />  List nodes = xpath.selectNodes( document);<br />  <br />  ...<br />  <br />} catch ( JaxenException e) { // An error occurred parsing or executing the XPath ... } catch ( DocumentException e) {<br />  // the document is not well-formed.<br />  ...<br />}<br />    W一步,创徏一?SAXReaderQ用来从文gpȝ中读取“catalog.xml”ƈ创徏一个特定于 Dom4j ?Document 对象?</font> </p> <p> <font face="Courier New" size="2">    W二步,对于所?Jaxen 实现都一P是创徏一?HashMap 对象Q用于保存“前~Q命名空间的 URI”的映射?br /> <br />    Z能通过 Dom4j 使用 Jaxen ?XPath 功能Q需要创Z个与 Dom4j 相关?XPath 对象QDom4jXPath。创建方法是?XPath 的表辑ּQ即?/edx:cd”)传给 Dom4jXPath 的构造方法?br /> <br />    现在Q我们已l创Z XPath 对象Q接下来可以把“前~Q命名空间”的映射表传递给 XPath 引擎Q把q个 HashMap 映射表用 SimpleNamespaceContext 包装h。SimpleNamespaceContext ?Jaxen ?NamespaceContext 接口的默认实现类?<br /> <br />    最后一步就是调?XPath 对象?selectNodes() Ҏq行查找。ƈ把完整的 Dom4j  Document 对象作ؓ参数传递进厅R实际上QDocument 中的Ml点都可以作为参数?</font> </p> <p> <font face="Courier New" size="2">Jaxen ?XOM<br />    XOM 是基于简单的 Java DOM APIs 之上的最新工P它的设计初衷是提供简单和易学易用的接口?<br /> <br />try {<br />  Builder builder = new Builder();<br />  Document document = builder.build( "file:catalog.xml");<br />  <br />  HashMap map = new HashMap();<br />  map.put( "edx", "</font> <a > <font face="Courier New" size="2">http://www.edankert.com/examples/</font> </a> <font face="Courier New" size="2">");<br />  <br />  XPath xpath = new XOMXPath( "http://edx:cd");<br />  xpath.setNamespaceContext( new SimpleNamespaceContext( map));<br />  <br />  List nodes = xpath.selectNodes( document);<br />  <br />  ...<br />  <br />} catch ( JaxenException e) { // An error occurred parsing or executing the XPath ... } catch ( IOException e) {<br />  // An error occurred opening the document<br />  ...<br />} catch ( ParsingException e) {<br />  // An error occurred parsing the document<br />  ...<br />}</font> </p> <p> <font face="Courier New" size="2"> <br />    我们需要创Z?Builder 对象Q从文gpȝ中读取“catalog.xml”文Ӟq创建出?XOM 相关?Document 对象?<br /> <br />    下一步创建出包含了“前~Q命名空间”映关pȝ HashMap 对象?<br /> <br />    我们需要创Z个特定于 XOM ?XPath 对象QXOMXPath。创建方法是?XPath 表达式传递给构造方法,然后可以通过 XOM 使用 Jaxen ?XPath 功能了?<br /> <br />    创徏?XPath 对象后,同样Q我们把“前~Q命名空间”的映射表用 SimpleNamespaceContext 对象装后,传递给 XPath 引擎?<br /> <br />    最后调?XPath 对象的“selectNodes()”方法进行查找,?XOM Document 对象作ؓ本方法的参数?<br />Jaxen ?JDOM<br />    JDOM 是第一个提供简单的 XML 讉K API 的工兗?<br /> <br />try {<br />  SAXBuilder builder = new SAXBuilder();<br />  Document document = builder.build( "file:catalog.xml");<br />  <br />  HashMap map = new HashMap();<br />  map.put( "edx", "</font> <a > <font face="Courier New" size="2">http://www.edankert.com/examples/</font> </a> <font face="Courier New" size="2">");<br />  <br />  XPath xpath = new JDOMXPath( "http://edx:cd");<br />  xpath.setNamespaceContext( new SimpleNamespaceContext( map));<br />  <br />  List nodes = xpath.selectNodes( document);<br />  <br />  ...<br />  <br />} catch ( JaxenException e) { // An error occurred parsing or executing the XPath ... } catch ( IOException e) {<br />  // An error occurred opening the document<br />  ...<br />} catch ( JDOMException e) {<br />  // An error occurred parsing the document<br />  ...<br />}</font> </p> <p> <font face="Courier New" size="2"> <br />    首先Q通过 SAXBuilder 创徏了一个特定于 JDom ?Document 对象?<br /> <br />    接着创徏一个特定于 JDOM ?XPath 对象QJDOMXPath?br /> <br />    然后Q把“前~Q命名空间”的映射表(HashMapQ用 SimpleNamespaceContext 对象装hQ传递给 XPath 引擎?<br /> <br />    最后调?XPath 对象的“selectNodes()”方法来q行查找Qƈ?JDOM ?Document 对象作ؓ本方法的输入参数?<br />JAXP XPathFactory<br />    ?1.3 版vQ?JAXP q提供了一U在 XML Object Models 上进行查询的通用机制?<br /> <br />try {<br /> DocumentBuilderFactory domFactory =DocumentBuilderFactory.newInstance();<br />  domFactory.setNamespaceAware( true);<br />  <br /> DocumentBuilder builder = domFactory.newDocumentBuilder();Document document = builder.parse( new InputSource( "file:catalog.xml"));<br />  <br /> XPathFactory factory =XPathFactory.newInstance();<br /> XPath xpath = factory.newXPath();<br />  xpath.setNamespaceContext( new NamespaceContext() {<br />    public String getNamespaceURI(String prefix) {<br />      if ( prefix.equals( "edx")) {<br />        return "</font> <a > <font face="Courier New" size="2">http://www.edankert.com/examples/</font> </a> <font face="Courier New" size="2">";<br />      } else if ... <br />        ...<br />      }<br />      <br />      return XPathConstants.NULL_NS_URI;<br />    }<br />  <br />    public String getPrefix(String namespaceURI) {<br />      if ( namespaceURI.equals( "</font> <a > <font face="Courier New" size="2">http://www.edankert.com/examples/</font> </a> <font face="Courier New" size="2">")) {<br />        return "edx";<br />      } else if ... <br />        ...<br />      }  <br />    <br />      return null;<br />    }<br />  <br />    public Iterator getPrefixes(String namespaceURI) {<br />     ArrayList list = new ArrayList();<br />    <br />      if ( namespaceURI.equals( "</font> <a > <font face="Courier New" size="2">http://www.edankert.com/examples/</font> </a> <font face="Courier New" size="2">")) {<br />        list.add( "edx");<br />      } else if ... <br />        ...<br />      }<br />    <br />      return list.iterator();<br />    }<br />  });<br />  <br /> Object nodes = xpath.evaluate( "http://edx:cd", document.getDocumentElement(), <br />                                XPathConstants.NODESET);<br />  <br />  ...<br />  <br />} catch (ParserConfigurationException e) {<br />  ...<br />} catch (XPathExpressionException e) {<br />  ...<br />} catch (SAXException e) {<br />  ...<br />} catch (IOException e) {<br />  ...<br />}</font> </p> <p> <font face="Courier New" size="2">    首先?JAXP ?DocumentBuilderFactory 创徏一个org.w3c.dom.Document 对象Q确保启用了 namespace 处理功能?<br /> <br />    现在可以通过 XPathFactory 来创?XPath 对象Qƈ通过 XPath 对象Ҏ进行查询?br /> <br />    Z创徏“前~Q命名空间”映ƈ传递给 XPath 引擎Q我们需要实?NamespaceContext 接口Q该接口目前q没有默认实现类。这意味着要实?getNamespaceURI、getPrefix 和getPrefixes ҎQƈ保q些Ҏ能返回正的|包括“xmlns”和“xml”前~所对应的命名空间的 URI 倹{?<br /> <br />    把我们自己实现的 NamespaceContext 对象传递给 XPath 引擎后,可以通过 evaluate Ҏ来查?XPath 表达式所对应的元素:使用上文中提到的 XPath 表达式,q?Document 的根节点作ؓ输入入参敎ͼq接收一?NodeList 对象作ؓq回l果?<br />XSLT<br />    XPath 设计的初h用于 XSLT。这也许能解释“ؓ什么在 XSLT 中定义命名空间的前缀是一件很q_的事”(也许因ؓ XSLT 也是一?XML 名词的缘故吧Q?<br /> <br /><xsl:stylesheet version="1.1" xmlns:xsl="</font> <a > <font face="Courier New" size="2">http://www.w3.org/1999/XSL/Transform</font> </a> <font face="Courier New" size="2">"><br />  <xsl:template match="http://edx:cd" xmlns:edx="</font> <a > <font face="Courier New" size="2">http://www.edankert.com/examples/</font> </a> <font face="Courier New" size="2">"><br />    <xsl:apply-templates/><br />  </xsl:template><br /></xsl:stylesheet><br /> <br />    只需要?XML 本n的机Ӟ单地?edx 前缀赋予一个命名空间的 URI 倹{?<br /> <br />    通过与我们的 XPath 表达式?/edx:cd”相匚w?xsl:templateQ能得到与上文其他例子相同的输出l果?</font> </p> <p> <font face="Courier New" size="2">l束?br />    Z在(~省Q命名空间上使用 XPath 表达式,我们需要指定一个“前~Q命名空间”映。正如我们所看到的,具体使用什么样的前~名称Q是无关紧要的?<br /> <br />    同样的方法,也可以用于查询那些用其他前缀修饰的元素。这意味着上面的例子对下述 XML 也有效。下q?XML 没有使用~省命名I间Q而是使用?examples 作命名空间的前缀Q?<br /> <br /><examples:catalog xmlns:examples="</font> <a > <font face="Courier New" size="2">http://www.edankert.com/examples/</font> </a> <font face="Courier New" size="2">"><br />  <examples:cd><br />    <examples:artist>Sufjan Stevens</examples:artist><br />    <examples:title>Illinois</examples:title><br />    <examples:src>http://www.sufjan.com/</examples:src><br />  </examples:cd><br />  <examples:cd><br />    <examples:artist>Stoat</examples:artist><br />    <examples:title>Future come and get me</examples:title><br />    <examples:src>http://www.stoatmusic.com/</examples:src><br />  </examples:cd><br />  <examples:cd><br />    <examples:artist>The White Stripes</examples:artist><br />    <examples:title>Get behind me satan</examples:title><br />    <examples:src>http://www.whitestripes.com/</examples:src><br />  </examples:cd><br /></examples:catalog></font> </p> <p> <font face="Courier New" size="2"> <br />    使用?/edx:cd”作?XPath 表达式,使用与前文例子相同的“前~Q命名空间”映,在这?XML 上同栯查询出属于“http://www.edankert.com/examples/”命名空间的所有“cd”元素?<br />资源<br />Extensible Markup Language (XML) 1.0 (Third Edition)<br /></font> <a > <font face="Courier New" size="2">http://www.w3.org/TR/REC-xml/</font> </a> <font face="Courier New" size="2"> <br />Namespaces in XML<br /></font> <a > <font face="Courier New" size="2">http://www.w3.org/TR/REC-xml-names/</font> </a> <font face="Courier New" size="2"> <br />XML Path Language (XPath) Version 1.0<br /></font> <a > <font face="Courier New" size="2">http://www.w3.org/TR/xpath</font> </a> <font face="Courier New" size="2"> <br />XSL Transformations (XSLT) Version 1.0<br /></font> <a > <font face="Courier New" size="2">http://www.w3.org/TR/xslt</font> </a> <font face="Courier New" size="2"> <br />dom4j<br /></font> <a > <font face="Courier New" size="2">http://www.dom4j.org/</font> </a> <font face="Courier New" size="2"> <br />XOM<br /></font> <a > <font face="Courier New" size="2">http://www.xom.nu/</font> </a> <font face="Courier New" size="2"> <br />JDOM<br /></font> <a > <font face="Courier New" size="2">http://www.jdom.org/</font> </a> <font face="Courier New" size="2"> <br />Jaxen<br /></font> <a > <font face="Courier New" size="2">http://www.jaxen.org/</font> </a> <font face="Courier New" size="2"> <br />Java 5.0<br /></font> <a > <font face="Courier New" size="2">http://java.sun.com/j2se/1.5.0/</font> </a> <font face="Courier New" size="2"> </font> </p> <img src ="http://m.tkk7.com/byterat/aggbug/105172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/byterat/" target="_blank">比特?/a> 2007-03-21 10:13 <a href="http://m.tkk7.com/byterat/archive/2007/03/21/105172.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{】Eclipse中常用的快捷?/title><link>http://m.tkk7.com/byterat/archive/2006/12/19/88734.html</link><dc:creator>比特?/dc:creator><author>比特?/author><pubDate>Tue, 19 Dec 2006 04:18:00 GMT</pubDate><guid>http://m.tkk7.com/byterat/archive/2006/12/19/88734.html</guid><wfw:comment>http://m.tkk7.com/byterat/comments/88734.html</wfw:comment><comments>http://m.tkk7.com/byterat/archive/2006/12/19/88734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/byterat/comments/commentRss/88734.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/byterat/services/trackbacks/88734.html</trackback:ping><description><![CDATA[ <span id="tbrpxdx" class="tpc_content"> <font face="Courier New" size="2">Eclipse中常用的快捷?最l典的快捷键,׃用多说了)<br /><br />Ctrl+D: 删除当前?    <br /><br />Ctrl+Alt+?复制当前行到下一?复制增加)<br /><br />Ctrl+Alt+?复制当前行到上一?复制增加)<br /><br />Alt+?当前行和下面一行交互位|?特别实用,可以省去先剪?再粘贴了)<br /><br />Alt+?  当前行和上面一行交互位|?同上)<br /><br />Alt+?前一个编辑的面<br /><br />Alt+?下一个编辑的面(当然是针对上面那条来说了)<br /><br />Alt+Enter 昄当前选择资源(工程,or 文g or文g)的属?br /><br />Shift+Enter 在当前行的下一行插入空?q时鼠标可以在当前行的Q一位置,不一定是最?<br /><br />Shift+Ctrl+Enter 在当前行插入I(原理同上?<br /><br />Ctrl+Q   定位到最后编辑的地方<br /><br />Ctrl+L 定位在某?(对于E序过100的h有音?<br /><br />Ctrl+M 最大化当前的Edit或View (再按则反?<br /><br />Ctrl+/   注释当前?再按则取消注?br /><br />Ctrl+O   快速显C?OutLine<br /><br />Ctrl+T   快速显C当前类的承结?br /><br />Ctrl+W 关闭当前Editer<br /><br />Ctrl+K   参照选中的Word快速定位到下一?br /><br />Ctrl+E 快速显C当前Editer的下拉列?如果当前面没有昄的用黑体表示)<br /><br />Ctrl+/(键? 折叠当前cM的所有代?br /><br />Ctrl+×(键? 展开当前cM的所有代?br /><br />Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代?<br /><br />Ctrl+Shift+E 昄理当前打开的所有的View的管理器(可以选择关闭,Ȁzȝ操作)<br /><br />Ctrl+J 正向增量查找(按下Ctrl+J?你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显C没有找C,查一个单词时,特别实用,q个功能Idea两年前就有了)<br /><br />Ctrl+Shift+J 反向增量查找(和上条相?只不q是从后往前查)<br /><br />Ctrl+Shift+F4 关闭所有打开的Editer<br /><br />Ctrl+Shift+X   把当前选中的文本全部变呛_?br /><br />Ctrl+Shift+Y   把当前选中的文本全部变为小?br /><br />Ctrl+Shift+F 格式化当前代?br /><br />Ctrl+Shift+P 定位到对于的匚wW?譬如{}) (从前面定位后面时,光标要在匚wW里?后面到前?则反?<br /><br />下面的快捷键是重构里面常用的,本hp己喜Ƣ且常用的整理一??一般重构的快捷键都是Alt+Shift开头的?<br /><br />Alt+Shift+R 重命?(是我自己最q的一个了,其是变量和cȝRename,比手工方法能节省很多力_?<br /><br />Alt+Shift+M 抽取Ҏ (q是重构里面最常用的方法之一?其是对一大堆泥团代码有用)<br /><br />Alt+Shift+C 修改函数l构(比较实用,有N个函数调用了q个Ҏ,修改一ơ搞?<br /><br />Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变?其是多处调用的时?<br /><br />Alt+Shift+F 把Class中的local变量变ؓfield变量 (比较实用的功?<br /><br />Alt+Shift+I 合ƈ变量(可能q样说有点不妥Inline) <br /><br />Alt+Shift+V Ud函数和变?不怎么常用)<br /><br />Alt+Shift+Z 重构的后悔药(Undo)<br /><br />Ctrl+Shift+U 选择选中的文字后非常cM于UE的列表查?br /><br /><br />Eclipse启动参数大全 - -<br />                          <br />Eclipse q行命o行参数大?<br />包括英文版本和中文版本两U的说明, 特别需要值得一提的是那?-nl 参数, 可以指定E序启动时所使用的语a. 例如:<br />eclipse -nl en_US<br />启动英文语a, q个Ҏ在安装了国际化语言包以后特别有? 可以方便的切换各个语a的版? 注意 IBM WSAD v5.1 也支持这个功? <br /><br />q行 Eclipse<br />?Eclipse 驱动E序安装Q解压羃Q到某个目录Q例如,c:\eclipseQ中之后Q通过q行安装目录中的 Eclipse 可执行文件来启动"工作?。在 Windows pȝ上,该可执行文gUCؓ eclipse.exeQ而在 Linux pȝ上称?eclipse。注意:下列讨论描述 Windows pȝ上的讄。Linux 上的讄是相似的?br /><br />如果您没有另行指定,则^台将~省工作区目录创Zؓ可执行文件的兄弟目录Q例?c:\eclipse\workspaceQ。此工作区目录用作项目的~省内容区,q用于保存Q何必需的元数据。要q行׃n安装或多工作区安装,应明指出工作区的位|而不是用缺省倹{有两种控制工作Z|的ҎQ用当前工作目录或使用 -data 命o行自变量?br /><br />工作区位置讄为在当前工作目录?br />在此Ҏ中,工作Z|将是当前工作目录中UCؓ workspace 的目录?br /><br />实现此目的最Ҏ的方法可能是使用下列步骤来创建快h式:<br /><br />D?Windows 资源理器中?eclipse.exe q用右键拖动来创徏 eclipse.exe 的快h式?<br />~辑快捷方式的属性,以启动位置Q字D|识工作区位置的父目录Q例如,c:\users\robertQ?<br />关闭属性对话框q双dh式(如果提供的目录ؓ c:\users\robertQ则工作Z|将?c:\users\robert\workspaceQ?<br />当然Q您也可以用命令提C符Q通过目录切换ؓ工作区父目录然后q行 eclipse.exeQ来获得同样的效果?br /><br />使用 -data 讄工作区的特定位置<br />要?-data 命o行自变量Q只要将 -data your_workspace_locationQ例如,-data c:\users\robert\myworkspaceQ添加至快捷方式属性中的目标字D|昑ּ地将它包括在命o行上?br /><br />使用 -vm 讄 java VM<br />昑ּ指定在运?Eclipse 时要使用哪个 Java VM。?-vm 命o行自变量Q例如,-vm c:\jre\bin\javaw.exeQ可以实现此目的。如果不使用 -vmQ则 Eclipse 用在 O/S 路径上找到的一?Java VM。当安装其它产品Ӟ它们可更Ҏ的\径,D在下一ơ启?Eclipse 时用另一 Java VM?br /><br />q行 Eclipse 中的高主题<br />Eclipse 可执行文件及q_本n提供了h们感兴趣的开发或调试 Eclipse 各部件的许多执行选项。运?Eclipse 可执行文件的一般格式是Q?br /><br />eclipse [platform options] [-vmargs [Java VM arguments]]<br />Eclipse 启动参数 命o 描述 原因 <br />-arch architecture<br />定义 Eclipse q_在其上运行的处理器体pȝ构。Eclipse q_通常使用 Java os.arch 属性的常用值来计算最佌|。如果在此处指定该项Q则q是 Eclipse q_使用的倹{此处指定的值可作ؓ BootLoader.getOSArch() 用于插g。示例值有Q?x86"?sparc"?PA-RISC"?ppc"?2.0 <br />-application applicationId<br />要运行的应用E序。应用程序由?org.eclipse.core.runtime.applications 扩展Ҏ供扩展的插g来声明。通常不需要此自变量。如果指定了此项Q则该g覆盖配置提供的倹{如果不指定此项Q则会运?Eclipse 工作??1.0 <br />-boot bootJarURL<br />Q徏议不使用Q用 -configuration 代替Q支?1.0 兼容Q。Eclipse q_的引导插件代码(boot.jarQ的位置Q表CZؓ URL。如果指定此,则会用它来ؓ装入 Eclipse q_引导E序c装入器的类装入器设|类路径。仅当更?startup.jar ?boot.jar 的相对位|时才需要它。注意,不允怋用相?URL?*1.0 <br />-classloaderproperties [file]<br />如果指定的话Q则使用l定位置处的c装入器属性文件来Ȁzd^台类c装入器增强。文件自变量可以是文件\径或 URL。注意,不允怋用相?URL。单L处以获得更多详细信息?2.0.2 <br />-configuration configurationFileURL<br />Eclipse q_配置文g的位|,表示?URL。配|文件确?Eclipse q_、可用插仉和主要功能部件的位置。注意,不允怋用相?URL。当安装或更?Eclipse q_旉|文件被写至此位|?2.0 <br />-consolelog<br />?Eclipse q_的错误日志镜像到用来q行 Eclipse 的控制台。与 -debug l合时很方便使用?1.0 <br />-data workspacePath<br />要运?Eclipse q_的工作区的\径。工作区位置也是目的缺省位|。相对于从中启动 eclipse 的目录来解释相对路径?1.0 <br />-debug [optionsFile]<br />^台置于调试方式,q从l定位置处的文g装入调试选项Q如果指定的话)。此文g指示哪些调试点可用于插g以及是否已启用它们。如果未l出文g位置Q则q_在启?eclipse 的目录中查找UCؓ".options"的文件。URL 和文件系l\径都可作为文件位|?1.0 <br />-dev [classpathEntries]<br />^台置于开发方式。将可选类路径条目Q用逗号分隔的列表)dx个插件的q行时类路径。例如,当工作区包含要开发的插gӞ指定 -dev bin 会ؓ每个插g目的名?bin 的目录添加类路径条目Q允许在其中存储最新生成的cL件。除M冗余或不存在的类路径条目?1.0 <br />-endsplash params<br />用于?Eclipse q_启动q运行时关闭闪屏的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义?2.0 <br />-feature featureId<br />主要功能部g的标识。主要功能部件ؓ Eclipse 的已启动实例提供了品个性,q确定用的产品定制信息?2.0 <br />-keyring keyringFilePath<br />盘上授权数据库Q或"密钥?文gQ的位置。此自变量必M -password 选项配合使用。相对于从中启动 eclipse 的目录来解释相对路径?1.0 <br />-nl locale<br />定义 Eclipse q_在其上运行的语言环境的名U。Eclipse q_通常自动计算最佌|。如果在此处指定该项Q则q是 Eclipse q_使用的倹{此处指定的值可作ؓ BootLoader.getNL() 用于插g。示例值有Q?en_US"?fr_FR_EURO"?2.0 <br />-nolazyregistrycacheloading<br />取消Ȁz装入优化的q_插g注册表高速缓存。缺省情况下Q仅当需要时才从注册表高速缓存(可用Ӟ中装入扩展的配置元素Q以减少内存占用。此选项在启动时强制完全装入注册表高速缓存?2.1 <br />-noregistrycache<br />l过d内部插g注册表高速缓存文件?2.0 <br />-nosplash<br />q行q_而不昄闪屏?1.0 <br />-os operatingSystem<br />定义 Eclipse q_在其上运行的操作pȝ。Eclipse q_通常使用 Java os.name 属性的常用值来计算最佌|。如果在此处指定该项Q则q是 Eclipse q_使用的倹{此处指定的值可作ؓ BootLoader.getOS() 用于插gQƈ用于解析插g清单文g中提及的路径?$os$ 变量的出现。示例值有Q?win32"?linux"?hpux"?solaris"?aix"?1.0 <br />-password password<br />授权数据库的密码。与 -keyring 选项配合使用?1.0 <br />-perspective perspectiveId<br />启动时要在活动工作台H口中打开的透视图。如果没有指定该参数Q则打开关闭时活动的透视图?1.0 <br />-plugincustomization   propertiesFile<br />包含插g首选项~省讄的属性文件的位置。这些缺省设|覆盖在主要功能部g中指定的~省讄。相对于从中启动 eclipse 的目录来解释相对路径?2.0 <br />-plugins pluginsFileURL<br />Q徏议不使用Q用 -configuration 代替Q支?1.0 兼容Q?指定 Eclipse q_查找插g的文件的位置Q表CZؓ URL。该文g为属性文件格式,其中键是L用户定义名称Q值是指向 plugin.xml 文g的显式\径或指向包含插g的目录的路径的用逗号分隔的列表。注意,不允怋用相?URL。如果指定此,则此选项会导致创建适当的旉|?*1.0 <br />-refresh <br />启动时执行工作区的全局h的选项。这从上ơ^台运行以来在文gpȝ中所做的M更改一致?1.0 <br />-showlocation <br />用于在窗口标题栏中显C工作区的位|的选项。在发行?2.0 中,此选项仅与 -data 命o行自变量一起用?2.0 <br />-showsplash params<br />用于昄闪屏Q由可执行的 Eclipse q_启动器执行)的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义?2.0 <br />-vm vmPath<br />要用来运?Eclipse q_?Java q行时环?QJREQ的位置。如果不指定此项Q则 JRE 位于 jreQ它?Eclipse 可执行文件的兄弟目录Q。相对于从中启动 eclipse 的目录来解释相对路径?1.0 <br />-ws windowSystem<br />定义 Eclipse q_在其上运行的 Windows pȝ。Eclipse q_通常使用 Java os.name 属性的常用值来计算最佌|。如果在此处指定该项Q则q是 Eclipse q_使用的倹{此处指定的值可作ؓ BootLoader.getWS() 用于插g、用于配|?SWT 以及用于解析插g清单文g中提及的路径?$ws$ 变量的出现。示例值有Q?win32"?motif"?gtk"?1.0 <br /><br />?-vmargs 条目后面的所有自变量Q但不包?-vmargsQ作拟机自变量(卻I在要q行的类的前面)直接传递到所指示?Java VM。注意:如果 Eclipse 启动?Java vm 自变量(-vmargsQ之后提供的自变量(例如Q?dataQ,?Eclipse 不会启动ƈ且您接收到"JVM 已终止。出口代码ؓ 1"的错误?br /><br />在不同的 VM 上运?<br />?J9 上运?Eclipse<br />当在 J9 版本 1.5 上运?Eclipse Ӟ使用以下 VM 选项Q?<br /><br />eclipse.exe [eclipse arguments] -vm path_to_j9w.exe         -vmargs -ms:32 -mm:2048 -mo:32768 -moi:32768 -mca:32 -mco:128 -mx:2000000<br />当在 J9 版本 2.0 上运?Eclipse ӞJ9W 选择的缺省自变量应ؓ合适的选项。但是,要覆?Eclipse 可执行文件以内部方式自动讄的参敎ͼ必须指定 -vmargs 不带M参数Q如下所C: <br /><br />eclipse.exe [eclipse arguments] -vm path_to_j9w.exe -vmargs<br />有关q一步信息,参?J9 VM 文档和帮助?br /><br />?IBM Developer Kit, Java(TM) Technology Edition VM 上运?Eclipse<br />IBM Developer Kit, Java(TM) Technology Edition 1.3 Linux 的缺?VM 讄适合q行初期研究工作Q但在进行大型开发时是不够的。对于大型开发,应修?VM 自变量以使有更多的堆可用。例如,下列讄允?Java 堆增大ؓ 256MB</font> </span> <img src ="http://m.tkk7.com/byterat/aggbug/88734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/byterat/" target="_blank">比特?/a> 2006-12-19 12:18 <a href="http://m.tkk7.com/byterat/archive/2006/12/19/88734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个典型的build.xmlhttp://m.tkk7.com/byterat/archive/2006/11/08/79765.html比特?/dc:creator>比特?/author>Wed, 08 Nov 2006 01:47:00 GMThttp://m.tkk7.com/byterat/archive/2006/11/08/79765.html <?xml version="1.0" encoding="UTF-8"?>
<project name="test" default="compile" basedir=".">
  <!-- define the properties for target reference -->
  <property name="dir.src" value="src"/>
  <property name="dir.etc" value="etc"/>  
  <property name="dir.web" value="web"/>
  <property name="dir.meta" value="meta"/>  
  <property name="dir.lib" value="${dir.web}/WEB-INF/lib"/>
  <property name="dir.build" value="${dir.web}/WEB-INF"/>
  <property name="dir.classes" value="${dir.web}/WEB-INF/classes"/>
  <property name="app.name" value="ocs"/>

  <!-- data base -->  
  <property file="${dir.web}/WEB-INF/config/jdbc.properties"/>  
  <property name="database.driver"   value="${jdbc.driverClassName}"/>
  <property name="database.url"      value="${jdbc.url}"/>
  <property name="database.username" value="${jdbc.username}"/>
  <property name="database.password" value="${jdbc.password}"/>

  <!-- the classpth of ant -->
  <path id="classpath">
    <fileset dir="${dir.lib}" includes="**/*.jar" />
    <pathelement path="${dir.classes}"/>
  </path>


  <!-- compile the src and test source code -->
  <target name="compile" description="Compile main source and test tree java files">
   <delete dir="${dir.classes}"/>   
   <mkdir dir="${dir.classes}"/>
    <javac srcdir="${dir.src}" destdir="${dir.classes}" debug="on">
      <classpath refid="classpath"/>
    </javac>
    <copy todir="${dir.classes}">
      <fileset dir="${dir.src}" includes="**/*.xml,**/*.properties">
          <!--exclude name="**/*.hbm.xml" /-->
      </fileset>
      <fileset dir="${dir.etc}" includes="**/*.properties"/>
    </copy>
  <native2ascii dest="${dir.classes}" src="${dir.etc}" encoding="UTF-8" includes="**/*.src" ext=".properties" />
  </target>

 
  <!-- setup the database and initialize the data -->
  <target name="setup-db">
    <echo message="=========================================================="/>
    <echo message="database driver:${database.driver}"/>
    <echo message="database
url:${database.url}"/ >
    <echo message="database username:${database.username}"/>
    <echo message="database password:${database.password}"/>
    <echo message="=========================================================="/>  
   
    <antcall target="runSql" inheritAll="false">
      <param name="script.sql" value="${dir.meta}/database-setup.sql"/>
      <param name="database.driver" value="${database.driver}"/>
      <param name="database.url" value="${database.url}"/>
      <param name="database.username" value="${database.username}"/>
      <param name="database.password" value="${database.password}"/>
    </antcall>
    <echo message="initialize Sample data..."/>
    <antcall target="runSql" inheritAll="false">
      <param name="script.sql" value="${dir.meta}/database-init.sql"/>
      <param name="database.driver" value="${database.driver}"/>
      <param name="database.url" value="${database.url}"/>
      <param name="database.username" value="${database.username}"/>
      <param name="database.password" value="${database.password}"/>
    </antcall>
  </target>
  
 
  <!-- run the sql to setup database -->
  <target name="runSql">
    <sql src="${script.sql}"
         driver="${database.driver}"
         url="${database.url}"
         userid="${database.username}"
         password="${database.password}"
         classpathref="classpath"
         onerror="continue"/>
  </target>

  <target name="clean" description="Clean output directories">
    <delete dir="${dir.classes}"/>
  </target>
 
   
  <target name="deploy" description="deploy......" depends="clean,compile" >
  </target>
</project>



]]>
使用WPT 1.5.x 时的一些配|?/title><link>http://m.tkk7.com/byterat/archive/2006/11/08/79761.html</link><dc:creator>比特?/dc:creator><author>比特?/author><pubDate>Wed, 08 Nov 2006 01:44:00 GMT</pubDate><guid>http://m.tkk7.com/byterat/archive/2006/11/08/79761.html</guid><wfw:comment>http://m.tkk7.com/byterat/comments/79761.html</wfw:comment><comments>http://m.tkk7.com/byterat/archive/2006/11/08/79761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/byterat/comments/commentRss/79761.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/byterat/services/trackbacks/79761.html</trackback:ping><description><![CDATA[ <font face="Courier New" size="2">1. window -- Preferences<br />      1.1 Content Types <br />          讄相关的文件ؓ"UTF-8", 如果在列表中没有文g后缀, 则增加相应的文g后缀.<br /><br />      1.2 Workspace<br />          讄"Text file encoding" ?"UTF-8".<br /><br /><br />2. Validation<br />      Validator? 除了Application client validator外的所有validator?Manual"?Build", 全部|空(卛_消打?</font> <img src ="http://m.tkk7.com/byterat/aggbug/79761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/byterat/" target="_blank">比特?/a> 2006-11-08 09:44 <a href="http://m.tkk7.com/byterat/archive/2006/11/08/79761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://fenxue520.com" target="_blank">޳AVƬ߹ۿ</a>| <a href="http://rr433.com" target="_blank">һƷһavһˬˬ</a>| <a href="http://kelingdq.com" target="_blank">avþþƷ</a>| <a href="http://hjndgb.com" target="_blank">ɫƵɫ¶¶ѹۿ</a>| <a href="http://cih60o.com" target="_blank">ŷպëƬ߿վ</a>| <a href="http://www66913.com" target="_blank">Ƶѹۿ</a>| <a href="http://5gg1.com" target="_blank">պŷһ</a>| <a href="http://7a37.com" target="_blank">޸Ƶ</a>| <a href="http://lzqzvip.com" target="_blank">þþ뾫Ʒպ</a>| <a href="http://tccqdy.com" target="_blank">ŷ޾Ʒһ</a>| <a href="http://147v.com" target="_blank">avһ</a>| <a href="http://www77714.com" target="_blank">ɫƷva߹ۿƵ </a>| <a href="http://zblinghang.com" target="_blank">ŷ߹ۿ</a>| <a href="http://038037.com" target="_blank">Ļ</a>| <a href="http://szhszszy.com" target="_blank">Avۺɫרɫ</a>| <a href="http://kingco-glaze.com" target="_blank">޹˾þۺ</a>| <a href="http://666fzw.com" target="_blank">gavѲƵ</a>| <a href="http://maiertejx.com" target="_blank">߹ۿ˳Ƶɫ9</a>| <a href="http://shaonvfushi.com" target="_blank">67paoǿ</a>| <a href="http://www621f.com" target="_blank">þþþùƷѿ</a>| <a href="http://wankufan.com" target="_blank">VƬ߹ۿ</a>| <a href="http://51xinshiji.com" target="_blank">ѹ߾Ʒһ </a>| <a href="http://99880524.com" target="_blank">òƵƽ̨</a>| <a href="http://www2626cf.com" target="_blank">ѹƵС</a>| <a href="http://43caopen.com" target="_blank">ĻĴȫƵ</a>| <a href="http://bzzxyp.com" target="_blank">ŷһëƬ</a>| <a href="http://avyjj.com" target="_blank">6080ҹһëƬѿ6080ҹ </a>| <a href="http://9xcb.com" target="_blank">˳ֻˬƵߵӰ</a>| <a href="http://kdp44.com" target="_blank">޾Ʒŷۺ</a>| <a href="http://sjmthanks.com" target="_blank">Ļ޳AƬ</a>| <a href="http://kelingdq.com" target="_blank">ͽxx</a>| <a href="http://bqjonline.com" target="_blank">޹Ʒۺɫ</a>| <a href="http://7t53.com" target="_blank">þþ97ɫ </a>| <a href="http://ding001.com" target="_blank">gogo߹ۿ</a>| <a href="http://www-135888.com" target="_blank">ѹۿ</a>| <a href="http://kk600700.com" target="_blank">òѸ</a>| <a href="http://6123fa.com" target="_blank">ƷѸþ</a>| <a href="http://xxxxyz.com" target="_blank">8090߹ۿѹۿ</a>| <a href="http://schygfz.com" target="_blank">wŷs</a>| <a href="http://gepuw.com" target="_blank">þþƷһ</a>| <a href="http://zjhmpaper.com" target="_blank">Ƶ߹ۿ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>