posts - 15, comments - 10, trackbacks - 0, articles - 1

2008年4月11日

一、在JavaScript中调用Flex方法
在Flex中可以用ExternalInterface来调用Flex的方法,途径是
1.通过在Flex应用可调用方法列表中添加指定的公用方法。在Flex应用中通过调用addCallback()可以把一个方法添加到此列表中。addCallback将一个ActionScript的方法注册为一个JavaScript和VBScript可以调用的方法。
addCallback()函数的定义如下:
addCallback(function_name:String, closure:Function):void
function_name参数就是在Html页面中脚本调用的方法名。closure参数是要调用的本地方法,这个参数可以是一个方法也可以是对象实例。

举个例子:
<mx:Script>
    import flash.external.*;
    public function myFunc():Number {
        return 42;
    }
    public function initApp():void {
        ExternalInterface.addCallback("myFlexFunction",myFunc);
    }
</mx:Script>

2.那么在Html页面中,先获得SWF对象的引用,也就是用<object .../>声明的Swf的Id属性,比如说是MyFlexApp。然后就可以用以下方式调用Flex中的方法。
<SCRIPT language='JavaScript' charset='utf-8'>
    function callApp() {
        var x = MyFlexApp.myFlexFunction();
        alert(x);
    }
</SCRIPT>
<button onclick="callApp()">Call App</button>



二、在Flex中调用 JavaScript
你可以调用Html页面中的JavaScript,通过与JavaScript的交互,可以改变Style,调用远程方法。还可以将数据传递给Html页面,处理后再返回给Flex,完成这样的功能主要有两种方法:ExternalInterface()和navigateToUrl()。
在Flex中调用JavaScript最简单的方法是使用ExternalInterface(),可以使用此API调用任意JavaScript,传递参数,获得返回值,如果调用失败,Flex抛出一个异常。
ExternalInterface封装了对浏览器支持的检查,可以用available属性来查看。
ExternalInterface的使用非常简单,语法如下:
flash.external.ExternalInterface.call(function_name: String[, arg1, ...]):Object;
参数function_name是要调用的JavaScript的函数名,后面的参数是JavaScript需要的参数。
举个例子说明如何调用JavaScript函数
Flex应用中,添加如下方法:
<mx:Script>
<?xml version="1.0" encoding="iso-8859-1"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        import flash.external.*;
    
        public function callWrapper():void {
            var f:String = "changeDocumentTitle";
            var m:String = ExternalInterface.call(f,"New Title");
            trace(m);
        }
    </mx:Script>
    <mx:Button label="Change Document Title" click="callWrapper()"/>
</mx:Application>
Html页面中有如下函数定义:
<SCRIPT LANGUAGE="JavaScript">
    function changeDocumentTitle(a) {
        window.document.title=a;
        return "successful";
    }
</SCRIPT>

posted @ 2008-04-11 12:04 LeoOath 阅读(832) | 评论 (4)编辑 收藏

2008年4月8日

今天我们来看看AS3中新的XML处理方法:E4X,直到现在,ECMA脚本语言规范(ECMA-262)--AscriptScript 3.0的核心基础,并没有提供任何的XML数据处理类或方法。AcriontScript之前的版本(从Flash 5中的ActionScript开始)有一些处理XML数据的类和方法,但是它们并不是基于ECMAScript标准的。

新的ECMA脚本语言规范第4版草稿中定义了一系列新的处理XML数据的类和方法。这些类和方法的集合并命名为E4X("ECMAScript for XML"),ActionScript 3.0包括如下新的E4X类: XMLXMLListQNameNamespace

E4X类的方法、属性和操作的开法基于以下的目标:

  • 简单--E4X尽可能的使得处理XML数据的代码容易编写并且易于理解。
  • 一致性--E4X的方法于Actionscript的其它部分协调一致。
  • 友好--实用非常好理解的操作符处理XML数据,如点号(.)。

注意:为避免与E4X中的新的XML类冲突,原来ActionScript 2.0中的XML类在ActionScript 3.0被重命名为XMLDocument,为了向前兼容,在ActionScript 3.0中遗留下来的类--XML、XMLNode、XMLParser和XMLTag--被包含进了flash.xml包中。新的E4X类是核心类--使用它们不需要import任何包。

初始化XML对象

XML对象可以代表一个XML元素、属性、注释、处理指令或文本元素。在ActionScript 3.0中我们可以直接将XML数据赋值给变量:

var myXML:XML =
   <order>
       <item id='1'>
           <menuName>burger</menuName>
           <price>3.95</price>
       </item>
       <item id='2'>
           <menuName>fries</menuName>
           <price>1.45</price>
       </item>
   </order>

你也可以使用new 构造器来从XML数据文本创建一个XML对象实例:

var myXML:XML = new XML("<order><item id='1'><menuName>burger</menuName><price>3.95</price></item></order>")

如果XML数据不是格式完好的(如少了结束标签),那么将会出现运行时错误。

注意,你也可以将变量实例传入XML数据中:

var tagname:String = "item";
var attributename:String = "id";
var attributevalue:String = 5;
var content:String = "Chicken";
var x:XML = <{tagname} {attributename}={attributevalue}>{content}</{tagname}>;
trace (x.toXMLString())
   // Output: <item id="5">Chicken</item>

通常,我们的应用是从外部源导入XML数据,如web service或RSS feed,以下是一个从远程URL导入XML数据的例子:

var myXML:XML = new XML();
var XML_URL:String = "http://www.example.com/Sample3.xml";
//创建URLRequest。
var myXMLURL:URLRequest = new URLRequest(XML_URL);
//使用URLLoader导入数据。
var myLoader:URLLoader = new URLLoader(myXMLURL);
//添加事件监听器,以在XML数据导入完成后处理XML数据。
myLoader.addEventListener("complete", xmlLoaded);
//导入完成后,创建使用导入的数据创建XML对象
function xmlLoaded(evtObj:Event) {
       var myXML:XML = XML(myLoader.data);
       trace("Data loaded.");

}

为了演示代码的清晰性,本文中的大部份示例都第1种直接使用文本的方法创建XML对象。

E4X包含一些直观的方法XML数据的操作符(如.和@:用于访问属性):

//获取第1个item的menuName值
trace(myXML.item[0].menuName); // Output: burger
//获取第1个item的id属性值
trace(myXML.item[0].@id);//Output:1
//获取id属性为2的item的menuName值
trace(myXML.item.(@id==2).menuName); // Output: fries
//获取menuName为burger的item的price值
trace(myXML.item.(menuName=="burger").price); // Output: 3.95

