论坛首页 Web前端技术论坛

关于表现层UI设计的一点点见解,欢迎大家讨论。

浏览 33532 次
该帖已经被评为精华帖
作者 正文
   发表时间: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的代码的封装,可以动态拖拉
0 请登录后投票
   发表时间: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。可以直接搜索到。
0 请登录后投票
   发表时间:2005-05-10  
呵呵,dlee说的就是xhtml啊,恩,这个东东以后可能会流行起来,现在很多blog不都是用它的么,好处非常明显,就不多说了,但是缺点给人的感觉就是太麻烦了,主要是利用css来进行排版,这可要一定的功底哦。而且要求美工必须是js高手,这显然不太现实,所以就又要加一个中间的页面转换师,这和前面用tag相差不多。也许是html的简单在人们心中已经根深蒂固,我曾经尝试过碰这个东东,但是最终还是发现用table来定位来的简单,虽然现在普遍反对利用table来排版。而且其实对页面的控制大部分都交给了js+css,给我的感觉是以css为主,js为辅,但是这样的话,css达到个几十K是非常平常的事情,我就曾经见到过50K的css ,这样的话,要是改个风格的话,页面调试又变成了一个苦力活,估计没人喜欢做。MSN的网站就是用了几十套风格,我一共down下来30多个css文件,每个都超过30k,我真是不知道这些文件当时是怎么写出来的,实在是太强悍了。不过我到蛮喜欢利用xhtml+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,其实我本人也一直在用,而且我特喜欢自定义标签,加一点自己的个性东西在里面,嘿嘿 
0 请登录后投票
   发表时间:2005-05-10  
引用
而用了fastm, BEGIN, END 后面都有名字 name。可以直接搜索到。

你用一些xml编辑器,定位会很快,而且格式化也很容易。其实保留xml语法更重要的意义在于保留了结构,可以进行一系列的后续处理,例如通过类似cocoon的xslt管道。
0 请登录后投票
   发表时间: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 ?
0 请登录后投票
   发表时间: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>
0 请登录后投票
   发表时间:2005-05-10  
大家来看看这样的方案

视图模块
&lt;mapmatch pattern="view1"&gt;
     &lt;mapgenerate src="*.xml"/&gt;
     &lt;maptransform  src="*.xsl"/&gt;
    &lt;mapserialize type="xml"/&gt;
&lt;/mapmatch&gt;

   &lt;mapmatch pattern="view2"&gt;
     &lt;mapgenerate src="*.xml"/&gt;
     &lt;maptransform  src="*.xsl"/&gt;
    &lt;mapserialize type="xml"/&gt;
   &lt;/mapmatch&gt;

组合1 2模块
&lt;mapmatch pattern="view3"&gt;
  &lt;mapaggregate element="*"&gt;
    &lt;mappart src="cocoon/view1"/&gt;
    &lt;mappart src="cocoon/view2"/&gt;
  &lt;/mapaggregate&gt;
  &lt;maptransform src="*.xsl"/&gt;
  &lt;mapserialize/&gt;
&lt;/mapmatch&gt;

这样view模块的组合可以是任意的 可以相互调用 理论上不受任何限制.
0 请登录后投票
   发表时间: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吗?
0 请登录后投票
   发表时间:2005-05-10  
winterwolf 写道
大家来看看这样的方案

视图模块
&lt;map:match pattern="view1"&gt;
     &lt;map:generate src="*.xml"/&gt;
     &lt;map:transform  src="*.xsl"/&gt;
    &lt;map:serialize type="xml"/&gt;
&lt;/map:match&gt;

   &lt;map:match pattern="view2"&gt;
     &lt;map:generate src="*.xml"/&gt;
     &lt;map:transform  src="*.xsl"/&gt;
    &lt;map:serialize type="xml"/&gt;
   &lt;/map:match&gt;

组合1 2模块
&lt;map:match pattern="view3"&gt;
  &lt;map:aggregate element="*"&gt;
    &lt;map:part src="cocoon:/view1"/&gt;
    &lt;map:part src="cocoon:/view2"/&gt;
  &lt;/map:aggregate&gt;
  &lt;map:transform src="*.xsl"/&gt;
  &lt;map:serialize/&gt;
&lt;/map:match&gt;

这样view模块的组合可以是任意的 可以相互调用 理论上不受任何限制.


XSL 能够任意操作XML DOM Node。这方面,只有Jivan才能比拟。

不过,Jivan 操作的粒度也只是 XML DOM Node,  元素或者属性。必须整个的替换。
假如,一个Portlet 的 URL 的大部分都是 静态的,只有一两个参数的值 是动态的。
&lt;a href="portal/portlet?column={column}&module={module}" /&gt;
这个时候,Jivan 只能替换设置整个URL,而不能部分替换。

XSL 可以输出任何文本,只是相当于一门 XML Script Language, 没有这种限制。
0 请登录后投票
   发表时间:2005-05-10  
引用
tpl里面也使用了Tag。
那些Tag的实现Code里面,需要输出HTML吗?

通过tpl直接自定义tag, 不需要java代码的参与。当然也可以通过java代码来实现。tpl本身是与网络,与文本输出无关的,我们用tpl来做工作流引擎的配置和执行脚本
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics