﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-MyJava-随笔分类-java</title><link>http://www.blogjava.net/Sprite-bei/category/18207.html</link><description>&lt;font size="3"&gt;&lt;br&gt;&lt;font color="#ff6600"&gt;天行健  君子以自强不息&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Mon, 16 Apr 2007 17:50:08 GMT</lastBuildDate><pubDate>Mon, 16 Apr 2007 17:50:08 GMT</pubDate><ttl>60</ttl><item><title>设计模式之Observer</title><link>http://www.blogjava.net/Sprite-bei/archive/2007/04/16/110976.html</link><dc:creator>zht</dc:creator><author>zht</author><pubDate>Mon, 16 Apr 2007 07:34:00 GMT</pubDate><guid>http://www.blogjava.net/Sprite-bei/archive/2007/04/16/110976.html</guid><wfw:comment>http://www.blogjava.net/Sprite-bei/comments/110976.html</wfw:comment><comments>http://www.blogjava.net/Sprite-bei/archive/2007/04/16/110976.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/Sprite-bei/comments/commentRss/110976.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Sprite-bei/services/trackbacks/110976.html</trackback:ping><description><![CDATA[<p><span>Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Observer(观察者)模式是比较常用的一个模式,尤其在界面设计中应用广泛,而本站所关注的是Java在电子商务系统中应用,因此想从电子商务实例中分析Observer的应用.</span></p>
<p>虽然网上商店形式多样<span>,每个站点有自己的特色,但也有其一般的共性,单就"商品的变化,以便及时通知订户"这一点,是很多网上商店共有的模式,这一模式类似Observer patern.</span></p>
<p>具体的说<span>,如果网上商店中商品在名称 价格等方面有变化,如果系统能自动通知会员,将是网上商店区别传统商店的一大特色.这就需要在商品product中加入Observer这样角色,以便product细节发生变化时,Observer能自动观察到这种变化,并能进行及时的update或notify动作.</span></p>
<p><span></span></p>
<p><span>Java的API还为为我们提供现成的Observer接口Java.util.Observer.我们只要直接使用它就可以.</span></p>
<p>我们必须<span>extends Java.util.Observer才能真正使用它:<br>1.提供Add/Delete observer的方法;<br>2.提供通知(notisfy) 所有observer的方法;</span></p>
<table cellSpacing=3 cellPadding=0 width="80%" bgColor=#cccccc border=0>
    <tbody>
        <tr>
            <td>
            <p><span>import java.util.Observable;</span></p>
            <p><span>public class product extends Observable {</span></p>
            <p><span>&nbsp;private String name;</span></p>
            <p><span>&nbsp;private float price;<br>&nbsp;public product(){<br>&nbsp;}</span></p>
            <p><span>&nbsp;public String getName() {<br>&nbsp;&nbsp;return name;<br>&nbsp;}</span></p>
            <p><span>&nbsp;public void setName(String name) {<br>&nbsp;&nbsp;this.name = name;<br>&nbsp;&nbsp;//设置变化点 <br>&nbsp;&nbsp;setChanged();<br>&nbsp;&nbsp;notifyObservers(name);</span></p>
            <p><span>&nbsp;}</span></p>
            <p><span>&nbsp;public float getPrice() {<br>&nbsp;&nbsp;return price;<br>&nbsp;}</span></p>
            <p><span>&nbsp;public void setPrice(float price) {<br>&nbsp;&nbsp;this.price = price;<br>&nbsp;&nbsp;//设置变化点<br>&nbsp;&nbsp;setChanged();<br>&nbsp;&nbsp;notifyObservers(new Float(price));</span></p>
            <p><span>&nbsp;}</span></p>
            <p><span>&nbsp;//以下可以是数据库更新 插入命令.<br>&nbsp;public void saveToDb() {<br>&nbsp;&nbsp;//&nbsp; .....................</span></p>
            <p><span>&nbsp;}</span></p>
            <p><span>&nbsp;public static void main(String[] args) {<br>&nbsp;&nbsp;product p=new product();<br>&nbsp;&nbsp;p.addObserver(new NameObserver());<br>&nbsp;&nbsp;p.addObserver(new PriceObserver());<br>&nbsp;&nbsp;p.setPrice(100);<br>&nbsp; p.setName("name");<br>&nbsp;}<br>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span><br>我们注意到,在product类中 的setXXX方法中,我们设置了 notify(通知)方法, 当调用setXXX,实际上就触发了notisfyObservers方法,这将通知相应观察者应该采取行动了.</span></p>
<p>下面看看这些观察者的代码<span>,他们究竟采取了什么行动:</span></p>
<table cellSpacing=3 cellPadding=0 width="99%" border=0>
    <tbody>
        <tr>
            <td>
            <p><span>//观察者NameObserver主要用来对产品名称(name)进行观察的<br>public class NameObserver implements Observer{</span></p>
            <p>　　<span>private String name=null;</span></p>
            <p>　　<span>public void update(Observable obj,Object arg){<br><br>　　　　if (arg <a href="http://www-900.ibm.com/developerWorks/java/l-leditor/index.shtml" target=_blank>instanceof</a> String){</span></p>
            <p>　　　　<span> name=(String)arg;<br>　　　　 //产品名称改变值在name中<br>　　　　 System.out.println("NameObserver :name changet to "+name);</span></p>
            <p>　　　　<span>}</span></p>
            <p>　　<span>}</span></p>
            <p><span>}</span></p>
            <p><span>//观察者PriceObserver主要用来对产品价格(price)进行观察的<br>public class PriceObserver implements Observer{</span></p>
            <p>　　<span>private float price=0;</span></p>
            <p>　　<span>public void update(Observable obj,Object arg){<br><br>　　　　if (arg instanceof Float){</span></p>
            <p>　　　　<span> price=((Float)arg).floatValue();<br>　　<br>　　　　 System.out.println("PriceObserver :price changet to "+price);</span></p>
            <p>　　　　<span>}</span></p>
            <p>　　<span>}</span></p>
            <p><span>}</span></p>
            </td>
        </tr>
    </tbody>
</table>
输出结果如下：<br>PriceObserver :price changet to 100.0<br>NameObserver :name changet to name<br>
<img src ="http://www.blogjava.net/Sprite-bei/aggbug/110976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Sprite-bei/" target="_blank">zht</a> 2007-04-16 15:34 <a href="http://www.blogjava.net/Sprite-bei/archive/2007/04/16/110976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java语言编码规范(Java Code Conventions)</title><link>http://www.blogjava.net/Sprite-bei/archive/2007/04/16/110878.html</link><dc:creator>zht</dc:creator><author>zht</author><pubDate>Mon, 16 Apr 2007 01:04:00 GMT</pubDate><guid>http://www.blogjava.net/Sprite-bei/archive/2007/04/16/110878.html</guid><wfw:comment>http://www.blogjava.net/Sprite-bei/comments/110878.html</wfw:comment><comments>http://www.blogjava.net/Sprite-bei/archive/2007/04/16/110878.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Sprite-bei/comments/commentRss/110878.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Sprite-bei/services/trackbacks/110878.html</trackback:ping><description><![CDATA[<p class=title><a name=1>1 介绍(Introduction)</p>
<p class=title><a name=11>1.1 为什么要有编码规范(Why Have Code Conventions)</p>
<p>编码规范对于程序员而言尤为重要，有以下几个原因：</p>
<p>- 一个软件的生命周期中，80%的花费在于维护<br>- 几乎没有任何一个软件，在其整个生命周期中，均由最初的开发人员来维护<br>- 编码规范可以改善软件的可读性，可以让程序员尽快而彻底地理解新的代码<br>- 如果你将源码作为产品发布，就需要确任它是否被很好的打包并且清晰无误，一如你已构建的其它任何产品 </p>
<p>为了执行规范，每个软件开发人员必须一致遵守编码规范。每个人。</p>
<p class=title><a name=12>1.2 版权声明(Acknowledgments)</p>
<p>本文档反映的是Sun MicroSystems公司，Java语言规范中的编码标准部分。主要贡献者包括：Peter King，Patrick Naughton，Mike DeMoney，Jonni Kanerva，Kathy Walrath以及Scott Hommel。</p>
<p>本文档现由Scott Hommel维护，有关评论意见请发至shommel@eng.sun.com</p>
<p class=title><a name=2>2 文件名(File Names)</p>
<p>这部分列出了常用的文件名及其后缀。</p>
<p class=title><a name=21>2.1 文件后缀(File Suffixes)</p>
<p>Java程序使用下列文件后缀：</p>
<p>
<table class=text border=1>
    <tbody>
        <tr>
            <td>文件类别</td>
            <td>文件后缀</td>
        </tr>
        <tr>
            <td>Java源文件</td>
            <td>.java</td>
        </tr>
        <tr>
            <td>Java字节码文件</td>
            <td>.class</td>
        </tr>
    </tbody>
</table>
</p>
<p class=title><a name=22>2.2 常用文件名(Common File Names)</p>
<p>常用的文件名包括：</p>
<p>
<table class=text border=1>
    <tbody>
        <tr>
            <td>文件名</td>
            <td>用途</td>
        </tr>
        <tr>
            <td>GNUmakefile</td>
            <td>makefiles的首选文件名。我们采用gnumake来创建（build）软件。</td>
        </tr>
        <tr>
            <td>README</td>
            <td>概述特定目录下所含内容的文件的首选文件名</td>
        </tr>
    </tbody>
