tomcat admin tree 解f

很多人, 都我如何在W上使用 struts 做出一B的罱YY料
而 Tomcat 就有一很好的例 by Craig R. McClanahan

那N, 今天我就短的介B, 他O的精髓吧 ^^~

(1) 下d例程式
jakarta 下d tomcat 5.0.x 的 source code
到 %upzip-dir%/jakarta-tomcat-5.0.x-src/jakarta-tomcat-catalina/webapps/admin 之下
@部分就是 tomcat admin 的系y程式所放置的地方

(2) Controller ( org.apache.webapp.admin.ApplicationServlet )
你看到 web.xml 之中的 controller O定, 你大概{一下,
楹尾皇 ActionServlet 呢, 因 admin 需要使用一些 JMX 的功能
所以^承了 ActionServlet 做了一些其他的,
如果你不了解 JMX, 我建h直接裼 ActionServlet 作 Controller .

(3) Action ( org.apache.webapp.admin.SetUpTreeAction )
SetUpTreeAction 是整 Tree 初始化的重要 action,
第一次取得所有WY料, ⒃谶@ea生⑺械馁Y料放入 session 之中
你吹 servlet.getServletConfig().getInitParameter("...")
裼 web.xml 中的 init-parameter O定值,
接下淼幼骶捅容^重要, 也砍侗容^V泛,


TreeControlNode root =
new TreeControlNode("ROOT-NODE",null,
rootnodeName,
"setUpTree.do?select=ROOT-NODE","content", true, domain);
TreeControl control = new TreeControl(root);

碚f, 先建立一 Root 的 TreeNode,
我⒏@ Root 去O定 TreeControl, 就是整罱Y的根.
注意, 最後我放入 session 的是 treeControl
但是@r候, treeControl 只有 root @根c

接著, 我颜罱Y放到 treeControl,
怎Nk, 怎N ?
我利用到 TreeBuilder ( Builder Pattern )
你吹揭恍┭}s的程式a, ]PS, 他⒔⒑芏 tree ( tomcat/ resources/ users )
可以在 web.xml 的 treebuilders 之 init-param 中看到
-org.apache.webapp.admin.TomcatTreeBuilder, -org.apache.webapp.admin.resources.ResourcesTreeBuilder, -org.apache.webapp.admin.users.UsersTreeBuilder @ TreeBuilder, 不^我只f明 UsersTreeBuilder 就足蜃大家了解了
基本上, 我 org.apache.webapp.admin.users.UsersTreeBuilder newInstance() a生物件
接著使用 buildTree() 就能虍a生整 罱Y 放到 treeControl 之中 ~

(4) TreeControl (org.apache.webapp.admin.TreeControl)
@ class 是整 罱Y 外部呼叫的方式,
主要可以取得 root, width . O定 node 等等功能
作椴倏剡@ 罱Y 的控制中心,
所以我旁 session 之中W存取

(5) TreeControlNode (org.apache.webapp.admin.TreeControlNode)
睹恳c, 他提供了
name icon label action target expanded domain
@N傩, 足蜃W可以呈F各N情r下的每c之邮
所以, TreeControl 就是Υ媪怂 TreeControl 的相互PScY料

(6) TreeBuilder ( org.apache.webapp.admin.TreeBuilder )
TreeBuilder 是很蔚 interface,
而作的 XXXTreeBuilder 就是①Y料j到 TreeControl 之中

(7) XxxTreeBuilder ( org.apache.webapp.admin.users.UsersTreeBuilder ) 我拿 UsersTreeBuilder 碚f明,
因 TomcatTreeBuilder 有包含了 JMX ^^~
在 buildTree 中, 最重要的就是⒛阋 所有 Node 放到魅氲 TreeControl 之中. ( 可以看一下 addSubtree(). )

(8) TreeControlTag ( org.apache.webapp.admin.TreeControlTag )
如果你 tablib 熟悉的, 可以看一下@程式
如果不熟悉, 你就作是理所然的程式a
@ taglib 也是整罱Y的控制核心,
他愕木W操控, 更改你的罱Y的展F方式