你也可以使用appendChild()方法给XML添加新的子节点:

var newItem:XML =
   <item id="3">
       <menuName>medium cola</menuName>
       <price>1.25</price>
   </item>

myXML.appendChild(newItem);

当然你也可以使用@和.操作符来更新数据:

myXML.item[0].menuName="regular burger";
myXML.item[1].menuName="small fries";
myXML.item[2].menuName="medium cola";

myXML.item.(menuName=="regular burger").@quantity = "2";
myXML.item.(menuName=="small fries").@quantity = "2";
myXML.item.(menuName=="medium cola").@quantity = "2";

访问XML数据

你可以使用.(点号)和..操作符访问XML对象的子节点,使用@操作符访问某一节点的属性。考虑以下XML对象:

 
var x:XML =
      <book ISBN="0942407296">
           <title>Baking Extravagant Pastries with Kumquats</title>
           <author>
               <lastName>Contino</lastName>
               <firstName>Chuck</firstName>
           </author>
           <pageCount>238</pageCount>
       </book>
       <book ISBN="0865436401">
           <title>Emu Care and Breeding</title>
           <editor>
               <lastName>Case</lastName>
               <firstName>Justin</firstName>
           </editor>
           <pageCount>115</pageCount>
       </book>
   </order>

对象x.book表示一个包含所有名称为book的子节点的XMLList对象,该XMLList包含两个XML对象(两个book节点)。

对象x..lastName表示一个包含XML树结构下部所有的lastName属性的XMLList对象,该XMList包含两个XML对象(两个LastName属性)。

对象x.book.editor.lastName表示一个包含所有x对象的所有名称为book的子节点的所有名称为editor的子节点的所有lastName节点的XMLList对象,该XMLList只包含一个XML对象(值为"Case"的lastName属性)。

访问父节点和子节点

parent()方法返回XML对象的父节点。

你可以使用子节点列表的顺序索引值来访问特定的子节点,例如,假定某一XML对象x有两个名称为book的子节点,你可以如下访问它们:

//第1个book节点
x.book[0]
//第2个book节点
x.book[1]

要访问孙子节点,我们可以如下直接使用儿子和孙子节点的索引值来访问:

x.book[0].title[0]

不过如果x.book[0]只有一个名称为title的子节点的话,那么可以省略索引:

x.book[0].title

类似的,如果x对象只有一个book子节点,并且该book节点的子节点对象只有一个title对象,那么两个索引值都可以省略:

x.book.title

注意,你也可以使用child()方法,直接使用名称访问特定的子节点:

var x.XML =
       <order>
           <book>
               <title>Dictionary</title>
           </book>
       </order>

var childName:String = "book";
trace (x.child(childName).title) // Output: Dictionary

访问属性

我们使用使用@操作符访问XMLNode属性:

var myXML:XML =
   <order>
       <item id='1'>
           <menuName>burger</menuName>
           <price>3.95</price>
       </item>
       <item id='2'>
           <menuName>fries</menuName>
           <price>1.45</price>
       </item>
   </order>

//获取第1个item的id属性值
trace(myXML.item[0].@id);//Output:1

使用属性或元素值过滤XML数据

我们可以使用特定的元素名称和属性值来定位到特定的元素考虑以下XML对象:

var x:XML =
   <employeeList>
       <employee id="347">
           <lastName>Zmed</lastName>
           <firstName>Sue</firstName>
           <position>Data analyst</position>
       </employee>
       <employee id="348">
           <lastName>McGee</lastName>
           <firstName>Chuck</firstName>
           <position>Jr. data analyst</position>
       </employee>
   </employeeList>

以下是正确的访问方法:

//lastName为“McGee”的employee对象,第1个employee节点
x.employee.(lastName == "McGee") // The first employee node
//lastName为“McGee”的employee对象的firstName节点,第1个employee节点的节点
x.employee.(lastName == "McGee").firstName // The firstName property of that node
//lastName为“McGee”的id属性
x.employee.(lastName == "McGee").@id // The value of the id attribute
//所有id属性值为347的employee对象列表
x.employee.(@id == 347)
//id属性值为347的employee对象的lastName子节点
x.employee.(@id == 347).lastName
//所有id属性值大于347的employee对象列表
x.employee.(@id > 300) // An XML list with both employee properties
//所有position子节点值包含“analyst”的employee对象列表
x.employee.(position.toString().search("analyst") > -1)

使用for ... in和for each ... in 语句

ActionScript 3.0 包括了一个新用来遍历XMLList对象的的for ... in语句和for each ... in语句。例如,考虑以下XML对象,myXML和myXML..item XMLList对象(包含两个item XML对象节点的XML列表):

var myXML:XML =
   <order>
       <item id='1' quantity='2'>
           <menuName>burger</menuName>
           <price>3.95</price>
       </item>
       <item id='2' quantity='2'>
           <menuName>fries</menuName>
           <price>1.45</price>
       </item>
   </order>

for ... in语句可以让我们遍历XMLList的所有属性名称,实际上就是个节点的索引值:

var total:Number = 0;
for (var pname:String in myXML..item)
{
    total += Number(myXML.item.@quantity[pname]) * Number(myXML.item.price[pname]);
}

for each ... in语句遍历XMLList的所有节点:

var total2:Number = 0;
for each (var item:XML in myXML..item)
{
  total2 += Number(item@quantity) * Number(item.price);
}

使用with语句

我们可以使用with语句,来指明后续的属性和节点值都是基于某一XML对象,前面的for each ... in示例代码,使用with语句的代码如下:

var total:Number = 0;
for each (var item in myXML..item)
{
   with (item)
    {
         //{内的属性和节点对象都是基于item XML对象的,所有不需要使用item.来访问。
         total += Number(@quantity) * Number(price);
     }

}
trace(total);

修改XML对象

我们可以使用prependChild()方法或者appendChild()方法在XML对象的子节点列表的前面或者最后面添加节点:

var x1:XML = <p>Paragraph 1</p>
var x2:XML = <p>Paragraph 2</p>
var x:XML = <body></body>
x = x.appendChild(x1);
x = x.appendChild(x2);
x = x.prependChild(<p>Paragraph 0</p>);

// x == <body><p>Paragraph 0</p><p>Paragraph 1</p><p>Paragraph 2</p></body>