</table>
</p>
<p class=title><a name=3>3 文件组织(File Organization)</p>
<p>一个文件由被空行分割而成的段落以及标识每个段落的可选注释共同组成。超过2000行的程序难以阅读，应该尽量避免。"Java源文件范例"提供了一个布局合理的Java程序范例。</p>
<p class=title></a>3.1 Java源文件(Java Source Files)</p>
<p>每个Java源文件都包含一个单一的公共类或接口。若私有类和接口与一个公共类相关联，可以将它们和公共类放入同一个源文件。公共类必须是这个文件中的第一个类或接口。</p>
<p>Java源文件还遵循以下规则：</p>
<p>- 开头注释（参见"<u><font color=#800080>开头注释</font></u>"）<br>- 包和引入语句（参见"<u><font color=#800080>包和引入语句</font></u>"）<br>- 类和接口声明（参见"<u><font color=#800080>类和接口声明</font></u>"） </p>
<p class=title><a name=311>3.1.1 开头注释(Beginning Comments)</p>
<p>所有的源文件都应该在开头有一个C语言风格的注释，其中列出类名、版本信息、日期和版权声明：</p>
<p>
<pre>  /*
* Classname
*
* Version information
*
* Date
*
* Copyright notice
*/
</pre>
<p>&#160;</p>
<p class=title><a name=312>3.1.2 包和引入语句(Package and Import Statements)</p>
<p>在多数Java源文件中，第一个非注释行是包语句。在它之后可以跟引入语句。例如：</p>
<p>
<pre>  package java.awt;
import java.awt.peer.CanvasPeer;
</pre>
<p>&#160;</p>
<p class=title><a name=313>3.1.3 类和接口声明(Class and Interface Declarations)</p>
<p>下表描述了类和接口声明的各个部分以及它们出现的先后次序。参见"<a href="http://morningspace.51.net/resource/javacodeconv.html#b1"><u><font color=#800080>Java源文件范例</font></u></a>"中一个包含注释的例子。</p>
<p>
<table class=text border=1>
    <tbody>
        <tr>
            <td>&nbsp;</td>
            <td>类/接口声明的各部分</td>
            <td>注解</td>
        </tr>
        <tr>
            <td>1</td>
            <td>类/接口文档注释(/**&#8230;&#8230;*/)</td>
            <td>该注释中所需包含的信息，参见"<a href="http://morningspace.51.net/resource/javacodeconv.html#52"><u><font color=#800080>文档注释</font></u></a>"</td>
        </tr>
        <tr>
            <td>2</td>
            <td>类或接口的声明</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>3</td>
            <td>类/接口实现的注释(/*&#8230;&#8230;*/)如果有必要的话</td>
            <td>该注释应包含任何有关整个类或接口的信息，而这些信息又不适合作为类/接口文档注释。</td>
        </tr>
        <tr>
            <td>4</td>
            <td>类的(静态)变量</td>
            <td>首先是类的公共变量，随后是保护变量，再后是包一级别的变量(没有访问修饰符，access modifier)，最后是私有变量。</td>
        </tr>
        <tr>
            <td>5</td>
            <td>实例变量</td>
            <td>首先是公共级别的，随后是保护级别的，再后是包一级别的(没有访问修饰符)，最后是私有级别的。</td>
        </tr>
        <tr>
            <td>6</td>
            <td>构造器</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>7</td>
            <td>方法</td>
            <td>这些方法应该按功能，而非作用域或访问权限，分组。例如，一个私有的类方法可以置于两个公有的实例方法之间。其目的是为了更便于阅读和理解代码。</td>
        </tr>
    </tbody>
