??xml version="1.0" encoding="utf-8" standalone="yes"?>
关键字:AJAX,Tree,StrutsQDOM
难易度: ?BR>软g版本Qstruts 1.2.8
旉Q?006-01-27
AuthorQKino
***************************************
前阵子写了一个小代码处理AJAX下WebTree的构建,其中到了一些问题,也有一些想法,现在说出来希望大家一L看,如果案由问题请不吝赐教,本h不胜感激啊?BR>
背景Q?BR>q次因ؓ是加载在Struts上的开发,Web面上的Tree作AJAX处理Q因为有Node的增删改操作。Server端因和WebServiceq接Q所以不做Cache?BR>
解决案:
1。用Polling调用AJAX定期更新Tree?BR>2。AJAX讉K的地址是一个ActionQ例Qcreatetree.doQ。用来返回Tree模型或者错误消息(国际化)?BR>3。Browser解析XML的TreeModel?BR>4。在Browser比较新旧2个TreeModelQ完成选中状态的l承?BR>5。CSS渲染TreeNode?BR>
以上是简单的思\。传l的AJAX应该是尽量减XMl传输量,q于没有Cache的缘故,q且WSl我的节点ƈ不能单的得到父子关系。我选择了,每次Polling更新整棵树的Ҏ。性能未测?BR>
我这ơ在web server 端构建Tree时直接用深度优先转换成XML。XMl中数据的先后序军_了Tree从父到子Q从兄到弟的深度优先关系Qindent军_了深度(也就是羃q)。这h从Server端传入的也就成了一个标准的Tree昄Model。格式定义如下?BR> * Gobal Master Tree DTD
* <!ELEMENT tree (tree*)>
* <!ATTLIST tree
* id CDATA #REQUIRED LoctionInfo's toString
* indent CDATA #REQUIRED Tree's Level
* text CDATA #REQUIRED label in html
* tooltip CDATA #IMPLIED title in html
* action CDATA #IMPLIED href in html
* icon CDATA #IMPLIED close icon with the node status
* openicon CDATA #IMPLIED open icon with the node status
* open CDATA #IMPLIED> node's open states ,default is false in server.
* target CDATA #IMPLIED node's open target
*
<span id="maintree">
<tree id="Ajax" indent=0 text="Root" tooltip="Root" action="/logout.do" icon="" openicon= "" open="false"/>
<tree id="110" indent=1 text="Node 1" tooltip="Node 1" action="/logout.do" icon="" openicon= "" open="false"/>
<tree id="120" indent=2 text="Node 2" tooltip="Node 2" action="/logout.do" icon="" openicon= "" open="false"/>
<tree id="12580" indent=2 text="Node 3" tooltip="Node 3" action="/logout.do" icon="" openicon= "" open="false"/>
<tree id="user" indent=1 text="Node 4" tooltip="Node 4" action="/logout.do" icon="" openicon= "" open="false"/>
</span>
上边?Tree昄出来如下
Root
?BR> ├Node 1
?nbsp; ?BR> ?nbsp; ├Node 2
?nbsp; └Node 3
└Node 4
indent 是~进?BR>数据的先后顺序就是深度优先的遍历序?BR>
q样的数据到了BrowserQ会先被转成一个对象数l?BR>
q个是Java了,熟悉吧?/P>
C++的定义如下:
1.2虚函?BR>
把一个基cd数声明ؓvirtualQ该函数可以在MzcM重写了?BR>Java的语法中没有virtualq个词,但是Java却彻d底的贯彻着q个概念QJava的所有函数都是虚拟的?BR>C++的朋友可能比较熟悉这个词吧。对于这一点C#和C++是相同的。但是语法稍微有点不同,C#需要用overridecLC声明重写函数。如下例
1.3隐藏Ҏ
相同{的方法在基类和子c都声明了,但方法不是vitrual。那么实际中到底哪个Ҏ被执行,取决于引用实例的变量cdQ而不是实力本w的cd?BR>我们也不用太担心q个问题Q因为C#会在~译期给告?BR>
1.4调用U篏函数的方?BR>java中我们用superQC#中用base?BR>
1.5抽象cd抽象函数
和java一样用abstract声明?BR>和C++相比QC++的抽象函数被声明为纯虚函数?BR>
1.6密封cd密封Ҏ
在Java中我们把它叫做final。也是不能l承的类或不能重载的Ҏ?/P>
1.7构造函数的调用层次
和Java一P我就不多说了。这里强调一个特D的语法格式Q?BR>
l果如预计那?Q?BR>如果基类含有带参数的构造函敎ͼzcM能调用默认基cL造函数?BR>多参数派生类构造函敎ͼ可以调用参数数目不同的基cL造函数?BR>
我们一h看看Z么这2个结论可以成立:
首先Q对于带参数的基cL造函数在初始化的时候会试图去调用基c默认构造函敎ͼ但在上边的基cȝ序里Q因为只声明了带一个参数的构造函敎ͼ所以public Second(string f):base()或者public Second(string f)׃会通过~译Q因Z找不到基cȝ默认构造函敎ͼ只能q加public BaseClass()才会通过。这一点和JAVA是不同的Qjava的默认构造函数默认是不出现在代码里的。C#却一定要写出来?BR>
<<<== 有错误。C#的默认构造函C制和Java是一L。具体如下:
1。父cL有自定义构造函数的情况下,使用默认构造函数。用户可以不写出来?BR>2。一旦父cL了自定义的构造函敎ͼ那么如果要用无参的默认构造函数就必须要显C定义?/FONT>
其次Q下Ҏ生类1个参数?个参数甚臛_个参数的构造函Cؓ什么能讉K只有一个参数的基类构造函数呢Q原因是Q关键字thisQ上边的E序改写如下我想大家明白了?BR>
2.1修饰W?BR>C#支持下边的集中修饰符Q?BR>public Q?nbsp; protected Q?internal Qprivate Q?protected internal
同Java。internal和protected internal?net framework新增的一个内宏V根据定义?BR>internal在同一个程序集内和publiccMQ不同的E序集间Qpublic声明的类或方法仍然可用,但是internal的方法或cd被隐藏?BR>protected internal合ƈ了protected 和internalQ但q是一Uor关系Q而不是and关系。protected internal成员在同一个程序集的Q何代码都可见Q在zcd见?BR>
2.3接口
接口公约Q?BR>不能实例化接口?BR>接口不能有构造函数或字段?BR>接口定义也不允许包含q算W重载?BR>接口定义中还不允许声明成员上的修饰符。接口成员都是public的,不需要static也不需要virtual?BR>
同Java
接口可以彼此l承Q其方式和类l承相同。如下:
告一D落吧?nbsp; (つづ?请多提意见,如果有什么不清楚的地方也请你写下来,一赯查咯?nbsp;
Java异常处理机制
keywords:
Exception,Method Inovation Stack,
隑ֺQ初学,?/FONT>
异常cȝl承
Java异常是javaE序q行旉到非正常情况而创建的一U对象,她包装了异常的信息?BR>Java异常的顶U类是java.lang.Throwable。其l构如下Q?BR>
其中
Error ---- JVM的错误,也就是程序本w无法恢复的严重错误?BR>
Exception--被程序捕获ƈ处理的异常?BR>
JVM的方法调用堆?/STRONG>
大家对于Debug都很喜欢Q因为每当有异常出现的时候,她会告诉你哪里出了异常调用到底是什么。这又是如何实现的?
在JVM中用了Method Inovation Stack机制来跟t每一个线E中一pd的方法调用过E。ƈ保存在Stack里边?BR>Stack的顶端也是当前正在处理的方法。在Debug的时候,JVM会暂停被debug的线E,克隆她的StackQ然后显C出来供
developer操作Q这一点用Eclipse的h很有体验吧?BR>
一旦异常发生,JVM首先从当前的Ҏ开始寻扑֤理的try/CatchQ找不到Q就回朔到stack的下一个,也就是parent调用
Ҏ。D例如下:
public void child(int a)throws UserException
{
if (a < 0)
throw new UserException();
}
父方法如下:
public void parent(int a)
{
try
{
a = 1;
method(a);//throw Exception
}catch(UserException ue)
{
System.out.println("I get it from Child")!
ue.printExceptionStack();
}
}
pP异常被抓住了。当Ӟ如果在childҎ里边捕Pparent׃用这么“篏”了?BR>
其实最累的q是JVMQ她要对异常捕获q行查找Q如果一直都找不刎ͼ把异常直接抛给用户Q那么在l端上就能看
C。如果是抛出异常的程序是ȝQ还没有被捕P那就“死翘”了。要注意Q?BR>
异常处理Ҏ能的媄?/STRONG>
从上边的原理p知道Q不捕捉异常、捕捉异常的位置不合适、都会导致JVM性能降低?BR>
(PS:先记到这里,l箋上班?