使用insertChildBefore()方法或者insertChildAfter()方法在特定的节点前面活着回后面添加节点:

var x:XML =
   <body>
       <p>Paragraph 1</p> 
       <p>Paragraph 2</p>
   </body>

var newNode:XML = <p>Paragraph 1.5</p>
x = x.insertChildAfter(x.p[0], newNode)
x = x.insertChildBefore(x.p[2], <p>Paragraph 1.75</p>)

注意,我们也可以在构造XML对象的时候使用大括号({和})来引用变量:

var ids:Array = [121, 122, 123];
var names:Array = [["Murphy","Pat"],["Thibaut","Jean"], ["Smith","Vijay"]]
var x:XML = new XML("<employeeList></employeeList>");

for (var i:int = 0; i < 3; i++) {
          var newnode:XML = new XML(); 
           newnode =
               <employee id={ids[i]}>
                   <last>{names[i][0]}</last>
                   <first>{names[i][1]}</first>
               </employee>

           x = x.appendChild(newnode)

}

我们也可以使用=操作符来给XML对象节点赋值:

var x:XML =
   <employee>
       <lastname>Smith</lastname>
   </employee>

x.firstname = "Jean";
x.@id = "239";

以上代码将把XML对象X设置成如下:

<employee id="239">
   <lastname>Smith</lastname>
   <firstname>Jean</firstname>
   </employee>

我们也可以使用+和+=操作符来连结XMLList:

var x1:XML = <a>test1</a>
var x2:XML = <b>test2</b>
var xList:XMLList = x1 + x2;
xList += <c>test3</c>

删除XML对象

E4X规范中定义有delete和deleteByIndex方法用来删除特定的XML节点,但是在当前版本的ActionScript 3.0实现中,并没有实现这两个方法,所有我们不能直接使用这两个方法,不过我们可以使用遍历XML树,剔除特定的节点,重新构造新的XML对象的方法来删除某一特定节点,以下我们将删除employee的lastname子节点:

private function deleteByIndex(xmlNode:XML,index:Number):XML{
    var newStr:String='';
    newStr+='<'+xmlNode.localName();
    for each (var att:XML in xmlNode.attributes()){
        newStr+=' '+att.localName()+'="'+att.toString()+'"';
    }
    newStr+='>';
    var i:Number=0;
    for each(var node:XML in xmlNode.children()){
        if(i!=index)
            newStr+=node.toXMLString();
        i++;
    }
    newStr+='</'+xmlNode.localName()+'/>';
    return new XML(newStr);
}

var myXML:XML=
   <employee id="239">
           <lastname>Smith</lastname>
           <firstname>Jean</firstname>
           <address>
           	<city>shangrao</city>
           	<load>daihu</load>
           	<no>5</no>
           </address>
       </employee>

myXML=deleteByIndex(myXML,0);

以上的deleteByIndex函数有两个参数,第1的参数是被删除节点的父节点,第2的参数是被删除节点的在父节点的子节点列表中索引值。先遍历父节点的索引属性,然后遍历其所有的子节点,跳过我们要删除的节点,然后将它们组合成新的XML对象返回。

如果XML对象非常复杂,数据量必较大的话,以上删除节点的实现方法效率是非常好低,所有正确的选择还是使用E4X定义的删除方法,不过这个功能要等到ActionScript 3.0的下一个测试版本才能够实现。

XML类型转换

我们可以将XML对象和XMLList对象转换为字符串,同样的,我们也可以将字符串转换为XML对象和XMLList对象。顺便,请记住所有的XML属性值、名称和文本值都是字符串。

转换XML和XMLList对象为字符串

XML对象和XMLList对象都有有两个成员方法:toString()和toXMLString()方法。toXMLString()方法返回包含所有标签、属性、命名空间声明和XML对象内容的字符串,对与复杂的XML对象(包含有子元素),toString()方法的效果和toXMLString()方法的效果一样,但是对与简单的XML对象(只包含一个文本元素),toString()方法只返回元素的文本内容:

var myXML:XML =
  <order>
       <item id='1' quantity='2'>
           <menuName>burger</menuName>
           <price>3.95</price>
       </item>
   <order>

trace(myXML.item0.menuName.toXMLString())
    // Output: <menuName>burger</menuName>
trace(myXML.item0.menuName.toString())
    // Output: burger

将文本字符串转换为XML对象

我们可以使用new构造方法从字符串创建一个XML对象

var x:XML = new XML('<a>test<b>');

但是如果我们试图将一个非XML或者结构不完整的字符串转换为XML对象,那么将会报运行时错误:

var x:XML = new XML('<a>test'); // Throws an error

从Internet读取Rss Fead数据

以下代码将读取本站的rss fead数据:

<?xml version="1.0" encoding="utf-8"?>
  <mx:Application xmlns:mx="http://www.macromedia.com/2005/mxml" xmlns="*" creationComplete="doInit()">
  <mx:Script>
  <![CDATA[
    private function doInit():Void{
      getRssData("http://blog.eshangrao.com/rss.php",ta_view);
    }

    public function getRssData(url:String, outTxt:TextArea):Void
    {
      private var myXMLURL:URLRequest = new URLRequest(url);
      private var myLoader:URLLoader = new URLLoader(myXMLURL);
      myLoader.addEventListener("complete", xmlLoaded);
    }
    private function xmlLoaded(event:Event):Void{
      ta_view.text='load ok';
      var myLoader:URLLoader = URLLoader(event.target);
      XML.ignoreProcessingInstructions=false;
      var myXML:XML =new XML(myLoader.data);
      private var outStr:String = "";
      for each (var item:XML in myXML.children()) {
        if(item.localName()=='item'){
          outStr += "<p><b>" + item.children()0.toString() + ":</b></p><p>";
          outStr += item.children()6.toString() ;
          outStr += " <br/><a href='" + item.children()1.toString();
          outStr += "'><font color='#008000'>More...</font></a></p>";
        }
      }
      //ta_view.text=myXML.toString();
      ta_view.htmlText = outStr;
    }
  ]]>
  </mx:Script>
  <mx:Canvas width="100%" height="100%">
    <mx:TextArea id="ta_view">
      <mx:layoutConstraints>
        <mx:EdgeAnchor bottom="10" top="10" left="10" right="10"/>
      </mx:layoutConstraints>
    </mx:TextArea>
  </mx:Canvas>
</mx:Application>

运行示例(FlashPlayer8.5 required)