</table>
</p>
<p class=title><a name=4>4 缩进排版(Indentation)</p>
<p>4个空格常被作为缩进排版的一个单位。缩进的确切解释并未详细指定(空格 vs. 制表符)。一个制表符等于8个空格(而非4个)。</p>
<p class=title><a name=41>4.1 行长度(Line Length)</p>
<p>尽量避免一行的长度超过80个字符，因为很多终端和工具不能很好处理之。</p>
<p>注意：用于文档中的例子应该使用更短的行长，长度一般不超过70个字符。</p>
<p class=title><a name=42>4.2 换行(Wrapping Lines)</p>
<p>当一个表达式无法容纳在一行内时，可以依据如下一般规则断开之：</p>
<p>- 在一个逗号后面断开<br>- 在一个操作符前面断开<br>- 宁可选择较高级别(higher-level)的断开，而非较低级别(lower-level)的断开<br>- 新的一行应该与上一行同一级别表达式的开头处对齐<br>- 如果以上规则导致你的代码混乱或者使你的代码都堆挤在右边，那就代之以缩进8个空格。 </p>
<p>以下是断开方法调用的一些例子：</p>
<p>
<pre>  someMethod(longExpression1, longExpression2, longExpression3,
longExpression4, longExpression5);
var = someMethod1(longExpression1,
someMethod2(longExpression2,
longExpression3));
</pre>
<p>&#160;</p>
<p>以下是两个断开算术表达式的例子。前者更好，因为断开处位于括号表达式的外边，这是个较高级别的断开。</p>
<p>
<pre>  longName1 = longName2 * (longName3 + longName4 - longName5)
+ 4 * longname6; //PREFFER
longName1 = longName2 * (longName3 + longName4
- longName5) + 4 * longname6; //AVOID
</pre>
<p>&#160;</p>
<p>以下是两个缩进方法声明的例子。前者是常规情形。后者若使用常规的缩进方式将会使第二行和第三行移得很靠右，所以代之以缩进8个空格</p>
<p>
<pre>  //CONVENTIONAL INDENTATION
someMethod(int anArg, Object anotherArg, String yetAnotherArg,
Object andStillAnother) {
...
}
//INDENT 8 SPACES TO AVOID VERY DEEP INDENTS
private static synchronized horkingLongMethodName(int anArg,
Object anotherArg, String yetAnotherArg,
Object andStillAnother) {
...
}
</pre>
<p>&#160;</p>
<p>if语句的换行通常使用8个空格的规则，因为常规缩进(4个空格)会使语句体看起来比较费劲。比如：</p>
<p>
<pre>  //DON&#8217;T USE THIS INDENTATION
if ((condition1 &amp;&amp; condition2)
|| (condition3 &amp;&amp; condition4)
||!(condition5 &amp;&amp; condition6)) { //BAD WRAPS
doSomethingAboutIt();             //MAKE THIS LINE EASY TO MISS
}
//USE THIS INDENTATION INSTEAD
if ((condition1 &amp;&amp; condition2)
|| (condition3 &amp;&amp; condition4)
||!(condition5 &amp;&amp; condition6)) {
doSomethingAboutIt();
}
//OR USE THIS
if ((condition1 &amp;&amp; condition2) || (condition3 &amp;&amp; condition4)
||!(condition5 &amp;&amp; condition6)) {
doSomethingAboutIt();
}
</pre>
<p>&#160;</p>
<p>这里有三种可行的方法用于处理三元运算表达式：</p>
<p>
<pre>  alpha = (aLongBooleanExpression) ? beta : gamma;
alpha = (aLongBooleanExpression) ? beta
: gamma;
alpha = (aLongBooleanExpression)
? beta
: gamma;
</pre>
<p>&#160;</p>
<p class=title><a name=5>5 注释(Comments)</p>
<p>Java程序有两类注释：实现注释(implementation comments)和文档注释(document comments)。实现注释是那些在C++中见过的，使用/*...*/和//界定的注释。文档注释(被称为"doc comments")是Java独有的，并由/**...*/界定。文档注释可以通过javadoc工具转换成HTML文件。</p>
<p>实现注释用以注释代码或者实现细节。文档注释从实现自由(implementation-free)的角度描述代码的规范。它可以被那些手头没有源码的开发人员读懂。</p>
<p>注释应被用来给出代码的总括，并提供代码自身没有提供的附加信息。注释应该仅包含与阅读和理解程序有关的信息。例如，相应的包如何被建立或位于哪个目录下之类的信息不应包括在注释中。</p>
<p>在注释里，对设计决策中重要的或者不是显而易见的地方进行说明是可以的，但应避免提供代码中己清晰表达出来的重复信息。多余的的注释很容易过时。通常应避免那些代码更新就可能过时的注释。</p>
<p>注意：频繁的注释有时反映出代码的低质量。当你觉得被迫要加注释的时候，考虑一下重写代码使其更清晰。</p>
<p>注释不应写在用星号或其他字符画出来的大框里。注释不应包括诸如制表符和回退符之类的特殊字符。</p>
<p class=title><a name=51>5.1 实现注释的格式(Implementation Comment Formats)</p>
<p>程序可以有4种实现注释的风格：块(block)、单行(single-line)、尾端(trailing)和行末(end-of-line)。</p>
<p class=title><a name=511>5.1.1 块注释(Block Comments)</p>
<p>块注释通常用于提供对文件，方法，数据结构和算法的描述。块注释被置于每个文件的开始处以及每个方法之前。它们也可以被用于其他地方，比如方法内部。在功能和方法内部的块注释应该和它们所描述的代码具有一样的缩进格式。</p>
<p>块注释之首应该有一个空行，用于把块注释和代码分割开来，比如：</p>
<p>
<pre>  /*
* Here is a block comment.
*/
</pre>
<p>&#160;</p>
<p>块注释可以以/*-开头，这样indent(1)就可以将之识别为一个代码块的开始，而不会重排它。</p>
<p>
<pre>  /*-
* Here is a block comment with some very special
* formatting that I want indent(1) to ignore.
*
*    one
*        two
*            three
*/
</pre>
<p>&#160;</p>
<p>注意：如果你不使用indent(1)，就不必在代码中使用/*-，或为他人可能对你的代码运行indent(1)作让步。</p>
<p>参见"<a href="http://morningspace.51.net/resource/javacodeconv.html#52"><u><font color=#800080>文档注释</font></u></a>"</p>
<p class=title><a name=512>5.1.2 单行注释(Single-Line Comments)</p>
<p>短注释可以显示在一行内，并与其后的代码具有一样的缩进层级。如果一个注释不能在一行内写完，就该采用块注释(参见"<a href="http://morningspace.51.net/resource/javacodeconv.html#511"><u><font color=#800080>块注释</font></u></a>")。单行注释之前应该有一个空行。以下是一个Java代码中单行注释的例子：</p>
<p>
<pre>  if (condition) {
/* Handle the condition. */
...
}
</pre>
<p>&#160;</p>
<p class=title><a name=513>5.1.3 尾端注释(Trailing Comments)</p>
<p>极短的注释可以与它们所要描述的代码位于同一行，但是应该有足够的空白来分开代码和注释。若有多个短注释出现于大段代码中，它们应该具有相同的缩进。</p>
<p>以下是一个Java代码中尾端注释的例子：</p>
<p>
<pre>  if (a == 2) {
return TRUE;              /* special case */
} else {
return isPrime(a);         /* works only for odd a */
}
</pre>
<p>&#160;</p>
<p class=title><a name=514>5.1.4 行末注释(End-Of-Line Comments)</p>
<p>注释界定符"//"，可以注释掉整行或者一行中的一部分。它一般不用于连续多行的注释文本；然而，它可以用来注释掉连续多行的代码段。以下是所有三种风格的例子：</p>
<p>
<pre>  if (foo &gt; 1) {
// Do a double-flip.
...
}
else {
return false;          // Explain why here.
}
//if (bar &gt; 1) {
//
//    // Do a triple-flip.
//    ...
//}
//else {
//    return false;
//}
</pre>
<p>&#160;</p>
<p class=title><a name=52>5.2 文档注释(Documentation Comments)</p>
<p>注意：此处描述的注释格式之范例，参见"<a href="http://morningspace.51.net/resource/javacodeconv.html#b1"><u><font color=#800080>Java源文件范例</font></u></a>"</p>
<p>若想了解更多，参见"How to Write Doc Comments for Javadoc"，其中包含了有关文档注释标记的信息(@return, @param, @see)：</p>
<p><a href="http://java.sun.com/javadoc/writingdoccomments/index.html"><u><font color=#0000ff>http://java.sun.com/javadoc/writingdoccomments/index.html</font></u></a></p>
<p>若想了解更多有关文档注释和javadoc的详细资料，参见javadoc的主页：</p>
<p><a href="http://java.sun.com/javadoc/index.html"><u><font color=#0000ff>http://java.sun.com/javadoc/index.html</font></u></a></p>
<p>文档注释描述Java的类、接口、构造器，方法，以及字段(field)。每个文档注释都会被置于注释定界符/**...*/之中，一个注释对应一个类、接口或成员。该注释应位于声明之前：</p>
<p>
<pre>  /**
* The Example class provides ...
*/
public class Example { ...
</pre>
<p>&#160;</p>
<p>注意顶层(top-level)的类和接口是不缩进的，而其成员是缩进的。描述类和接口的文档注释的第一行(/**)不需缩进；随后的文档注释每行都缩进1格(使星号纵向对齐)。成员，包括构造函数在内，其文档注释的第一行缩进4格，随后每行都缩进5格。</p>
<p>若你想给出有关类、接口、变量或方法的信息，而这些信息又不适合写在文档中，则可使用实现块注释(见5.1.1)或紧跟在声明后面的单行注释(见5.1.2)。例如，有关一个类实现的细节，应放入紧跟在类声明后面的实现块注释中，而不是放在文档注释中。</p>
<p>文档注释不能放在一个方法或构造器的定义块中，因为Java会将位于文档注释之后的第一个声明与其相关联。</p>
<p class=title><a name=6>6 声明(Declarations)</p>
<p class=title><a name=61>6.1 每行声明变量的数量(Number Per Line)</p>
<p>推荐一行一个声明，因为这样以利于写注释。亦即，</p>
<p>
<pre>  int level;  // indentation level
int size;   // size of table
</pre>
<p>&#160;</p>
<p>要优于，</p>
<p>int level, size; </p>
<p>不要将不同类型变量的声明放在同一行，例如：</p>
<p>
<pre>  int foo,  fooarray[];   //WRONG!
</pre>
<p>&#160;</p>
<p>注意：上面的例子中，在类型和标识符之间放了一个空格，另一种被允许的替代方式是使用制表符：</p>
<p>
<pre>  int		level;         // indentation level
int		size;          // size of table
Object	currentEntry;  // currently selected table entry
</pre>
<p>&#160;</p>
<p class=title><a name=62>6.2 初始化(Initialization)</p>
<p>尽量在声明局部变量的同时初始化。唯一不这么做的理由是变量的初始值依赖于某些先前发生的计算。</p>
<p class=title><a name=63>6.3 布局(Placement)</p>
<p>只在代码块的开始处声明变量。（一个块是指任何被包含在大括号"{"和"}"中间的代码。）不要在首次用到该变量时才声明之。这会把注意力不集中的程序员搞糊涂，同时会妨碍代码在该作用域内的可移植性。</p>
<p>
<pre>  void myMethod() {
int int1 = 0;         // beginning of method block
if (condition) {
int int2 = 0;     // beginning of "if" block
...
}
}
</pre>
<p>&#160;</p>
<p>该规则的一个例外是for循环的索引变量</p>
<p>
<pre>  for (int i = 0; i &lt; maxLoops; i++) { ... }
</pre>
<p>&#160;</p>
<p>避免声明的局部变量覆盖上一级声明的变量。例如，不要在内部代码块中声明相同的变量名：</p>
<p>
<pre>  int count;
...
myMethod() {
if (condition) {
int count = 0;     // AVOID!
...
}
...
}
</pre>
<p>&#160;</p>
<p class=title><a name=64>6.4 类和接口的声明(Class and Interface Declarations)</p>
<p>当编写类和接口是，应该遵守以下格式规则：</p>
<p>- 在方法名与其参数列表之前的左括号"("间不要有空格<br>- 左大括号"{"位于声明语句同行的末尾<br>- 右大括号"}"另起一行，与相应的声明语句对齐，除非是一个空语句，"}"应紧跟在"{"之后
<pre>  class Sample extends Object {
int ivar1;
int ivar2;
Sample(int i, int j) {
ivar1 = i;
ivar2 = j;
}
int emptyMethod() {}
...
}
</pre>
- 方法与方法之间以空行分隔
<p>&#160;</p>
<p class=title><a name=7>7 语句(Statements)</p>
<p class=title><a name=71>7.1 简单语句(Simple Statements)</p>
<p>每行至多包含一条语句，例如：</p>
<p>
<pre>  argv++;       // Correct
argc--;       // Correct
argv++; argc--;       // AVOID!
</pre>
<p>&#160;</p>
<p class=title><a name=72>7.2 复合语句(Compound Statements)</p>
<p>复合语句是包含在大括号中的语句序列，形如"{ 语句 }"。例如下面各段。</p>
<p>- 被括其中的语句应该较之复合语句缩进一个层次<br>- 左大括号"{"应位于复合语句起始行的行尾；右大括号"}"应另起一行并与复合语句首行对齐。<br>- 大括号可以被用于所有语句，包括单个语句，只要这些语句是诸如if-else或for控制结构的一部分。这样便于添加语句而无需担心由于忘了加括号而引入bug。 </p>
<p class=title><a name=73>7.3 返回语句(return Statements)</p>
<p>一个带返回值的return语句不使用小括号"()"，除非它们以某种方式使返回值更为显见。例如：</p>
<p>
<pre>  return;
return myDisk.size();
return (size ? size : defaultSize);
</pre>
<p>&#160;</p>
<p class=title><a name=74>7.4 if，if-else，if else-if else语句(if, if-else, if else-if else Statements)</p>
<p>if-else语句应该具有如下格式：</p>
<p>
<pre>  if (condition) {
statements;
}
if (condition) {
statements;
} else {
statements;
}
if (condition) {
statements;
} else if (condition) {
statements;
} else{
statements;
}
</pre>
<p>&#160;</p>
<p>注意：if语句总是用"{"和"}"括起来，避免使用如下容易引起错误的格式：</p>
<p>
<pre>  if (condition) //AVOID! THIS OMITS THE BRACES {}!
statement;
</pre>
<p>&#160;</p>
<p class=title><a name=75>7.5 for语句(for Statements)</p>
<p>一个for语句应该具有如下格式：</p>
<p>
<pre>  for (initialization; condition; update) {
statements;
}
</pre>
<p>&#160;</p>
<p>一个空的for语句(所有工作都在初始化，条件判断，更新子句中完成）应该具有如下格式：</p>
<p>
<pre>  for (initialization; condition; update);
</pre>
<p>&#160;</p>
<p>当在for语句的初始化或更新子句中使用逗号时，避免因使用三个以上变量，而导致复杂度提高。若需要，可以在for循环之前(为初始化子句)或for循环末尾(为更新子句)使用单独的语句。</p>
<p class=title><a name=76>7.6 while语句(while Statements)</p>
<p>一个while语句应该具有如下格式</p>
<p>
<pre>  while (condition) {
statements;
}
</pre>
<p>&#160;</p>
<p>一个空的while语句应该具有如下格式：</p>
<p>
<pre>  while (condition);
</pre>
<p>&#160;</p>
<p class=title><a name=77>7.7 do-while语句(do-while Statements)</p>
<p>一个do-while语句应该具有如下格式：</p>
<p>
<pre>  do {
statements;
} while (condition);
</pre>
<p>&#160;</p>
<p class=title><a name=78>7.8 switch语句(switch Statements)</p>
<p>一个switch语句应该具有如下格式：</p>
<p>
<pre>  switch (condition) {
case ABC:
statements;
/* falls through */
case DEF:
statements;
break;
case XYZ:
statements;
break;
default:
statements;
break;
}
</pre>
<p>&#160;</p>
<p>每当一个case顺着往下执行时(因为没有break语句)，通常应在break语句的位置添加注释。上面的示例代码中就包含注释/* falls through */。</p>
<p class=title><a name=79>7.9 try-catch语句(try-catch Statements)</p>
<p>一个try-catch语句应该具有如下格式：</p>
<p>
<pre>  try {
statements;
} catch (ExceptionClass e) {
statements;
}
</pre>
<p>&#160;</p>
<p>一个try-catch语句后面也可能跟着一个finally语句，不论try代码块是否顺利执行完，它都会被执行。</p>
<p>
<pre>  try {
statements;
} catch (ExceptionClass e) {
statements;
} finally {
statements;
}
</pre>
<p>&#160;</p>
<p class=title><a name=8>8 空白(White Space)</p>
<p class=title><a name=81>8.1 空行(Blank Lines)</p>
<p>空行将逻辑相关的代码段分隔开，以提高可读性。</p>
<p>下列情况应该总是使用两个空行：</p>
<p>- 一个源文件的两个片段(section)之间<br>- 类声明和接口声明之间 </p>
<p>下列情况应该总是使用一个空行：</p>
<p>- 两个方法之间<br>- 方法内的局部变量和方法的第一条语句之间<br>- 块注释（参见"<a href="http://morningspace.51.net/resource/javacodeconv.html#511"><u><font color=#800080>5.1.1</font></u></a>"）或单行注释（参见"<a href="http://morningspace.51.net/resource/javacodeconv.html#512"><u><font color=#800080>5.1.2</font></u></a>"）之前<br>- 一个方法内的两个逻辑段之间，用以提高可读性 </p>
<p class=title><a name=82>8.2 空格(Blank Spaces)</p>
<p>下列情况应该使用空格：</p>
<p>- 一个紧跟着括号的关键字应该被空格分开，例如：<br>
<pre>  while (true) {
...
}
</pre>
注意：空格不应该置于方法名与其左括号之间。这将有助于区分关键字和方法调用。<br>- 空白应该位于参数列表中逗号的后面<br>- 所有的二元运算符，除了"."，应该使用空格将之与操作数分开。一元操作符和操作数之间不因该加空格，比如：负号("-")、自增("++")和自减("--")。例如：
<pre>    a += c + d;
a = (a + b) / (c * d);
while (d++ = s++) {
n++;
}
printSize("size is " + foo + "\n");
</pre>
- for语句中的表达式应该被空格分开，例如：
<pre>    for (expr1; expr2; expr3)
</pre>
- 强制转型后应该跟一个空格，例如：
<pre>    myMethod((byte) aNum, (Object) x);
myMethod((int) (cp + 5), ((int) (i + 3)) + 1);
</pre>
<p>&#160;</p>
<p class=title><a name=9>9 命名规范(Naming Conventions)</p>
<p>命名规范使程序更易读，从而更易于理解。它们也可以提供一些有关标识符功能的信息，以助于理解代码，例如，不论它是一个常量，包，还是类。</p>
<p>
<table class=text border=1>
    <tbody>
        <tr>
            <td>标识符类型</td>
            <td>命名规则</td>
            <td>例子</td>
        </tr>
        <tr>
            <td>包(Packages)</td>
            <td>一个唯一包名的前缀总是全部小写的ASCII字母并且是一个顶级域名，通常是com，edu，gov，mil，net，org，或1981年ISO 3166标准所指定的标识国家的英文双字符代码。包名的后续部分根据不同机构各自内部的命名规范而不尽相同。这类命名规范可能以特定目录名的组成来区分部门(department)，项目(project)，机器(machine)，或注册名(login names)。</td>
            <td>com.sun.eng<br>com.apple.quicktime.v2<br>edu.cmu.cs.bovik.cheese</td>
        </tr>
        <tr>
            <td>类(Classes)</td>
            <td>命名规则：类名是个一名词，采用大小写混合的方式，每个单词的首字母大写。尽量使你的类名简洁而富于描述。使用完整单词，避免缩写词(除非该缩写词被更广泛使用，像URL，HTML)</td>
            <td>class Raster;<br>class ImageSprite;</td>
        </tr>
        <tr>
            <td>接口(Interfaces)</td>
            <td>命名规则：大小写规则与类名相似</td>
            <td>interface RasterDelegate;<br>interface Storing;</td>
        </tr>
        <tr>
            <td>方法(Methods)</td>
            <td>方法名是一个动词，采用大小写混合的方式，第一个单词的首字母小写，其后单词的首字母大写。</td>
            <td>run();<br>runFast();<br>getBackground();</td>
        </tr>
        <tr>
            <td>变量(Variables)</td>
            <td>除了变量名外，所有实例，包括类，类常量，均采用大小写混合的方式，第一个单词的首字母小写，其后单词的首字母大写。变量名不应以下划线或美元符号开头，尽管这在语法上是允许的。<br>变量名应简短且富于描述。变量名的选用应该易于记忆，即，能够指出其用途。尽量避免单个字符的变量名，除非是一次性的临时变量。临时变量通常被取名为i，j，k，m和n，它们一般用于整型；c，d，e，它们一般用于字符型。</td>
            <td>char c;<br>int i;<br>float myWidth;</td>
        </tr>
        <tr>
            <td>实例变量(Instance Variables)</td>
            <td>大小写规则和变量名相似，除了前面需要一个下划线</td>
            <td>int _employeeId;<br>String _name;<br>Customer _customer;</td>
        </tr>
        <tr>
            <td>常量(Constants)</td>
            <td>类常量和ANSI常量的声明，应该全部大写，单词间用下划线隔开。(尽量避免ANSI常量，容易引起错误)</td>
            <td>static final int MIN_WIDTH = 4;<br>static final int MAX_WIDTH = 999;<br>static final int GET_THE_CPU = 1;</td>
        </tr>
    </tbody>
</table>
</p>
<p class=title><a name=a>10 编程惯例(Programming Practices)</p>
<p class=title><a name=a1>10.1 提供对实例以及类变量的访问控制(Providing Access to Instance and Class Variables)</p>
<p>若没有足够理由，不要把实例或类变量声明为公有。通常，实例变量无需显式的设置(set)和获取(gotten)，通常这作为方法调用的边缘效应 (side effect)而产生。</p>
<p>一个具有公有实例变量的恰当例子，是类仅作为数据结构，没有行为。亦即，若你要使用一个结构(struct)而非一个类(如果java支持结构的话)，那么把类的实例变量声明为公有是合适的。</p>
<p class=title><a name=a2>10.2 引用类变量和类方法(Referring to Class Variables and Methods)</p>
<p>避免用一个对象访问一个类的静态变量和方法。应该用类名替代。例如：</p>
<p>
<pre>  classMethod();             //OK
AClass.classMethod();      //OK
anObject.classMethod();    //AVOID!
</pre>
<p>&#160;</p>
<p class=title><a name=a3>10.3 常量(Constants)</p>
<p>位于for循环中作为计数器值的数字常量，除了-1,0和1之外，不应被直接写入代码。</p>
<p class=title><a name=a4>10.4 变量赋值(Variable Assignments)</p>
<p>避免在一个语句中给多个变量赋相同的值。它很难读懂。例如：</p>
<p>
<pre>  fooBar.fChar = barFoo.lchar = 'c'; // AVOID!
</pre>
<p>&#160;</p>
<p>不要将赋值运算符用在容易与相等关系运算符混淆的地方。例如：</p>
<p>
<pre>  if (c++ = d++) {        // AVOID! (Java disallows)
...
}
</pre>
<p>&#160;</p>
<p>应该写成</p>
<p>
<pre>  if ((c++ = d++) != 0) {
...
}
</pre>
<p>&#160;</p>
<p>不要使用内嵌(embedded)赋值运算符试图提高运行时的效率，这是编译器的工作。例如：</p>
<p>
<pre>  d = (a = b + c) + r;        // AVOID!
</pre>
<p>&#160;</p>
<p>应该写成</p>
<p>
<pre>  a = b + c;
d = a + r;
</pre>
<p>&#160;</p>
<p class=title><a name=a5>10.5 其它惯例(Miscellaneous Practices)</p>
<p class=title><a name=a51>10.5.1 圆括号(Parentheses)</p>
<p>一般而言，在含有多种运算符的表达式中使用圆括号来避免运算符优先级问题，是个好方法。即使运算符的优先级对你而言可能很清楚，但对其他人未必如此。你不能假设别的程序员和你一样清楚运算符的优先级。</p>
<p>
<pre>  if (a == b &amp;&amp; c == d)     // AVOID!
if ((a == b) &amp;&amp; (c == d))  // RIGHT
</pre>
<p>&#160;</p>
<p class=title><a name=a52>10.5.2 返回值(Returning Values)</p>
<p>设法让你的程序结构符合目的。例如：</p>
<p>
<pre>  if (booleanExpression) {
return true;
} else {
return false;
}
</pre>
<p>&#160;</p>
<p>应该代之以如下方法：</p>
<p>
<pre>  return booleanExpression;
</pre>
<p>&#160;</p>
<p>类似地：</p>
<p>
<pre>  if (condition) {
return x;
}
return y;
</pre>
<p>&#160;</p>
<p>应该写做：</p>
<p>
<pre>  return (condition ? x : y);
</pre>
<p>&#160;</p>
<p class=title><a name=a53>10.5.3 条件运算符"?"前的表达式(Expressions before '?' in the Conditional Operator)</p>
<p>如果一个包含二元运算符的表达式出现在三元运算符" ? : "的"?"之前，那么应该给表达式添上一对圆括号。例如：</p>
<p>
<pre>  (x &gt;= 0) ? x : -x;
</pre>
<p>&#160;</p>
<p class=title><a name=a54>10.5.4 特殊注释(Special Comments)</p>
<p>在注释中使用XXX来标识某些未实现(bogus)的但可以工作(works)的内容。用FIXME来标识某些假的和错误的内容。</p>
<p class=title><a name=b>11 代码范例(Code Examples)</p>
<p class=title><a name=b1>11.1 Java源文件范例(Java Source File Example)</p>
<p>下面的例子，展示了如何合理布局一个包含单一公共类的Java源程序。接口的布局与其相似。更多信息参见"<a href="http://morningspace.51.net/resource/javacodeconv.html#313"><u><font color=#800080>类和接口声明</font></u></a>"以及"<a href="http://morningspace.51.net/resource/javacodeconv.html#52"><u><font color=#800080>文挡注释</font></u></a>"。</p>
<p>
<pre>/*
* @(#)Blah.java        1.82 99/03/18
*
* Copyright (c) 1994-1999 Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
* All rights reserved.
*
* This software is the confidential and proprietary information of Sun
* Microsystems, Inc. ("Confidential Information").  You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with Sun.
*/
package java.blah;
import java.blah.blahdy.BlahBlah;
/**
* Class description goes here.
*
* @version 	1.82 18 Mar 1999
* @author 	Firstname Lastname
*/
public class Blah extends SomeClass {
/* A class implementation comment can go here. */
/** classVar1 documentation comment */
public static int classVar1;
/**
* classVar2 documentation comment that happens to be
* more than one line long
*/
private static Object classVar2;
/** instanceVar1 documentation comment */
public Object instanceVar1;
/** instanceVar2 documentation comment */
protected int instanceVar2;
/** instanceVar3 documentation comment */
private Object[] instanceVar3;
/**
* ...constructor Blah documentation comment...
*/
public Blah() {
// ...implementation goes here...
}
/**
* ...method doSomething documentation comment...
*/
public void doSomething() {
// ...implementation goes here...
}
/**
* ...method doSomethingElse documentation comment...
* @param someParam description
*/
public void doSomethingElse(Object someParam) {
// ...implementation goes here...
}
}
</pre>
<img src ="http://www.blogjava.net/Sprite-bei/aggbug/110878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Sprite-bei/" target="_blank">zht</a> 2007-04-16 09:04 <a href="http://www.blogjava.net/Sprite-bei/archive/2007/04/16/110878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自动设置环境变量 </title><link>http://www.blogjava.net/Sprite-bei/archive/2007/04/14/110595.html</link><dc:creator>zht</dc:creator><author>zht</author><pubDate>Sat, 14 Apr 2007 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/Sprite-bei/archive/2007/04/14/110595.html</guid><wfw:comment>http://www.blogjava.net/Sprite-bei/comments/110595.html</wfw:comment><comments>http://www.blogjava.net/Sprite-bei/archive/2007/04/14/110595.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Sprite-bei/comments/commentRss/110595.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Sprite-bei/services/trackbacks/110595.html</trackback:ping><description><![CDATA[<span>把代码拷贝，另存为javaEnv.bat。安装完Java 2 SDK之后，开一个命令行窗口,输入javaEnv java2SDKDir(java2SDKDir是你的java的安装目录，不带路径最后的\。如果安装路径中有空格，请用javaEnv "java2SDKDir"格式)并运行。(注：一定要在javaEnv后边加上你的sdk的目录)</span> <br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">@echo&nbsp;你提供的jdk安装目录为：</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>@echo&nbsp;off<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>IF&nbsp;EXIST&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">\bin\java.exe&nbsp;(<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;rem&nbsp;如输入正确的&nbsp;Java2SDK&nbsp;安装目录，开始设置环境变量<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@setx&nbsp;JAVA_HOME&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@setx&nbsp;path&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">JAVA_HOME</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">\bin;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">path</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@setx&nbsp;classpath&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">classpath</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">;.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@setx&nbsp;classpath&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">classpath</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">JAVA_HOME</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">\lib\tools.jar<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@setx&nbsp;classpath&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">classpath</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">JAVA_HOME</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">\lib\dt.jar<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@setx&nbsp;classpath&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">classpath</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">JAVA_HOME</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">\jre\lib\rt.jar<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@echo&nbsp;on<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@echo&nbsp;Java&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;SDK&nbsp;环境参数设置完毕，正常退出。<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>)&nbsp;&nbsp;ELSE&nbsp;(<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IF&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">&nbsp;(<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rem&nbsp;如没有提供安装目录，提示之后退出<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@echo&nbsp;on<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@echo&nbsp;没有提供&nbsp;Java2SDK&nbsp;的安装目录,不做任何设置，现在退出环境变量设置。<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;ELSE&nbsp;(<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rem&nbsp;如果提供非空的安装目录但没有bin\java.exe，则指定的目录为错误的目录<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@echo&nbsp;on<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@echo&nbsp;非法的&nbsp;Java2SDK&nbsp;的安装目录,不做任何设置，现在退出环境变量设置。<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
如果找不到setx的 可以从此处<a href="http://www.blogjava.net/Files/Sprite-bei/setx.rar"><span style="COLOR: #ff0000">下载<br></span></a>将这个文件解压缩后的exe文件和bat放在同一个文件夹下即可<br>
<img src ="http://www.blogjava.net/Sprite-bei/aggbug/110595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Sprite-bei/" target="_blank">zht</a> 2007-04-14 10:08 <a href="http://www.blogjava.net/Sprite-bei/archive/2007/04/14/110595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>杂</title><link>http://www.blogjava.net/Sprite-bei/archive/2007/04/11/109857.html</link><dc:creator>zht</dc:creator><author>zht</author><pubDate>Wed, 11 Apr 2007 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/Sprite-bei/archive/2007/04/11/109857.html</guid><wfw:comment>http://www.blogjava.net/Sprite-bei/comments/109857.html</wfw:comment><comments>http://www.blogjava.net/Sprite-bei/archive/2007/04/11/109857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Sprite-bei/comments/commentRss/109857.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Sprite-bei/services/trackbacks/109857.html</trackback:ping><description><![CDATA[<p><span style="COLOR: red">1、在程序中调用dos命令，并返回结果：</span><br>String command = "cmd.exe /c ver";<br>Process p = Runtime.getRuntime().exec(command);<br>BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));<br><span style="COLOR: red">2、初始窗口最大化&amp;最小化</span><br>frame.setVisible(true); <br>frame.setExtendedState(JFrame.MAXIMIZED_BOTH); <br>frame.setExtendedState(JFrame.ICONIFIED); <br><span style="COLOR: red">3、监听F11</span><br>static {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Toolkit toolkit = Toolkit.getDefaultToolkit();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; toolkit.addAWTEventListener(new AWTEventListener() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void eventDispatched(AWTEvent e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (((KeyEvent) e).getKeyCode() == KeyEvent.VK_F1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("F1");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (((KeyEvent) e).getKeyCode() == KeyEvent.VK_F2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("F2");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, AWTEvent.KEY_EVENT_MASK);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread thread = new Thread(new Runnable() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void run() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File music = new File(iSystemConstants.muiscfile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Player player = new Player(new FileInputStream(music));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; player.play();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (FileNotFoundException ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (JavaLayerException ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //thread.start();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JOptionPane.showMessageDialog(null, e.getMessage(), "ERROR",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JOptionPane.ERROR_MESSAGE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<img src ="http://www.blogjava.net/Sprite-bei/aggbug/109857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Sprite-bei/" target="_blank">zht</a> 2007-04-11 11:53 <a href="http://www.blogjava.net/Sprite-bei/archive/2007/04/11/109857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>四舍五入方法&amp;&amp;Text失去焦点触发事件</title><link>http://www.blogjava.net/Sprite-bei/archive/2007/04/09/109319.html</link><dc:creator>zht</dc:creator><author>zht</author><pubDate>Mon, 09 Apr 2007 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/Sprite-bei/archive/2007/04/09/109319.html</guid><wfw:comment>http://www.blogjava.net/Sprite-bei/comments/109319.html</wfw:comment><comments>http://www.blogjava.net/Sprite-bei/archive/2007/04/09/109319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Sprite-bei/comments/commentRss/109319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Sprite-bei/services/trackbacks/109319.html</trackback:ping><description><![CDATA[<p>&nbsp;/**<br>&nbsp; * <br>&nbsp; * @param value 要四舍五入的值<br>&nbsp; * @param scale 小数点后要取的位数<br>&nbsp; * @return<br>&nbsp; */<br>&nbsp;public static double round(double value,int scale){<br>&nbsp;BigDecimal bd=new BigDecimal(value);<br>&nbsp;BigDecimal divisor=new BigDecimal(1);<br>&nbsp;BigDecimal returnValue=bd.divide(divisor, scale,BigDecimal.ROUND_HALF_UP );<br>&nbsp;return returnValue.doubleValue();<br>&nbsp;} <br><br><br>txt.addFocusListener(new FocusAdapter() {<br>&nbsp;&nbsp;&nbsp;&nbsp;public void focusLost(FocusEvent e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (e.isTemporary()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkFullSize(txt, "人名", 20);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;});<br>public boolean checkFullSize(JTextComponent comp, String desc, int digit) {</p>
<p>&nbsp;&nbsp;if (checkHarf(comp.getText())) {<br>&nbsp;&nbsp;&nbsp;comp.requestFocus();<br>&nbsp;&nbsp;&nbsp;JOptionPane.showMessageDialog(null, "full size");<br>&nbsp;&nbsp;&nbsp;comp.requestFocus();<br>&nbsp;&nbsp;&nbsp;return false;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;if (comp.getText().length() &gt; digit) {<br>&nbsp;&nbsp;&nbsp;JOptionPane.showMessageDialog(null, "exceed digit");<br>&nbsp;&nbsp;&nbsp;comp.requestFocus();<br>&nbsp;&nbsp;&nbsp;return false;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;return true;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 是否为半角<br>&nbsp; * @param 字符串<br>&nbsp; * @return 半角true 全角false<br>&nbsp; */<br>&nbsp;private boolean checkHarf(String item) {</p>
<p>&nbsp;&nbsp;byte[] bytes = item.getBytes();<br>&nbsp;&nbsp;int beams = item.length();<br>&nbsp;&nbsp;if (beams == bytes.length) {<br>&nbsp;&nbsp;&nbsp;return true;<br>&nbsp;&nbsp;} else {<br>&nbsp;&nbsp;&nbsp;return false;<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<img src ="http://www.blogjava.net/Sprite-bei/aggbug/109319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Sprite-bei/" target="_blank">zht</a> 2007-04-09 09:22 <a href="http://www.blogjava.net/Sprite-bei/archive/2007/04/09/109319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于String类的split方法 </title><link>http://www.blogjava.net/Sprite-bei/archive/2007/01/22/95253.html</link><dc:creator>zht</dc:creator><author>zht</author><pubDate>Mon, 22 Jan 2007 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/Sprite-bei/archive/2007/01/22/95253.html</guid><wfw:comment>http://www.blogjava.net/Sprite-bei/comments/95253.html</wfw:comment><comments>http://www.blogjava.net/Sprite-bei/archive/2007/01/22/95253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Sprite-bei/comments/commentRss/95253.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Sprite-bei/services/trackbacks/95253.html</trackback:ping><description><![CDATA[
		<div class="postTitle"> </div>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">虽然使用正则表达式能很好的进行字符串的解析、提取、替换，但是对于一些简单的应用，使用</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">String</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">类提供的一些方法就可以很好的完成，最突出的就是</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">split</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">方法。</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-font-kerning: 0pt">split</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">方法能够很方便的将字符串按照一定的规则拆分开。</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">比如对于下面的字符串：</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-font-kerning: 0pt">Tom,Jane,Tony,Elva,Gigi<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">只要调用如下的代码就可以将各个名字提取出来：</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">String value = "Tom,Jane,Tony,Elva,Gigi";</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">String[] names = value.split(",");</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">for(int i=0,n=names.length;i&lt;n;i++)</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">{</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<font face="宋体">
										<span style="mso-tab-count: 1">     </span>System.out.println(names[i]);</font>
						</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">}</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">运行结果：</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">Tom</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">Jane</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">Tony</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">Elva</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">Gigi</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">看到这个运行结果，很多人都认为</span>
				<span lang="EN-US">split</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法就是按照给定的字符串对字符串进行拆分，知道碰到了下面的问题。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有一个字符串：中国</span>
				<span lang="EN-US">.</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">北京</span>
				<span lang="EN-US">.</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">海淀</span>
				<span lang="EN-US">.</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">学院路。请解析此字符串，并打印输出“中国</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">北京</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">海淀</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">学院路</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">于是写代码如下：</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US">
								<font face="宋体">String value = "</font>
						</span>
						<span style="FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 宋体; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 宋体">中国</span>
						<span lang="EN-US">
								<font face="宋体">.</font>
						</span>
						<span style="FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 宋体; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 宋体">北京</span>
						<span lang="EN-US">
								<font face="宋体">.</font>
						</span>
						<span style="FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 宋体; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 宋体">海淀</span>
						<span lang="EN-US">
								<font face="宋体">.</font>
						</span>
						<span style="FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 宋体; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 宋体">学院路</span>
						<span lang="EN-US">
								<font face="宋体">";</font>
						</span>
				</font>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">String[] names = value.split(".");</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">for(int i=0,n=names.length;i&lt;n;i++)</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">{</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<font face="宋体">
										<span style="mso-tab-count: 1">     </span>System.out.print(names[i]+" ");</font>
						</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">}</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">运行结果：</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-font-kerning: 0pt">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">对，没看错！没有任何输出！</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">让我们来看看</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">split</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">方法的方法签名吧：</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">public String[] split(String regex)</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">这里的参数的名称是</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">regex</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">，也就是</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">Regular Expression</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">（正则表达式）。这个参数并不是一个简单的分割用的字符，而是一个正则表达式，看了</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">split</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">方法的实现代码就更坚定了我们的信心：</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">public String[] split(String regex, int limit) {</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<font face="宋体">
										<span style="mso-tab-count: 1">     </span>return Pattern.compile(regex).split(this, limit);</font>
						</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">}</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-font-kerning: 0pt">split</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">的实现直接调用的</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">Matcher</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">类的</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">split</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">的方法。读者已经知道，“</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">.</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">”在正则表达式中有特殊的含义，因此我们使用的时候必须进行转义。</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">修改代码如下：</span>
				<span lang="EN-US" style="mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">private static void split2()</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">{</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<font size="2">
						<span lang="EN-US">
								<font face="宋体">
										<span style="mso-tab-count: 1">     </span>String value = "</font>
						</span>
						<span style="FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 宋体; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 宋体">中国</span>
						<span lang="EN-US">
								<font face="宋体">.</font>
						</span>
						<span style="FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 宋体; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 宋体">北京</span>
						<span lang="EN-US">
								<font face="宋体">.</font>
						</span>
						<span style="FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 宋体; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 宋体">海淀</span>
						<span lang="EN-US">
								<font face="宋体">.</font>
						</span>
						<span style="FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 宋体; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 宋体">学院路</span>
						<span lang="EN-US">
								<font face="宋体">";</font>
						</span>
				</font>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<font face="宋体">
										<span style="mso-tab-count: 1">     </span>String[] names = value.split("\\.");</font>
						</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<font face="宋体">
										<span style="mso-tab-count: 1">     </span>for(int i=0,n=names.length;i&lt;n;i++)</font>
						</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<font face="宋体">
										<span style="mso-tab-count: 1">     </span>{</font>
						</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<font face="宋体">
										<span style="mso-tab-count: 2">         </span>System.out.print(names[i]+" ");</font>
						</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font size="2">
								<font face="宋体">
										<span style="mso-tab-count: 1">     </span>}</font>
						</font>
				</span>
		</p>
		<p class="a" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<font face="宋体" size="2">}</font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行结果</span>
				<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">中国</span>
				<span style="mso-font-kerning: 0pt">
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">北京</span>
				<span style="mso-font-kerning: 0pt">
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">海淀</span>
				<span style="mso-font-kerning: 0pt">
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">学院路</span>
				<span style="mso-font-kerning: 0pt">
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</span>
		</p>
<img src ="http://www.blogjava.net/Sprite-bei/aggbug/95253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Sprite-bei/" target="_blank">zht</a> 2007-01-22 11:42 <a href="http://www.blogjava.net/Sprite-bei/archive/2007/01/22/95253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读取properties配置文件</title><link>http://www.blogjava.net/Sprite-bei/archive/2007/01/15/93930.html</link><dc:creator>zht</dc:creator><author>zht</author><pubDate>Mon, 15 Jan 2007 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/Sprite-bei/archive/2007/01/15/93930.html</guid><wfw:comment>http://www.blogjava.net/Sprite-bei/comments/93930.html</wfw:comment><comments>http://www.blogjava.net/Sprite-bei/archive/2007/01/15/93930.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Sprite-bei/comments/commentRss/93930.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Sprite-bei/services/trackbacks/93930.html</trackback:ping><description><![CDATA[Properties props = new Properties();<br /> props.load(new FileInputStream("resources/config.properties"));<br /> setFtp_userName(props.getProperty("ftp_user"));<br /> setFtp_passWord(props.getProperty("ftp_psw"));<br /> setFtp_ip(props.getProperty("ftp_ip"));<br /> setFtp_LoadForecast_path(props.getProperty("ftp_LoadForecast_path"));<br /><br />config.properties<br />ftp_user=wzq<br />#ftp 用户名<br />ftp_psw=wzq<br />#ftp 密码<br />ftp_ip=172.20.42.29<br />#ftp IP<img src ="http://www.blogjava.net/Sprite-bei/aggbug/93930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Sprite-bei/" target="_blank">zht</a> 2007-01-15 12:57 <a href="http://www.blogjava.net/Sprite-bei/archive/2007/01/15/93930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j的配置信息.</title><link>http://www.blogjava.net/Sprite-bei/archive/2007/01/11/93054.html</link><dc:creator>zht</dc:creator><author>zht</author><pubDate>Thu, 11 Jan 2007 01:03:00 GMT</pubDate><guid>http://www.blogjava.net/Sprite-bei/archive/2007/01/11/93054.html</guid><wfw:comment>http://www.blogjava.net/Sprite-bei/comments/93054.html</wfw:comment><comments>http://www.blogjava.net/Sprite-bei/archive/2007/01/11/93054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Sprite-bei/comments/commentRss/93054.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Sprite-bei/services/trackbacks/93054.html</trackback:ping><description><![CDATA[
		<p>Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的，它可接key=value格式的设 <br /> <br />Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的，它可接key=value格式的设置或xml格式的设置信息。通过配置，可以创建出Log4J的运行环境。</p>
		<p>1. 配置文件<br />Log4J配置文件的基本格式如下： </p>
		<p> #配置根Logger<br />log4j.rootLogger  =   [ level ]   ,  appenderName1 ,  appenderName2 ,  …</p>
		<p>#配置日志信息输出目的地Appender<br />log4j.appender.appenderName  =  fully.qualified.name.of.appender.class <br />　　log4j.appender.appenderName.option1  =  value1 <br />　　… <br />　　log4j.appender.appenderName.optionN  =  valueN </p>
		<p>#配置日志信息的格式（布局）<br />log4j.appender.appenderName.layout  =  fully.qualified.name.of.layout.class <br />　　log4j.appender.appenderName.layout.option1  =  value1 <br />　　… <br />　　log4j.appender.appenderName.layout.optionN  =  valueN  </p>
		<p>其中 [level] 是日志输出级别，共有5级：</p>
		<p> FATAL      0  <br />ERROR      3  <br />WARN       4  <br />INFO       6  <br />DEBUG      7 <br /> </p>
		<p>Appender 为日志输出目的地，Log4j提供的appender有以下几种：</p>
		<p> org.apache.log4j.ConsoleAppender（控制台），<br />org.apache.log4j.FileAppender（文件），<br />org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<br />org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件），<br />org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方） </p>
		<p>Layout：日志输出格式，Log4j提供的layout有以下几种：</p>
		<p> org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息） </p>
		<p>打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，如下:</p>
		<p> 　　%m   输出代码中指定的消息<br />　　%p   输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL <br />　　%r   输出自应用启动到输出该log信息耗费的毫秒数 <br />　　%c   输出所属的类目，通常就是所在类的全名 <br />　　%t   输出产生该日志事件的线程名 <br />　　%n   输出一个回车换行符，Windows平台为“\\r\\n”，Unix平台为“\\n” <br />　　%d   输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss , SSS}，输出类似：2002年10月18日  22 ： 10 ： 28 ， 921  <br />　　%l   输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java: 10 )  </p>
		<p>2. 在代码中初始化Logger: <br />1）在程序中调用BasicConfigurator.configure()方法：给根记录器增加一个ConsoleAppender，输出格式通过PatternLayout设为%-4r [%t] %-5p %c %x - %m%n，还有根记录器的默认级别是Level.DEBUG. <br />2）配置放在文件里，通过命令行参数传递文件名字，通过PropertyConfigurator.configure(args[x])解析并配置；<br />3）配置放在文件里，通过环境变量传递文件名等信息，利用log4j默认的初始化过程解析并配置；<br />4）配置放在文件里，通过应用服务器配置传递文件名等信息，利用一个特殊的servlet来完成配置。</p>
		<p>3. 为不同的 Appender 设置日志输出级别：<br />当调试系统时，我们往往注意的只是异常级别的日志输出，但是通常所有级别的输出都是放在一个文件里的，如果日志输出的级别是BUG！？那就慢慢去找吧。<br />这时我们也许会想要是能把异常信息单独输出到一个文件里该多好啊。当然可以，Log4j已经提供了这样的功能，我们只需要在配置中修改Appender的Threshold 就能实现,比如下面的例子：</p>
		<p>[配置文件]</p>
		<p> ### set log levels ###<br />log4j.rootLogger = debug ,  stdout ,  D ,  E</p>
		<p>### 输出到控制台 ###<br />log4j.appender.stdout = org.apache.log4j.ConsoleAppender<br />log4j.appender.stdout.Target = System.out<br />log4j.appender.stdout.layout = org.apache.log4j.PatternLayout<br />log4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n</p>
		<p>### 输出到日志文件 ###<br />log4j.appender.D = org.apache.log4j.DailyRollingFileAppender<br />log4j.appender.D.File = logs/log.log<br />log4j.appender.D.Append = true<br />log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志<br />log4j.appender.D.layout = org.apache.log4j.PatternLayout<br />log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n</p>
		<p>### 保存异常信息到单独文件 ###<br />log4j.appender.D = org.apache.log4j.DailyRollingFileAppender<br />log4j.appender.D.File = logs/error.log ## 异常日志文件名<br />log4j.appender.D.Append = true<br />log4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!<br />log4j.appender.D.layout = org.apache.log4j.PatternLayout<br />log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n <br /></p>
<img src ="http://www.blogjava.net/Sprite-bei/aggbug/93054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Sprite-bei/" target="_blank">zht</a> 2007-01-11 09:03 <a href="http://www.blogjava.net/Sprite-bei/archive/2007/01/11/93054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Web Start </title><link>http://www.blogjava.net/Sprite-bei/archive/2007/01/08/92405.html</link><dc:creator>zht</dc:creator><author>zht</author><pubDate>Mon, 08 Jan 2007 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/Sprite-bei/archive/2007/01/08/92405.html</guid><wfw:comment>http://www.blogjava.net/Sprite-bei/comments/92405.html</wfw:comment><comments>http://www.blogjava.net/Sprite-bei/archive/2007/01/08/92405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Sprite-bei/comments/commentRss/92405.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Sprite-bei/services/trackbacks/92405.html</trackback:ping><description><![CDATA[
		<font face="Verdana">轻松玩转Java Web Start</font>
		<p>
				<font face="verdana, arial, helvetica" size="2">
						<span class="javascript" id="text4886453" style="FONT-SIZE: 12px">Java Web Start（以下简称JWS）是SUN提供的一种通过Web来部署和发布Java 程序的新技术，它既可以用来发布Application，也可以用来发布Applet，它获去年全球Java技术最佳创意奖。它仅在第一次运行时下载程序，以后的事情，就全全交给JWS,包括版本的自动更新和维护。这是我们曾经梦寐以求的事情，程序运行在客户端（本地运行，当然有足够的速度），但不用去安装配置客户端，也不用去考虑版本升级后对客户端的维护，这就是JWS提供给我们的好处之一。OK，下面我们就来看看如何玩转JWS，本文仅用发布Application来做说明。<br />系统环境：Win2000Professional+Tomcat3.2.1+JDK1.3。<br />一：JWS简介<br />JWS主要用来通过网络部署你的应用程序，它具有安全、稳定、易维护、易使用的特点。用户访问用JWS部署应用程序的站点，下载发布的应用程序，既可以在线运行，也可以通过JWS的客户端离线运行已下载的应用程序。对同一个应用程序，在第一次运行时下载，以后每次运行时，JWS的客户端会自动去探测是否有版本更新，有更新就自动下载新版本，没有更新就直接运行本地当前版本，所有的麻烦全由JWS去承担。好，下面我们就一步一步来搭建JWS<br />二：搭建支持JWS的Web站点<br />第一步：你的Tomcat3.2.1已经正常运转<br />第二步：找到TomcatHOME/conf下的web.xml文件，在其中添加&lt;mime-type&gt;<br />application/x-java-jnlp-file<br />&lt;/mime-type&gt;<br />以支持JNLP文件。<br />三：部署应用程序<br />第一步：开发你希望发布的应用程序<br />第二步：把应用程序及所用到的所有资源打成一个或多个jar包<br />第三步：如果你的应用程序不会用到任何运行这个应用程序的机器的本地资源，那么，你的应用程序就可以部署了。<br />第四步：如果你的应用程序用到了运行这个应用程序的机器的本地资源，那么，你的应用程序就必须先签名然后才可以发布。<br />第五步：如何给应用程序签名<br />1：首先确保你已经完全安装了Java2的环境，有keytool工具，它位于J2SE SDk的bin目录下。这一般不会有问题。<br />2：到Dos状态下，进入你需发布应用程序的jar包所在的目录，运行下面这句话<br />keytool -genkey -keystore myKeystore -alias jwstest<br />它将会提示你输入用户名、密码等，不用理它，按照提示随便输入即可，但一定要记住密码。运行结束它将会在当前路径下创建名为myKeystore的文件。<br />3：如果你想察看一下刚才生成的myKeystore文件的内容，可以使用下面这句话：<br />keytool -list -keystore myKeystore<br />显示出来应该类似如下：<br />Keystore type: jks<br />Keystore provider: SUN<br />Your keystore contains 1 entry:<br />jwstest, Tue Nov 23 19:29:32 PST 2001, keyEntry,<br />Certificate fingerprint (Test):<br />C3:A9:CD:F3:D3:AC:4D:3F:3C:5B:AF:9E:CF:0D:46:5C<br />4：对你需发布应用程序的jar包进行签名，运行下面这句话：<br />jarsigner -keystore myKeystore yourtest.jar jwstest<br />其中yourtest.jar是你的jar包名，你需要修改它，别的就不必修改了。运行时会提示你输入密码，就是你刚才在生成myKeystore文件时设定的密码。<br />第六步：部署应用程序的jar包。<br />1：在Tomcat的webapps中新建目录JWSTest<br />2：在JWSTest下新建目录apps,META-INF，WEB-INF<br />3：在apps下新建目录images和lib<br />4：在META-INF中拷入MANIFEST.MF<br />5：在WEB-INF中拷入web.xml<br />6：把已经准备好的jar包拷入lib目录下<br />四：Jsp页面<br />第一步：编写用于Web访问的页面index.jsp如下：<br />&lt;%@page contentType="text/html;charset=gb2312"%&gt;<br />&lt;html&gt;<br />&lt;title&gt;JWS Test&lt;/title&gt;<br />&lt;head&gt;<br />&lt;SCRIPT LANGUAGE="Javascript"&gt;<br />function insertLink(url, name) {<br />document.write("&lt;a href=" + url + "&gt;" + name + "&lt;/a&gt;&lt;br&gt;&lt;br&gt;");<br />}<br />insertLink("http://你的IP:8080/ JWSTest /apps/JWSTest.jnlp"," JWSTest ");<br />&lt;/SCRIPT&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br />第二步：在jsp中添加检测访问的客户端是否已经安装了JWS的客户端的代码，示例如下：<br />&lt;%@page contentType="text/html;charset=gb2312"%&gt;<br />&lt;html&gt;<br />&lt;title&gt; JWS Test &lt;/title&gt;<br />&lt;head&gt;<br />&lt;SCRIPT LANGUAGE="Javascript"&gt;<br />var javawsInstalled = 0;<br />isIE = "false";<br />if (navigator.mimeTypes &amp;&amp; navigator.mimeTypes.length) {<br />x = navigator.mimeTypes['application/x-java-jnlp-file'];<br />if (x) javawsInstalled = 1;<br />} else {<br />isIE = "true";<br />}<br />function insertLink(url, name) {<br />if (javawsInstalled) {<br />document.write("&lt;a href=" + url + "&gt;" + name + "&lt;/a&gt;&lt;br&gt;&lt;br&gt;");<br />} else {<br />document.write("&lt;a href=" + url + "&gt;"+ name +"&lt;/a&gt;&lt;br&gt;&lt;br&gt;");<br />}<br />}<br />&lt;/SCRIPT&gt;<br />&lt;SCRIPT LANGUAGE="VBScript"&gt;<br />on error resume next<br />If isIE = "true" Then<br />If Not(IsObject(CreateObject("JavaWebStart.IsInstalled"))) Then<br />javawsInstalled = 0<br />Else<br />javawsInstalled = 1<br />End If<br />End If<br />&lt;/SCRIPT&gt;<br />&lt;SCRIPT LANGUAGE="Javascript"&gt;<br />if(javawsInstalled){<br />insertLink("http://你的IP:8080/ JWSTest /apps/JWSTest.jnlp"," JWSTest ");<br />}else{<br />//通知用户要先安装JWS的客户端，你可以自己提供下载或是直接链接到Sun的JWS下载。<br />//分为两种，如果客户端已经安装了Java运行环境，则只要下载javaws-1_0_1_01-win-int.exe即可。<br />//如果客户端没有安装Java运行环境，则要下载完整的javaws-1_0_1_01-win-int-rt.exe。<br />}<br />&lt;/SCRIPT&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br />五：JNLP文件<br />第一步：下面我们来编写JWS的核心配置文件JNLP，有了它，才能将以上各部分联系起来，真正让JWS运转起来。JNLP文件符合标准的XML语法，实质就是一个XML文件。当然，编写它的最好方式是对已写好的JNLP进行改写。JWSTest.jnlp示例如下：<br />&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;!-- JNLP File for SwingSet2 Demo Application --&gt;<br />&lt;jnlp<br />spec="1.0+"<br />codebase="http://你的IP:8080/JWSTest/apps"<br />href=" JWSTest.jnlp"&gt;<br />&lt;information&gt;<br />&lt;title&gt; JWS Test &lt;/title&gt;<br />&lt;vendor&gt;YOUR Name&lt;/vendor&gt;<br />&lt;homepage href=" JWSTest.html"/&gt;<br />&lt;description&gt; JWS Test &lt;/description&gt;<br />&lt;icon href="images/ JWSTest.jpg"/&gt;<br />&lt;offline-allowed/&gt;<br />&lt;/information&gt;<br />&lt;security&gt;<br />&lt;all-permissions/&gt;<br />&lt;/security&gt;<br />&lt;resources&gt;<br />&lt;j2se version="1.3"/&gt;<br />&lt;jar href="lib/ JWSTest.jar"/&gt;<br />&lt;/resources&gt;<br />&lt;application-desc main-class="运行启动的主类"/&gt;<br />&lt;/jnlp&gt;<br />第二步：部分JNLP的关键语法<br />&lt;jnlp&gt;元素<br />spec：必须是1.0及以上版本，这里用1.0+，不需修改。<br />codebase：资源的URL，是JNLP指向各连接的起始处，需自行修改。<br />Href：JNLP文件相对codebase的存放位置，和JNLP文件的全名，需自行修改。<br />&lt;infomation&gt;元素<br />Title：发布的应用程序简单标题，需自行修改。<br />Vendor：发行商信息，可以写上你的大名，需自行修改。<br />Homepage：存放有关应用程序的相关文档的URL，如help文件等，可有可无。<br />Description：对应用程序的描述，可以有多对&lt;description&gt;&lt;/description&gt;，可有可无。<br />Icon：用户下载你的应用程序后，在JWS里显示的图标的URL，应是gif或jpeg格式。需自行修改。<br />Offline-allowed：选择项，允许用户离线运行应用程序，一般都会有，不用修改。<br />&lt;security&gt;元素<br />选择项，如果没有指明&lt;security&gt;，默认是不允许应用程序访问用户的本地资源，即应用程序是沙箱运行。<br />如果设定为&lt;all-permissions/&gt;，则表示允许应用程序访问用户的本地资源。一般都会设定此值。<br />&lt;resource&gt;元素<br />&lt;j2se version = 指定jdk版本&gt;<br />&lt;jar href = 指定需发布的应用程序的jar包存放的位置&gt;<br />&lt;application-desc&gt;元素<br />main-class：应用程序运行启动的主类<br />&lt;argument&gt;：应用程序运行时的参数，可以有多个，每一个参数用一对&lt;argument&gt;参数&lt;/argument&gt;。<br />至此，你已经完全构建了运转JWS的各部件。<br />六：完整发布和测试<br />前面我们已经准备好了需发布的应用程序的jar包，也写好了用来访问的jsp文件和服务器端的核心jnlp文件。<br />第一步：在JWSTest下新建目录jsp。把index.jsp拷入jsp目录。<br />第二步：把jnlp文件直接拷入apps目录下。<br />第三步：在浏览器里输入:<a href="http://localhost:8080/JWSTest/jsp/index.jsp" target="_blank">http://localhost:8080/JWSTest/jsp/index.jsp</a> 即可访问到jsp页面。页面应出现JWSTest字样。<br />第四步：点击JWSTest，连接到apps下的JWSTest.jnlp文件，JWS启动，开始下载你发布的应用程序。<br />第五步：下载完毕，直接运行即可。以后，你也可以直接运行JWS客户端里已下载的应用程序。<br />不出意外，应恭喜你已经开始享受JWS带来的乐趣了。<br />七：常见问题<br />通过上面的讲述，你一定能体会到JWS的易用性。或许事情并没有那么简单，以我的使用经验，还会有许多问题出现，在这里挑几个经常出现的问题，给出相应解决方法，让大家少走弯路，而享受更多的乐趣。<br />问题一：JWS不能运行，JNLP文件像普通XML文件一样显示在Browser里<br />解决办法：请修改tomcat里，发布程序的路径中的web.xml。<br />在其中添加&lt;mime-type&gt;<br />application/x-java-jnlp-file<br />&lt;/mime-type&gt;<br />以支持JNLP文件。<br />问题二：不能下载资源或下载资源失败<br />解决办法：请卸载JWS的客户端，并将注册表里有关JWS的项目都删除，并确保program Files下的Java Web Start目录已被删除，然后，重装JWS。<br />问题三：下载资源中有未签名文件<br />解决办法：1：确保所有的jar包及其他资源都进行过签名。<br />2：确保整个资源中，没有中文的命名。好像签名工具不支持中文命名的文件名，所以未签到名。这可让我郁闷了一下午哦。<br />3：察看已经签名的jar包中，meta-inf路径下的jwstest.sf（jwstest是你在进行签名时-alias后的命名）文件，他详细的列出了所有已签名的文件，以分析签名失败的原因。</span>
						<br />
						<a href="http://www.itpub.net/595150.html">http://www.itpub.net/595150.html</a>
						<br />&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />&lt;!-- JNLP File for SwingSet2 Demo Application --&gt;<br />&lt;jnlp<br />spec="1.0+"<br />codebase="<a href="http://172.20.42.221:8080/JWSTest/apps">http://172.20.42.221:8080/JWSTest/apps</a>"<br />href=" JWSTest.jnlp"&gt;<br />&lt;information&gt;<br />&lt;title&gt; JWS Test &lt;/title&gt;<br />&lt;vendor&gt;YOUR Name&lt;/vendor&gt;<br />&lt;description&gt; JWS Test &lt;/description&gt;<br />&lt;offline-allowed/&gt;<br />&lt;/information&gt;<br />&lt;security&gt;<br />&lt;all-permissions/&gt;<br />&lt;/security&gt;<br />&lt;resources&gt;<br />&lt;j2se version="1.4"/&gt;<br />&lt;jar href="lib/xx.jar"/&gt;<br />&lt;/resources&gt;<br />&lt;application-desc main-class="fullScreen.FullScreenTest"/&gt;<br />&lt;/jnlp&gt;</font>
		</p>
<img src ="http://www.blogjava.net/Sprite-bei/aggbug/92405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Sprite-bei/" target="_blank">zht</a> 2007-01-08 16:19 <a href="http://www.blogjava.net/Sprite-bei/archive/2007/01/08/92405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>阳历转阴历</title><link>http://www.blogjava.net/Sprite-bei/archive/2007/01/04/91824.html</link><dc:creator>zht</dc:creator><author>zht</author><pubDate>Thu, 04 Jan 2007 11:12:00 GMT</pubDate><guid>http://www.blogjava.net/Sprite-bei/archive/2007/01/04/91824.html</guid><wfw:comment>http://www.blogjava.net/Sprite-bei/comments/91824.html</wfw:comment><comments>http://www.blogjava.net/Sprite-bei/archive/2007/01/04/91824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Sprite-bei/comments/commentRss/91824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Sprite-bei/services/trackbacks/91824.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: import		 java.text.ParseException;		import		 java.text.SimpleDateFormat;		import		 java.util.Calendar;		import		 java.util.Date;		public		 		class		 Lunar 										{    ...&nbsp;&nbsp;<a href='http://www.blogjava.net/Sprite-bei/archive/2007/01/04/91824.html'>阅读全文</a><img src ="http://www.blogjava.net/Sprite-bei/aggbug/91824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Sprite-bei/" target="_blank">zht</a> 2007-01-04 19:12 <a href="http://www.blogjava.net/Sprite-bei/archive/2007/01/04/91824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实用URL</title><link>http://www.blogjava.net/Sprite-bei/archive/2006/12/09/86568.html</link><dc:creator>zht</dc:creator><author>zht</author><pubDate>Sat, 09 Dec 2006 10:52:00 GMT</pubDate><guid>http://www.blogjava.net/Sprite-bei/archive/2006/12/09/86568.html</guid><wfw:comment>http://www.blogjava.net/Sprite-bei/comments/86568.html</wfw:comment><comments>http://www.blogjava.net/Sprite-bei/archive/2006/12/09/86568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Sprite-bei/comments/commentRss/86568.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Sprite-bei/services/trackbacks/86568.html</trackback:ping><description><![CDATA[
		<a href="http://four.fsphost.com/bill/index.html">http://four.fsphost.com/bill/index.html</a>
		<br />The following is some opening source code available small tool program. <br />有关于简繁体字转换的<br /><a href="http://www.jroller.com/page/santhosh/20050528#dropdownbutton_for_swing">http://www.jroller.com/page/santhosh/20050528#dropdownbutton_for_swing</a><br />Swing 快捷键<img src ="http://www.blogjava.net/Sprite-bei/aggbug/86568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Sprite-bei/" target="_blank">zht</a> 2006-12-09 18:52 <a href="http://www.blogjava.net/Sprite-bei/archive/2006/12/09/86568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>