该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2005-05-10
这只是个示范,具体是否使用iframe或者是否使用配置文件是可选的,复杂一点可以是
<portal:page> <c:forEach var="portalColumn" items="${portalPage.Columns}"> <portal:column width="${portalColumn.width}"> <c:forEach var="portalModule" items="${portalColumn.modules}"> <portal:module/> </c:forEach> </portal:column> <portal:dragbar/> </c:forEach> </portal:page> 其实就是对类似my.msn.com的代码的封装,可以动态拖拉 |
|
返回顶楼 | |
发表时间:2005-05-10
canonical 写道 引用 fastm的BEGIN, END Name 能够更容易定位一些。表达层次关系更清楚。
这个我看差不多,只是如果你自己从头开始写parser,这样比较容易一些。不过xmlparser是java的标准部分,适当写一些封装,使用起来就非常方便了。 我看了Jivan, Tapestry, Wicket 的Parser 实现,用了 SAX Parser, Neko HTML,对我来说,难度还是挺大。:P 需要自己截获 Tag Begin / End Event, 然后构造自己的结构 。其实就是细节处理复杂一些。:-) 另外,我说的定位是指 程序员 编辑页面的时候,想找到这个Tag的范围,比较难找。因为 Tag 结尾标志没有 名字 name, id 等。 而用了fastm, BEGIN, END 后面都有名字 name。可以直接搜索到。 |
|
返回顶楼 | |
发表时间:2005-05-10
呵呵,dlee说的就是xhtml啊,恩,这个东东以后可能会流行起来,现在很多blog不都是用它的么,好处非常明显,就不多说了,但是缺点给人的感觉就是太麻烦了,主要是利用css来进行排版,这可要一定的功底哦。而且要求美工必须是js高手,这显然不太现实,所以就又要加一个中间的页面转换师,这和前面用tag相差不多。也许是html的简单在人们心中已经根深蒂固,我曾经尝试过碰这个东东,但是最终还是发现用table来定位来的简单,虽然现在普遍反对利用table来排版。而且其实对页面的控制大部分都交给了js+css,给我的感觉是以css为主,js为辅,但是这样的话,css达到个几十K是非常平常的事情,我就曾经见到过50K的css
![]() 当然,如果只是针对IE的话,把一些通用组件写成htc,然后在css中调用,也不失为一种好办法。 如果在java中生成一个xml,然后在页面中用js+dom+css或者用Data island,或者是xml+xsl等来解析,可以规避掉表现层的问题,但是对于大批量的数据,这种方法显然就不适用了。很明显,这将对客户的浏览器造成相当大的压力。而且,在java本来可以用list等将数据集传出,页面中接受并解析就可以了,而用xml的话,还要多一步生成xml的步骤,给人的感觉似乎是多此一举,虽然用jibx,castor来绑定速度很快,但是orm对于动态xml就无能为力了。而且对于中小型的项目似乎还可以,对于大型项目大批数据,不知道生成xml是否会造成性能瓶颈?我总觉得这个东西在数据量不是很大的时候使用,如果数据量很大,我还是会采用传统的方式来做。 to canonical:我以前就是做portal的,我们当时是用velocity来做的表现层。我当时还做过ibm portal的开发,ibm的鬼东西就是一大堆的tag ![]() 其实我也不是反对用tag,其实我本人也一直在用,而且我特喜欢自定义标签,加一点自己的个性东西在里面,嘿嘿 ![]() ![]() |
|
返回顶楼 | |
发表时间:2005-05-10
引用 而用了fastm, BEGIN, END 后面都有名字 name。可以直接搜索到。
你用一些xml编辑器,定位会很快,而且格式化也很容易。其实保留xml语法更重要的意义在于保留了结构,可以进行一系列的后续处理,例如通过类似cocoon的xslt管道。 |
|
返回顶楼 | |
发表时间:2005-05-10
canonical 写道 这只是个示范,具体是否使用iframe或者是否使用配置文件是可选的,复杂一点可以是
<portal:page> <c:forEach var="portalColumn" items="${portalPage.Columns}"> <portal:column width="${portalColumn.width}"> <c:forEach var="portalModule" items="${portalColumn.modules}"> <portal:module/> </c:forEach> </portal:column> <portal:dragbar/> </c:forEach> </portal:page> 其实就是对类似my.msn.com的代码的封装,可以动态拖拉 对。:-) 就是这样。 但你看,这里就出现了两层 forEach 逻辑嵌套。 fastm 的写法是这样: <!-- BEGIN DYNAMIC: page --> <!-- BEGIN DYNAMIC: columns --> <!-- BEGIN DYNAMIC: column --> <!-- BEGIN DYNAMIC: module --> <!-- END DYNAMIC: module --> <!-- END DYNAMIC: column --> <!-- BEGIN DYNAMIC: dragbar --> <!-- END DYNAMIC: dragbar --> <!-- END DYNAMIC: columns --> <!-- END DYNAMIC: page --> 这里只是骨架。 实际上,里面会填入HTML Text,这个Layout就能够在browser里面正常显示。 fastm 提倡的就是 所有的HTML Text 资源都放在 Template 里面。Code里面不含有HTML Text。 我做的那个Portal Demo 也是模仿的My MSN。区别就是 fastm 的 layout是 visual editable。 可以在Browser, Dreamweaver 里面看到 运行时期HTML布局风格的真实显示。 我想问一下,你的那些Tag。 <portal:column> <portal:module> <portal:dragbar/> 是否都需要在Code里面输出HTML ? |
|
返回顶楼 | |
发表时间:2005-05-10
引用 <portal:column>
<portal:module> <portal:dragbar/> 是否都需要在Code里面输出HTML ? 我们使用tpl技术,是通过html直接制作的tag, 大概类似于 portal_lib.xml <portal> <column> <c:include src="portal_column.tpl" /> </column> </portal> portal_column.tpl <table> ... <cp:compile src="${tagBody}" /> ... </table> 引用 <!-- BEGIN DYNAMIC: page -->
<!-- BEGIN DYNAMIC: columns --> <!-- BEGIN DYNAMIC: column --> <!-- BEGIN DYNAMIC: module --> <!-- END DYNAMIC: module --> <!-- END DYNAMIC: column --> <!-- BEGIN DYNAMIC: dragbar --> <!-- END DYNAMIC: dragbar --> <!-- END DYNAMIC: columns --> <!-- END DYNAMIC: page --> 可以用tag实现 <portal:page> <portal:columns> <portal:forEachModuleInColumn> <portal:module/> </portal:forEachModuleInCloumn> </portal:columns> </portal:page> |
|
返回顶楼 | |
发表时间:2005-05-10
大家来看看这样的方案
视图模块 <mapmatch pattern="view1"> <mapgenerate src="*.xml"/> <maptransform src="*.xsl"/> <mapserialize type="xml"/> </mapmatch> <mapmatch pattern="view2"> <mapgenerate src="*.xml"/> <maptransform src="*.xsl"/> <mapserialize type="xml"/> </mapmatch> 组合1 2模块 <mapmatch pattern="view3"> <mapaggregate element="*"> <mappart src="cocoon/view1"/> <mappart src="cocoon/view2"/> </mapaggregate> <maptransform src="*.xsl"/> <mapserialize/> </mapmatch> 这样view模块的组合可以是任意的 可以相互调用 理论上不受任何限制. |
|
返回顶楼 | |
发表时间:2005-05-10
canonical 写道 引用 <portal:column>
<portal:module> <portal:dragbar/> 是否都需要在Code里面输出HTML ? 我们使用tpl技术,是通过html直接制作的tag, 大概类似于 portal_lib.xml <portal> <column> <c:include src="portal_column.tpl" /> </column> </portal> portal_column.tpl <table> ... <cp:compile src="${tagBody}" /> ... </table> 你的blog里面。 http://canonical.blogdriver.com/canonical/600295.html 引用 <demo> <!-- 一个简单的tag示例, 直接输出变量。这里demandArgs指定调用时必须提供的变量。 --> <文本框 demandArgs="value" otherArgs="otherValue,onclick" type="simpleTag" > <p> ----------------------------------- </p> <!-- 可以使用调用时提供的其他变量,如otherValue--> <input size="40" type="text" value="${value} * ${otherValue}" onclick="${onclick}"/> <p> -----------------------------------</p> </文本框> <!-- 一个自动分页表格,要求传入headers(List类型)指定表头,pager(Pager类型)提供数据 --> <分页表格 demandArgs="headers,pager"> <!-- 从外部导入tpl文件 --> <c:include src="flex_table.tpl" /> </分页表格> <!-- 一个bodyTag示例: 循环处理thisObj中的变量data中的每一行。 importVars从调用环境中自动导入变量而不需要通过调用参数直接指定。 当然如果调用参数中指定的变量与importVars中指定的变量重复,则调用参数会覆盖importVars. --> <循环data importVars="thisObj" type="bodyTag"> <c:forEach var="row" items="${data}"> <!-- tagBody为调用时标签的内容 --> <cp:compile src="${tagBody}" /> </c:forEach> </循环data> <!-- 一个条件标签的示例. 条件标签一般不应该输出文本,而是返回一个bool值。仅当返回true的时候,调用时标签的内容才会被运行。 --> <当Num足够大 importVars="thisObj" type="conditionTag"> <l:gt name="num" value="3" /> </当Num足够大> </demo> tpl里面也使用了Tag。 那些Tag的实现Code里面,需要输出HTML吗? |
|
返回顶楼 | |
发表时间:2005-05-10
winterwolf 写道 大家来看看这样的方案
视图模块 <map:match pattern="view1"> <map:generate src="*.xml"/> <map:transform src="*.xsl"/> <map:serialize type="xml"/> </map:match> <map:match pattern="view2"> <map:generate src="*.xml"/> <map:transform src="*.xsl"/> <map:serialize type="xml"/> </map:match> 组合1 2模块 <map:match pattern="view3"> <map:aggregate element="*"> <map:part src="cocoon:/view1"/> <map:part src="cocoon:/view2"/> </map:aggregate> <map:transform src="*.xsl"/> <map:serialize/> </map:match> 这样view模块的组合可以是任意的 可以相互调用 理论上不受任何限制. XSL 能够任意操作XML DOM Node。这方面,只有Jivan才能比拟。 不过,Jivan 操作的粒度也只是 XML DOM Node, 元素或者属性。必须整个的替换。 假如,一个Portlet 的 URL 的大部分都是 静态的,只有一两个参数的值 是动态的。 <a href="portal/portlet?column={column}&module={module}" /> 这个时候,Jivan 只能替换设置整个URL,而不能部分替换。 XSL 可以输出任何文本,只是相当于一门 XML Script Language, 没有这种限制。 |
|
返回顶楼 | |
发表时间:2005-05-10
引用 tpl里面也使用了Tag。
那些Tag的实现Code里面,需要输出HTML吗? 通过tpl直接自定义tag, 不需要java代码的参与。当然也可以通过java代码来实现。tpl本身是与网络,与文本输出无关的,我们用tpl来做工作流引擎的配置和执行脚本 |
|
返回顶楼 | |