注意,我们没有直接使用节点名称访问节点(不知道为什么,如果使用item.title访问title节点的话,返回是空的,可能跟我的RSS XML的中rdf指令有关,如果有朋友知道解决的办法,请告诉我),而是使用了children()方法,该方法返回某一XML对象的所有子节点对象,

posted @ 2008-04-08 14:41 LeoOath 阅读(260) | 评论 (0)编辑 收藏

flash.utils.getQualifiedClassName(value:Object):String

Flex获得className

posted @ 2008-04-08 13:55 LeoOath 阅读(601) | 评论 (0)编辑 收藏

AS3里所有能在舞台(Stage)上看到的东西都继承自 DisplayObject 。如果让它最终显示出来还需要使用某个 DisplayObjectContainer 的addChild() 或者 addChildAt() 方法把它加到显示列表(display list)里。看看图示:
1.jpg
  显示列表的最根部是 Stage 。Stage 是一个 DisplayObjectContainer ,所有的可见对象是它的 child 或者 child 的 child 。在一个文档的第一帧输入代码:

trace(stage.getChildAt(0));

输出类似于“[object Timeline0_94f120f8fa23a64ca3a80eab162a99a]”。下划线后面的字符串是随机的,每次都不同。删掉时间轴上的代码,绑定文档到一个自定义类,如 TestStage :

package{
import flash.display.Sprite;   
public dynamic class TestStage extends Sprite{
public function TestStage(){
trace(stage.getChildAt(0));
}
}
}

输出:“[object TestStage]”。可见,Flash IDE 的默认编辑环境,也就是 AS2 里的 _root ,现在是 Stage 的第一个 child 。注意上面的代码,我把 TestStage 类定义为 dynamic :