(9) tree-control-test.jsp 你可以看到 SetUpTreeAction 最後就是 forward 到 Tree Control Test ,
在 struts-config.xml O定中 Tree Control Test 就是指到 tree-control-test.jsp
在@支 jsp 之中, 蔚 taglib 呼叫


<controls:tree tree="treeControlTest"
action=
"treeControlTest.do?tree=${name}"
style=
"tree-control"
styleSelected=
"tree-control-selected"
styleUnselected=
"tree-control-unselected"
/>

就可以a生所有的罱Y了
但是, 你可以看到每 Node 的 action 就是 treeControlTest.do
所以最後, 就是 struts-config.xml 中z查 treeControlTest 是指 org.apache.webapp.admin.TreeControlTest @支程式

(10) TreeControlTest ( org.apache.webapp.admin.TreeControlTest )
@是最後一需要查的程式了,
基本上你魅 tree @,
假O你F在是 expand = true 辉O定 false
可以魅 select @
代表F在是@ treeControlNode 是被x取的

@是一有c}s, s具有很好O模M^念的罱Y之作方式..

好文章。

我也研究了一下Tomcat这个tree,总得来说,我支持使用taglib实现树结构,因为没有Javascript,这样页面具有通用性,而且load速度会提高。

这个tree是基于struts 1.0的,有一些小问题,感觉它的TreeControlNode包含的属性太多,其实核心三个,key、url和lable,其它如icon等和界面设计相关,应该在Jsp调用时作为taglib参数输入,放在Java Bean层不是好方式。

通常情况是,我们的树形结构数据是存放在数据库或XML中,因此,如何将我们持久化的树形结构转换成Tomcat的这个Tree就很关键,实际只是利于这个Tree的显示功能。


用HTC做不是更好。

jakarta99 只能删除,麻烦你再贴一下,贴代码,只要选择Code按钮。
将代码放在code中间就可以,注意回车换行。

这个事情我也干过,总的来说这个Tree的复用价值不高,主要是速度问题
用taglib只是它在内部帮你动态地生成JavaScript,树节点的最后事件不可能不借助JS的,也就是说每次的树叶展开收缩都通过服务器动态生成JS来实现的,这样的数度显然会大打折扣.Tomcat管理页面可以这样做是因为它不太需要考虑带宽和庞大的树节点的情况
当然它的XML树资源的配置结构等可以部分借鉴,因为这也是直接写html和JavaScript需要考虑的,我觉得还是直接写html和JavaScript比较通用,不太喜欢用taglib包装

真不知道你有]有^ 一 folder 超^ 1000 P次c的 tree
在 ie a生 javascript error

反而是大型Y料
才需要用Ba生 tree
javascript 只m合用在少的Y料
如果我有 10000 c
那N是不是第一次就要渌匈Y料

Ok, 然有解Q方法,
你可能[在 session e面
但是, 如果c是不嗟男薷
你是不是得不嗟娜デ宄 session Y料

ps, 我做的0付际谴笮0

我习惯的tree显示是用javascript的方式,因为可以减少页面的刷新。用html生成tree的做法,点开一个节点,刷新整颗树的系统对于我这样无耐心的user来说实在是很恼火的事情。

对于jakarta99提到的一个node下超过1000个child node的情况,我认为是需求和设计上的问题,正常的需求和好的设计不应该出现这样的情况,user点开一个node以后需要在1000多个子节点当中寻找他想要的?眼珠子都要掉下来了, :)

比方说在我们做一个org chart的tree,如果一个组织下有超过1000个员工,我们可以按照名字的首字母作为分类的子节点,这样user再点击他要的分类,这样会就减少javascript需要读取的数据量。

推荐一个很好用的tree script (在以前的帖子中发过):
http://webfx.eae.net/dhtml/xloadtree/xloadtree.html

这个script需要的tree xml,是可以动态生产的,我们可以生产适当大小的tree node。这样在server端的性能和客户端响应速度上都有不错的表现。

其实,Tomcat的这个原理很简单,它是直接输出Html,而不是象Js那样一次性将树结构取到浏览器中,这样做有很多优势:

1.节省带宽,提高速度,因为每次显示并不是树的全部展开,只是一部分,因此传送字节少。这种情况对于复杂树非常合适。

2.兼容性强,Js的树一般使用专用包,理解专用包,和自己实际用法,这些都是有距离的,JS和DHML的兼容性是一个恶梦。