public dynamic class TestStage extends Sprite{

AS3 里 DisplayObject 不是动态类,所以如果想像以前那样使用点语法(mc1.mc2.txt1.text)或者 getChildByName() 方法访问 Flash IDE 创建的 MC ,必须把类定义为动态,不然会报错:
“ReferenceError: Error #1056: Cannot create property test_mc on TestStage.”
  现在在 Flash IDE 舞台上随便创建一个影片剪辑,命名为 test_mc ,修改上面的 trace 代码为

trace(stage.getChildAt(0).test_mc.name);

输出:“test_mc”。
在 AS2 里访问同样的 MC 代码为:

trace(_root.test_mc.name);

stage.getChildAt(0) 就是舞台场景或者我们绑定的文档类。所以在文档类里我们直接

trace(this.test_mc.name);

在时间轴上也可以使用同样的代码,就像过去一样。
  当然,前面提到,Stage 是一个 DisplayObjectContainer ,所以它有 addChild() 和 addChildAt() 方法。如果使用

//var stage_mc:Sprite = new Sprite();...
stage.addChild(stage_mc) ;

将可以看到在舞台或者文档类中创建的所有东西都在这个新加的 stage_mc 之下。如果是

stage.addChildAt(stage_mc,0);

所有的东西将在这个 stage_mc 之上,_root 在这里将相当于 stage.getChildAt(1) 了。这在下面会讨论到。
  下面用一张图来加深对 DisplayObjectContainer 的理解,这是一个装载了不同 DisplayObject 的 DisplayObjectContainer 。
2.jpg
那么究竟有哪些类是 DisplayObjectContainer ?直接继承 DisplayObjectContainer 的有 Loader, Sprite, Stage 。那么它们和它们所有的子类(Sprite 的子类 MovieClip,DownloadProgressBar 等以及它们的子类)都将是 DisplayObjectContainer ,可以使用 addChild() 和 addChildAt() 方法加载 DisplayObject (DisplayObjectContainer 也继承 DisplayObject) :

  最后来看看 AS3 中的层管理。它是完全自动的。当使用 addChild() 方法把 DisplayObject 加到一个 DisplayObjectContainer 的 display list ,它将自动获得从0开始的连续的 index 。于是你可以用 getChildAt(0) , getChildAt(1) … 分别获得第一个、第二个…加入显示列表(display list)的 DisplayObject ,这比 getChildByName() 方法更有效率。如果使用 addChildAt() 方法把一个 DisplayObject 加到一个已经存在的层,如上面提到的

stage.addChildAt(stage_mc,0);

那么该层原有的以及所有该层之上的内容都自动上移一层(index + 1)。同样的,当使用 removeChild() 或 removeChildAt() 方法删除某一层的显示内容,所有该层之上的内容都会自动下移一层(index - 1)。注意 index 始终是连续的,如果现在的 numChildren 是4,也就是现有最大的 index 是3(0,1,2,3),你将不能 addChildAt(mc,5) 或者任何比5更高的层,编译器将报错:
“RangeError: Error #2006: The supplied index is out of bounds.”
  最后提一下,所有的 DisplayObject 都有一个 stage 属性指向 Stage ,使用它的前提是该 DisplayObject 已经加入某个 DisplayObjectContainer 的 display list ,不然返回的将是 null 。

posted @ 2008-04-08 12:11 LeoOath 阅读(715) | 评论 (0)编辑 收藏

2008年4月7日

     摘要: Ext是一个非常好的Ajax框架,其华丽的外观表现确实令我们折服,然而一个应用始终离开不服务器端,因此在实现开发中我们需要对Ext与服务器端的交互技术有较为详细的了解,在开发中才能游刃有余地应用。本文对Ext应用中与服务器交互的常用方法作具体的介绍,本文的内容大部份来源于《ExtJS实用开发指南》。  总体来说,Ext与服务器端的交互应用可以归结为三种类型,包含表单FormPanel的处理(提交、...  阅读全文

posted @ 2008-04-07 11:00 LeoOath 阅读(117) | 评论 (1)编辑 收藏

2008年3月28日

附件是客户端代码,做了一些改造。主要是清除一些模块之间的关联,避免关联下载。
为了更快的启动客户端、最少的下载gui更新程序,我尝试了如下做法:

   1. 个模块分开打包。目前粒度是对各第三方jar包、common目录、gui下的个子目录、gui目录本身做了单独打包、签名、pack200;
   2. 设置各个包的下载策略。对于少数必须包,用eager;对于非必须包(例如各模块包、itext包等),一律用lazy处理;
   3. 首次启动客户端,尽可能快、少下载包。目前可以只下载必要包(见后续列表,并且还有改进潜力)。目前可以做到LoginUI出现时,不下载任何业务模块。
   4. 由于MainUI关联了不少各模块的东西(例如工具栏上有一些业务模块的快捷入口),启动程序时候应当避免加载MainUI类。所以,改造XXX的main函数到Main.java中,而不再放在MainUI中;
   5. 通过观察以前代码jnlp的jar加载发现,login界面出来时候eng包竟然已经被加载。调试发现ClientInitialize类中调用了PartType数量。必要性不大,去掉之;
   6. 启动MainUI,什么也没动的情况下,发现几乎所有业务模块jar都被加载。原因是:MainUIActionManager里面的clear方法在清除缓存时候,用硬编码调用各个模块的类的静态方法进行clear,导致这些jar包全都被加载。做如下改造:在MainUIActionManager中做一个map存储所有待清除类,用类名和方法名记录clear cache的方法;各个具体模块的类如果有需要logout被清除的,在类的开始处用static代码段调用 MainUIActionManager.registerClearCache来注册自己。这样,MainUIActionManager就不必知道每个被清除者,谁注册谁会被回调。这里的缺点是:由于这些clear方法都是static的,无法用接口来定义,java没有abstract static这样的概念,这里只能用反射,有一定的出错概率。经过这个改造,mainUI启动后,业务模块大多没有load,只有eng、sales和 manage来死活在上面。
   7. 继续研究eng模块jar包总是被加载。发现原因是:默认进来的HomePage就是PartHomePage。这个看来没招了。不过sales和manage还要研究。
   8. 继续发现:part首页出现后,sales模块总是被加载。后来发现是AbstractHomePage类中的addInfoCenterTab方法中,竟然用SalesUtil.getString获得tab的title字符串。去掉,sales模块不再加载。
   9. 继续发现:part首页出现后,manage模块jar总是被加载。后来发现,part首页的infoCenter要显示InfoCenter的UI,而这些类是在manage包内定义的。抽出来放在eng模块,让manage引用eng模块。manage模块不再被加载。

通过以上改造,首次运行XXX,到LoginUI显示时,加载的XXX的包如下:
XXX-base.jar
XXX-common.jar
XXX-gui.jar
XXX-i18n.jar
XXX-image.jar
XXX-server.jar
XXX-swing.jar
org.jar
第三方包有:
commons-lang.jar
jbossall-client.jar
looks-1.3.1.jar
twaver.jar
总计大小:3.439m。而且应当还有改进潜力。
点击login到进入MainUI,期间被加载的包有:
XXX-comany
XXX-conf
XXX-message
XXX-print
XXX-security
总计大小(包含前面加载的):3.995m
如果点击树将各个模块触发全部jar下载,累计总计大小:7.116m
以后:

    * 如果某个业务模块被具体更新:从双击jnlp到MainUI显示出来未做任何动作之前,没有任何下载产生(相当于直接启动);点击对应的模块树会触发下载,但一般模块包的jar包都在1m以下,相当于下载一个新闻网页,略感延迟但不明显;只要下载服务器和客户端网络较好,基本感觉不到更新;
    * 如果客户端基本包(包括common、gui包、image、base、swing等)被更新,双击jnlp会触发进度条进行下载更新,不过会提示,用户可以选择;这是因为在jnlp中做了如下设置:<update check="background" policy="prompt-update"/>,用户可以选择不更新而启动客户端(当然这样风险相当大);
    * 如果第三方包被更新:同上。

附件的jnlp文件是新版本,可以看一下。为了方便管理众多gz和jar文件,将所有压缩包放入webstart/jars目录下,上层目录只留下index.htm和jnlp文件。
附件中的bat文件,可以将class文件进行打包、repack、签名、pack200压缩、生成对应的空jar文件、move到jboss目录,一次搞定(使用前需要修改一下里面的目录)。
<?xml version="1.0" encoding="utf-8"?>
<jnlp
spec="1.0+"
codebase="http://192.168.1.100:8080/webstart/"
href="XXX.jnlp">
<information>
      <title>2BizBox v2</title>
         <vendor>SERVA Software</vendor>
         <homepage href="http://www.servasoft.com"/>
         <description>XXX</description>
         <description kind="short">SERVA Software 2BizBox 2.0.</description>
         <offline-allowed/>
</information>
<security>
   <all-permissions/>
</security>
<update check="background" policy="prompt-update"/>
<resources>
   <j2se version="1.5+" initial-heap-size="128m" max-heap-size="512m"/>
   <jar href="jars/XXX-common.jar" part="XXX-common" download="eager"/>
   <jar href="jars/XXX-gui.jar" part="XXX-gui" download="eager" main="true"/>
   <jar href="jars/org.jar" part="XXX-gui" download="eager"/> 
 
   <!-- 2bizbox lazy modules -->
 
   <jar href="jars/XXX-acc.jar" part="XXX-acc" download="lazy"/>
   <package name="com.serva.XXX.gui.acc.*" part="XXX-acc" recursive="true"/>
   <jar href="jars/XXX-addr.jar" part="XXX-addr" download="lazy"/>
   <package name="com.serva.XXX.gui.addr.*" part="XXX-addr" recursive="true"/>
   <jar href="jars/XXX-base.jar" part="XXX-base" download="lazy"/>
   <package name="com.serva.XXX.gui.base.*" part="XXX-base" recursive="true"/>
   <jar href="jars/XXX-chart.jar" part="XXX-chart" download="lazy"/>
   <package name="com.serva.XXX.gui.chart.*" part="XXX-chart" recursive="true"/>
   <jar href="jars/XXX-company.jar" part="XXX-company" download="lazy"/>
   <package name="com.serva.XXX.gui.company.*" part="XXX-company" recursive="true"/>
   <jar href="jars/XXX-conf.jar" part="XXX-conf" download="lazy"/>
   <package name="com.serva.XXX.gui.conf.*" part="XXX-conf" recursive="true"/>
   <jar href="jars/XXX-cs.jar" part="XXX-cs" download="lazy"/>
   <package name="com.serva.XXX.gui.cs.*" part="XXX-cs" recursive="true"/>
   <jar href="jars/XXX-dev.jar" part="XXX-dev" download="lazy"/>
   <package name="com.serva.XXX.gui.dev.*" part="XXX-dev" recursive="true"/>
   <jar href="jars/XXX-doc.jar" part="XXX-doc" download="lazy"/>
   <package name="com.serva.XXX.gui.doc.*" part="XXX-doc" recursive="true"/>
   <jar href="jars/XXX-eng.jar" part="XXX-eng" download="lazy"/>
   <package name="com.serva.XXX.gui.eng.*" part="XXX-eng" recursive="true"/>
   <jar href="jars/XXX-hr.jar" part="XXX-hr" download="lazy"/>
   <package name="com.serva.XXX.gui.hr.*" part="XXX-hr" recursive="true"/>
   <jar href="jars/XXX-i18n.jar" part="XXX-i18n" download="lazy"/>
   <package name="com.serva.XXX.gui.i18n.*" part="XXX-i18n" recursive="true"/>
   <jar href="jars/XXX-images.jar" part="XXX-images" download="lazy"/>
   <package name="com.serva.XXX.gui.images.*" part="XXX-images" recursive="true"/>
   <jar href="jars/XXX-log.jar" part="XXX-log" download="lazy"/>
   <package name="com.serva.XXX.gui.log.*" part="XXX-log" recursive="true"/>
   <jar href="jars/XXX-man.jar" part="XXX-man" download="lazy"/>
   <package name="com.serva.XXX.gui.man.*" part="XXX-man" recursive="true"/>
   <jar href="jars/XXX-manage.jar" part="XXX-manage" download="lazy"/>
   <package name="com.serva.XXX.gui.manage.*" part="XXX-manage" recursive="true"/>
   <jar href="jars/XXX-message.jar" part="XXX-message" download="lazy"/>
   <package name="com.serva.XXX.gui.message.*" part="XXX-message" recursive="true"/>
   <jar href="jars/XXX-plan.jar" part="XXX-plan" download="lazy"/>
   <package name="com.serva.XXX.gui.plan.*" part="XXX-plan" recursive="true"/>
   <jar href="jars/XXX-print.jar" part="XXX-print" download="lazy"/>
   <package name="com.serva.XXX.gui.print.*" part="XXX-print" recursive="true"/>
   <jar href="jars/XXX-pur.jar" part="XXX-pur" download="lazy"/>
   <package name="com.serva.XXX.gui.pur.*" part="XXX-pur" recursive="true"/>
   <jar href="jars/XXX-quality.jar" part="XXX-quality" download="lazy"/>
   <package name="com.serva.XXX.gui.quality.*" part="XXX-quality" recursive="true"/>
   <jar href="jars/XXX-rule.jar" part="XXX-rule" download="lazy"/>
   <package name="com.serva.XXX.gui.rule.*" part="XXX-rule" recursive="true"/>
   <jar href="jars/XXX-sales.jar" part="XXX-sales" download="lazy"/>
   <package name="com.serva.XXX.gui.sales.*" part="XXX-sales" recursive="true"/>
   <jar href="jars/XXX-security.jar" part="XXX-security" download="lazy"/>
   <package name="com.serva.XXX.gui.security.*" part="XXX-security" recursive="true"/>
   <jar href="jars/XXX-server.jar" part="XXX-server" download="lazy"/>
   <package name="com.serva.XXX.gui.server.*" part="XXX-server" recursive="true"/>
   <jar href="jars/XXX-swing.jar" part="XXX-swing" download="lazy"/>
   <package name="com.serva.XXX.gui.swing.*" part="XXX-swing" recursive="true"/>
   <jar href="jars/XXX-tools.jar" part="XXX-tools" download="lazy"/>
   <package name="com.serva.XXX.gui.tools.*" part="XXX-tools" recursive="true"/>
   <jar href="jars/XXX-ware.jar" part="XXX-ware" download="lazy"/>
   <package name="com.serva.XXX.gui.ware.*" part="XXX-ware" recursive="true"/>
   <jar href="jars/XXX-wo.jar" part="XXX-wo" download="lazy"/>
   <package name="com.serva.XXX.gui.wo.*" part="XXX-wo" recursive="true"/>

   <!-- all third party components -->
   <jar href="jars/looks-1.3.1.jar" download="eager"/>
   <jar href="jars/jbossall-client.jar" download="eager"/>
   <jar href="jars/commons-lang-1.0.1.jar" download="eager"/>
   <jar href="jars/itext-1.4.4.jar" part="itext" download="lazy"/>
   <jar href="jars/iTextAsian.jar" part="itext" download="lazy"/>
   <package name="com.lowagie.*" part="itext" recursive="true"/>
 
   <jar href="jars/twaver.jar" part="twaver" download="lazy"/>
   <package name="twaver.*" part="twaver" recursive="true"/>
   <jar href="jars/jxl.jar" part="jxl" download="lazy"/> 
   <package name="jxl.*" part="jxl" recursive="true"/>
   <jar href="jars/barbecue.jar" part="barbecue" download="lazy"/>
   <package name="net.sourceforge.barbecue.*" part="barbecue" recursive="true"/>
</resources>
<application-desc main-class="com.serva.XXX.gui.Main">
   <argument>localhost</argument>
</application-desc>
</jnlp>
pack.bat
cd classes
del /q *.jar
cd ..
rmdir -Q jars-gui
mkdir jars-gui
cd classes
jar -cf XXX-common.jar com/serva/XXX/common
jar -cf XXX-gui.jar com/serva/XXX/gui/*.class com/serva/XXX/gui/*.dat
jar -cf XXX-acc.jar com/serva/XXX/gui/acc
jar -cf XXX-addr.jar com/serva/XXX/gui/addr
jar -cf XXX-base.jar com/serva/XXX/gui/base
jar -cf XXX-chart.jar com/serva/XXX/gui/chart
jar -cf XXX-company.jar com/serva/XXX/gui/company
jar -cf XXX-conf.jar com/serva/XXX/gui/conf
jar -cf XXX-cs.jar com/serva/XXX/gui/cs
jar -cf XXX-dev.jar com/serva/XXX/gui/dev
jar -cf XXX-doc.jar com/serva/XXX/gui/doc
jar -cf XXX-eng.jar com/serva/XXX/gui/eng
jar -cf XXX-hr.jar com/serva/XXX/gui/hr
jar -cf XXX-i18n.jar com/serva/XXX/gui/i18n
jar -cf XXX-images.jar com/serva/XXX/gui/images
jar -cf XXX-log.jar com/serva/XXX/gui/log
jar -cf XXX-man.jar com/serva/XXX/gui/man
jar -cf XXX-manage.jar com/serva/XXX/gui/manage
jar -cf XXX-message.jar com/serva/XXX/gui/message
jar -cf XXX-plan.jar com/serva/XXX/gui/plan
jar -cf XXX-print.jar com/serva/XXX/gui/print
jar -cf XXX-pur.jar com/serva/XXX/gui/pur
jar -cf XXX-quality.jar com/serva/XXX/gui/quality
jar -cf XXX-rule.jar com/serva/XXX/gui/rule
jar -cf XXX-sales.jar com/serva/XXX/gui/sales
jar -cf XXX-security.jar com/serva/XXX/gui/security
jar -cf XXX-server.jar com/serva/XXX/gui/server
jar -cf XXX-swing.jar com/serva/XXX/gui/swing
jar -cf XXX-tools.jar com/serva/XXX/gui/tools
jar -cf XXX-ware.jar com/serva/XXX/gui/ware
jar -cf XXX-wo.jar com/serva/XXX/gui/wo
pack200 --repack XXX-common.jar                        
pack200 --repack XXX-gui.jar                        
pack200 --repack XXX-acc.jar                        
pack200 --repack XXX-addr.jar                        
pack200 --repack XXX-base.jar                        
pack200 --repack XXX-chart.jar                        
pack200 --repack XXX-company.jar                        
pack200 --repack XXX-conf.jar                        
pack200 --repack XXX-cs.jar                       
pack200 --repack XXX-dev.jar                        
pack200 --repack XXX-doc.jar                        
pack200 --repack XXX-eng.jar                       
pack200 --repack XXX-hr.jar                        
pack200 --repack XXX-i18n.jar                        
pack200 --repack XXX-images.jar                       
pack200 --repack XXX-log.jar                   
pack200 --repack XXX-man.jar                      
pack200 --repack XXX-manage.jar                    
pack200 --repack XXX-message.jar                     
pack200 --repack XXX-plan.jar                         
pack200 --repack XXX-print.jar                       
pack200 --repack XXX-pur.jar                     
pack200 --repack XXX-quality.jar                    
pack200 --repack XXX-rule.jar                   
pack200 --repack XXX-sales.jar                    
pack200 --repack XXX-security.jar           
pack200 --repack XXX-server.jar                    
pack200 --repack XXX-swing.jar                      
pack200 --repack XXX-tools.jar                      
pack200 --repack XXX-ware.jar                     
pack200 --repack XXX-wo.jar                
jarsigner -keystore ../myKeystore -storepass servasoft XXX-common.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-gui.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-acc.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-addr.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-base.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-chart.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-company.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-conf.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-cs.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-dev.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-doc.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-eng.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-hr.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-i18n.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-images.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-log.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-man.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-manage.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-message.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-plan.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-print.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-pur.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-quality.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-rule.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-sales.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-security.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-server.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-swing.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-tools.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-ware.jar XXX
jarsigner -keystore ../myKeystore -storepass servasoft XXX-wo.jar XXX
pack200 XXX-common.jar.pack.gz XXX-common.jar
pack200 XXX-gui.jar.pack.gz XXX-gui.jar
pack200 XXX-acc.jar.pack.gz XXX-acc.jar
pack200 XXX-addr.jar.pack.gz XXX-addr.jar
pack200 XXX-base.jar.pack.gz XXX-base.jar
pack200 XXX-chart.jar.pack.gz XXX-chart.jar
pack200 XXX-company.jar.pack.gz XXX-company.jar
pack200 XXX-conf.jar.pack.gz XXX-conf.jar
pack200 XXX-cs.jar.pack.gz XXX-cs.jar
pack200 XXX-dev.jar.pack.gz XXX-dev.jar
pack200 XXX-doc.jar.pack.gz XXX-doc.jar
pack200 XXX-eng.jar.pack.gz XXX-eng.jar
pack200 XXX-hr.jar.pack.gz XXX-hr.jar
pack200 XXX-i18n.jar.pack.gz XXX-i18n.jar
pack200 XXX-images.jar.pack.gz XXX-images.jar
pack200 XXX-log.jar.pack.gz XXX-log.jar
pack200 XXX-man.jar.pack.gz XXX-man.jar
pack200 XXX-manage.jar.pack.gz XXX-manage.jar
pack200 XXX-message.jar.pack.gz XXX-message.jar
pack200 XXX-plan.jar.pack.gz XXX-plan.jar
pack200 XXX-print.jar.pack.gz XXX-print.jar
pack200 XXX-pur.jar.pack.gz XXX-pur.jar
pack200 XXX-quality.jar.pack.gz XXX-quality.jar
pack200 XXX-rule.jar.pack.gz XXX-rule.jar
pack200 XXX-sales.jar.pack.gz XXX-sales.jar
pack200 XXX-security.jar.pack.gz XXX-security.jar
pack200 XXX-server.jar.pack.gz XXX-server.jar
pack200 XXX-swing.jar.pack.gz XXX-swing.jar
pack200 XXX-tools.jar.pack.gz XXX-tools.jar
pack200 XXX-ware.jar.pack.gz XXX-ware.jar
pack200 XXX-wo.jar.pack.gz XXX-wo.jar
del /q *.jar
move *.gz ../jars-gui
cd ../jars-gui
echo nothing > XXX-common.jar                        
echo nothing > XXX-gui.jar                        
echo nothing > XXX-acc.jar                        
echo nothing > XXX-addr.jar                        
echo nothing > XXX-base.jar                        
echo nothing > XXX-chart.jar                        
echo nothing > XXX-company.jar                        
echo nothing > XXX-conf.jar                        
echo nothing > XXX-cs.jar                       
echo nothing > XXX-dev.jar                        
echo nothing > XXX-doc.jar                        
echo nothing > XXX-eng.jar                       
echo nothing > XXX-hr.jar                        
echo nothing > XXX-i18n.jar                        
echo nothing > XXX-images.jar                       
echo nothing > XXX-log.jar                   
echo nothing > XXX-man.jar                      
echo nothing > XXX-manage.jar                    
echo nothing > XXX-message.jar                     
echo nothing > XXX-plan.jar                         
echo nothing > XXX-print.jar                       
echo nothing > XXX-pur.jar                     
echo nothing > XXX-quality.jar                    
echo nothing > XXX-rule.jar                   
echo nothing > XXX-sales.jar                    
echo nothing > XXX-security.jar           
echo nothing > XXX-server.jar                    
echo nothing > XXX-swing.jar                      
echo nothing > XXX-tools.jar                      
echo nothing > XXX-ware.jar                     
echo nothing > XXX-wo.jar     
del -Q C:\jboss-4.0.5\server\default\deploy\webstart.war\jars\XXX-*.*
move *.* C:\jboss-4.0.5\server\default\deploy\webstart.war\jars
cd ..
rmdir -Q jars-gui

posted @ 2008-03-28 10:11 LeoOath 阅读(778) | 评论 (0)编辑 收藏

jacob是java和windows下的com桥,通过它我们可以在java程序中调用COM组件。如果你的JDK是1.4,那你需要下载jacob1.9的jni库才能正常运行,早期版本在JDK1.4下有些问题。

package com;
/**
* 〈p〉Title:Word文档转html类〈/p〉
* 〈p〉Description: 〈/p〉
* 〈p〉Copyright:() 2002〈/p〉
* @author 舵手
* @version 1.0
*/
import com.jacob.com.*;
import com.jacob.activeX.*;

public class WordtoHtml {
/**
*文档转换函数
*@param docfile word文档的绝对路径加文件名(包含扩展名)
*@param htmlfile 转换后的html文件绝对路径和文件名(不含扩展名)
*/
public static void change(String docfile, String htmlfile) {
ActiveXComponent app = new ActiveXComponent("Word.Application"); // 启动word
try {
app.setProperty("Visible", new Variant(false));
//设置word不可见
Object docs = app.getProperty("Documents").toDispatch();
Object doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] { docfile, new Variant(false),new Variant(true) }, new int[1]).toDispatch();
// 打开word文件
Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {htmlfile, new Variant(8) }, new int[1]);
// 作为html格式保存到临时文件
Variant f = new Variant(false);
Dispatch.call(doc, "Close", f);
} catch (Exception e) {
e.printStackTrace();
} finally {
app.invoke("Quit", new Variant[]{});
}
}
public static void main(String[] strs){
WordtoHtml.change("c:\\a\\运输管理调度系统总体方案.doc", "c:\\a\\t");

}
}

posted @ 2008-03-28 10:08 LeoOath 阅读(965) | 评论 (5)编辑 收藏

/*
* show the arthimetic character of '<<' '>>' '>>>'
*/

public class TestArithmetic {
   public TestArithmetic() {
   }
  
   public   static void   main(String [] args){
     int minus = -10;
     System.out.println(" Binary of -10 is " + Integer.toBinaryString(minus));
     System.out.println(" Arthimetic minus by -10 << 2 = " + (minus<<2) + " Binary is " + Integer.toBinaryString(minus<<2));
     System.out.println(" Arthimetic minus by -10 >> 2 = " + (minus>>2) + " Binary is " + Integer.toBinaryString(minus>>2));
     System.out.println(" Arthimetic minus by -10 >>>2 =   " + (minus >>> 2) + " Binary is " + Integer.toBinaryString(minus>>>2)
                        + ",length is " + Integer.toBinaryString(minus>>>2).length());
    
     int plus = 10;
     System.out.println(" Binary of 10 is " + Integer.toBinaryString(plus));
     System.out.println(" Arthimetic minus by 10 << 2 = " + (plus<<2)+ "Binary is " + Integer.toBinaryString(plus<<2));
     System.out.println(" Arthimetic minus by 10 >> 2 = " + (plus>>2)+ "Binary is "+ Integer.toBinaryString(plus>>2));
     System.out.println(" Arthimetic minus by 10 >>>2 =   " + (plus >>> 2)+ "Binary is "+ Integer.toBinaryString(plus >>> 2));
   }

补充知识:数值的补码表示也分两种情况:
(1)正数的补码:与原码相同。
例如,+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码0000111按位取反为1111000;再加1,所以-7的补码是11111001。


已知一个数的补码,求原码的操作分两种情况:
(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。

posted @ 2008-03-28 10:08 LeoOath 阅读(84) | 评论 (0)编辑 收藏

用XMLEncode输出时候,如果有BigDecimal有时候不好使。
原因是:如果类的变量在定义时候有初始值,而不是null,就必须要重载DefaultPersistenceDelegate的mutatesTo方法。
关于这个说明,在网上这里可以看到:
http://forum.java.sun.com/thread.jspa?threadID=631299&messageID=3642493

有兴趣的可以看看:
//setup big decimal delegate.
          DefaultPersistenceDelegate bigDecimalDelegate = new DefaultPersistenceDelegate() {
              protected Expression instantiate(Object oldInstance, Encoder out) {
                  BigDecimal decimal = (BigDecimal) oldInstance;
                  return new Expression(oldInstance, oldInstance.getClass(), "new", new Object[] {decimal.toString()});
              }
              //must override this method.
              // see http://forum.java.sun.com/thread.jspa?threadID=631299&messageID=3642493
              protected boolean mutatesTo(Object oldInstance, Object newInstance) {
                  return oldInstance.equals(newInstance);
              }
              //--- Joshua
          };

网上的牛人说:

This works for BigDecimal properties that aren't initialized, i.e. null. But if you initialize the property, then this won't work unless you override mutatesTo in addition to instantiate mentioned above:

protected boolean mutatesTo(Object oldInstance, Object newInstance) {
return oldInstance.equals(newInstance);
}

posted @ 2008-03-28 10:07 LeoOath 阅读(50) | 评论 (0)编辑 收藏

public class MethodDemo {

/**
* @param args
*/
public static void main(String[] args) {
   MethodDemo demo = new MethodDemo();
   Integer i = Integer.valueOf(1);
   demo.add(i);
   System.out.println("i:" + i);
  
   String s = "ss";
   demo.stringchange(s);
   System.out.println("s:" + s);
  
   Person per = new Person();
   demo.setDate(per);
   System.out.println("per:" + per.getName());
}

//基本类型变不了
public void add(int i) {
   i++;
}

/***
* 凡是在引用中出现修改引用的赋值语句,
* 修改都变成无效
* @param i
*/

//想修改引用,不行
public void add(Integer i) {
   int j = i.intValue();
   i = Integer.valueOf(j++);//i的原引用已经丢失了
}

//想修改引用,不行
public void stringchange(String s){
   s = "stringchange";
}

public void setDate(Person per){
   Person per2 = new Person();
   per2.setName("per2Name");
   per = per2;//per的原引用已经丢失了
   per.setName("name");
}

}

class Person {
String name ;

public String getName() {
   return name;
}

public void setName(String name) {
   this.name = name;
}

}

posted @ 2008-03-28 10:05 LeoOath 阅读(61) | 评论 (0)编辑 收藏