3.可维护性强,JS的编写维护调试到现在还是停留在手工方式,有那么多时间精力为什么不能用在研究学习更多Java源码上?通过Java的taglib的实现方式可维护性很强,taglib可以做成重用性很高的组件。

请banq在看过,试用过我推荐的那个javascript以后再看下面的回复:

>> 1.节省带宽,提高速度,因为每次显示并不是树的全部展开,只是一部分,因此传送字节少。这种情况对于复杂树非常合适。<<
xmlloadtree每次不是读去树的全部,是读取点击节点的xml file, 因为它不用刷新全部页面,从server端读取的数据只是一个很小的xml文件,比读取一个完整的html page的数据要少很多。带宽和速度恰恰是它的优势。

>> 2.兼容性强,Js的树一般使用专用包,理解专用包,和自己实际用法,这些都是有距离的,JS和DHML的兼容性是一个恶梦。<<
Javascript也是可以写成OO的,它没有使用专用包,如果你有看过这个tree的代码的话,你会发现它是很容易理解和扩展。至于兼容性的问题是因为编写Javascript的功力不够,而这个tree的javascript没有兼容问题。它支持绝大多数的浏览器。

>> 3.可维护性强,JS的编写维护调试到现在还是停留在手工方式,有那么多时间精力为什么不能用在研究学习更多Java源码上?通过Java的taglib的实现方式可维护性很强,taglib可以做成重用性很高的组件。 <<
Javascript的调试工具有很多,你可以google一下,比方说mozila就自带js debugger。学习研究javascript并不需要很多的时间和精力,javascript的OO思想和Java是相通的。我认为作为一个好的coder,不应该只是了解server side的东西,还应该了解关心client的技术。Javascript也可以写成重用性很高的组件,我推荐的那个site上就有很多这样重用性极高的widget,比如说sortable table。你习惯用taglib,也可以用taglib包装输出一行script就搞定了。

dear

@一篇文章最早的意思是教Т蠹胰绾慰炊 tomcat admin tree
我也]有f一定要使用他所有的 tree
而且@情r最好是用在BY料 ( 就是f, Tree 是Sr改的 )

你f的 xtree 和其他的 javascript tree ^念都是差不多
基本上如果你要他都在 client 端绦械脑
就是需要Ba生所有的 data 鬏到 client

如果你要呼叫 server 端的 xml ( 此 xml 也要Ba生 )
那N^念和 tree taglib 的^念是一拥
我也可以 tree taglib 改成呼叫 server-side xml

我有一案例, 你可以思考一下
我拿 LDAP Tree 砜
一h市有 300 C / 每C下有 50 挝 / 每挝患s 100 人
共c大s 300*50*100 = 1,500,000

如果你要一次a生所有 xml Y料鬏
想必要花更大的rg在第一次的鬏
即使之後只是_⒛ xml 而已
而且我不能保C javascript 的承d量, 可能绣e`l生

然, 如果在小型系y c挡化 或 化^少的情r下
裼 javascript dhtml 然是又快又好的解Q方案
但是如果是化l繁 或 c堤嗟那榭
裼 server-side tree-mapping 然是比^好

我反而X得{
楹斡幸方案提出
就J定@方法不好 >"<
而不去思考什N情r下可能用得到

我喜欢你这个树,并且已经用上了,觉得很好。

>> @一篇文章最早的意思是教Т蠹胰绾慰炊 tomcat admin tree
我也]有f一定要使用他所有的 tree
而且@情r最好是用在BY料 ( 就是f, Tree 是Sr改的 ) <<

跑题了,那就继续跑下去把,:)
我主要是对你说的这个观点表示完全不同的看法:
“反而是大型Y料,才需要用Ba生 tree,javascript 只m合用在少的Y料”

你还是没有仔细看过我推荐的那个xloadtree,他和其他的javascript tree的观念是不一样的,并不是把所有需要动态产的data一次统统传到client, 对于你说的case,tree xml在第一次被传输的时候只需要300个组织的节点信息。ex:


<?xml version="1.0"?>

<tree>
<tree text="上海" src="loadXml.do?provinceId=1" />
<tree text="台湾" src="loadXml.do?provinceId=2" />
....
</tree>

当user点对应的组织的时候会再次load对应组织的50个单位节点的xml信息,当然这个xml文件是动态生成的(loadXml.do?provinceId=2)。ex:


<?xml version="1.0"?>

<tree>
<tree text="台北" src="loadXml.do?provinceId=2&cityId=1" />
<tree text="高雄" src="loadXml.do?provinceId=2&cityId=2" />
....
</tree>

所以它只是读取所需的xml data. 这个比完整的传输整个html page的数据要少得多吧?你说的对于javascript的处理能力的当心是从何而来的呢?我有在实际的MES系统里面使用XML load的方式,数据量比你举得例子要多一些(5层的数据,每层的数目在100个左右),并没有碰到客户端处理能力的问题。

所以我的观点是:
javascript不仅仅适用在小系统,而且也适用在大系统

>> 我反而X得{
楹斡幸方案提出
就J定@方法不好 >"<
而不去思考什N情r下可能用得到 <<

我没有说你的方案不好,只是对你的观点有不同意见,提出来讨论,但是希望大家在回复以前都先看清楚别人说的是什么意思。

sorry about 上面一t的抱怨, 一rg失言了.. sorry again .

fine, 我就把@h}饪s到

大型Y料的 Tree

我想我都有共R
Y料量超^一盗康r候
c其第一次浜媒o client javascript 绦
不如每次都到 server 取得要取得的Y料

你的 loadXml.do?provinceId=2
也是要a生大量Y料在鬏上面
Q : 和透^ taglib 取出 HTML 的Y料有什N差e ? :P

我e的r砜春湍愕囊馑际且拥
第一次都是回 300 PY料, 你也不, 我也不....
按下新的一 node 都是去l出 request 呼叫新的面
得到的Y料你也不, 我也不
差是 html c xml 的Z法上面有]有化, 虿蚝

javascript 在@e的好, 每c都是相同的傩缘玫降 xml 就容^小
例如目Dn, 假如每都是一拥傩, taglib 就差了一c ,因樗鬏比^多的 tag.
但是 taglib 的好, 不用花 client 的 memory 再度花rg prepare Y料
而 javascript 接收到 xml 是要花rg去排出 tree

Q : 我U好奇你所^的 action (*.do) xml 的rg芫 ?

@h}已x}太多了
我的^念比你

不同的r需要不同的解Q方案 :P

good, 同意你的观点:javascript和taglib的时候在处理大数据量tree时候的做法在设计上应该是类似的。

Q : 和透^ taglib 取出 HTML 的Y料有什N差e ? :P

A : 差别在于用户端可以局部刷新,而不用刷新整个HTML page,通常一个web application的page内容不可能只有一个tree, 还会有header, footer, menu等等。使用taglib会出现为了刷新一个节点的内容,却要重新从server读完整的HTML的情况。而用javascript传输的xml的数据肯定要比完整HTML要少,对于减轻server的带宽loading会是一个很好的地方。而且对于user来说,也不用忍受屏幕频繁刷新的情况。

至于你说的“javascript 接收到 xml 还是要花时间去排出 tree” ,现在的普通个人电脑对于这样的简单处理还是非常快速的。这和使用taglib全部重排整个HTML page时间相比相差无多。

Q : 我U好奇你所^的 action (*.do) xml 的rg芫 ?
A : 我的xml并不是生成一个file,再回传的,而是直接由response write回去,ex:


response.setContentType("text/xml");
response.getWriter().write(UtilXml.writeXmlDocument(requestParametersMap));

实际使用下来的效果很好,在效率上没有问题。

我认为很多人不喜欢用javascript是因为不肯多学习javascript部分的知识,认为那是小儿科,其实用的好的话,javascript会让你的application更强大,更cool。


>> @h}已x}太多了
我的^念比你

不同的r需要不同的解Q方案 :P <<
这个......,有些话永远是正确的,:)
我的观点还是和前贴一样“javascript不仅仅适用在小系统,而且也适用在大系统

^^~ 和你很有意思

就此打住吧 !!


ps:
我 dhtml 和 javascript 也是很有研究的, 他^Σ皇小嚎
有C俸湍闱写璋 ^^~