`
lwz7512
  • 浏览: 331683 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Openlaszlo开发之高级篇-自定义组件

阅读更多

    在laszlo应用开发过程中,大部分编码过程集中在对系统组件的熟练应用,比如取值、传值、刷新组件状态等等。但是很多情况下,尤其是项目的初始编码阶段,需要定义一些满足项目特定要求的界面组件,这就需要自定义组件了。

    自定义组件开发,首先需要对lzx的语法、系统组件结构、开发文档有全面而且深刻的理解,然后通过不断的锻炼,按照由间到繁的实践过程,才能逐渐成为开发高手。

1. 理解组件的基本原理
   原理介绍:类、模型、视图、控制器(MVC)

   1.1 class与组件
      LZX语言是一种面向对象的、基于原型的编程语言,而class是LZX编程语言的核心,使用class你可以生成定制的、可重用的组件来提高代码编写效率。(LZX is an object-oriented, prototype based language that allows you to create custom, reusable classes to streamline and minimize code. Classes are at the heart of LZX programming.)
     下面看看一个简单的class:
      <class name="MyClass" width="80" height="25" bgcolor="#CFD9AB">
         <text align="center" valign="middle">Hello, World!</text>
      </class>
      这就定义了一个简单的class,class在LZX语法中继承自LzView,所以它可以有高度、宽度、背景色等属性。
      在canvas里这样使用它:
      <MyClass name="myFirstInstance"/>
      就是说,把已经定义的类名当作一个标签的名称,放在canvas里就可以了,如果你愿意,可以给它起个实例名比如myFirstInstance,还可以指定它的位置等等。
      (详见Software Engineer's Guide:Chapter 12. Introduction to Classes and Object Oriented Programming)
      这是一个简单的class,但也是一个简单的组件,如果把这个class扩展一下,添加一些属性、事件、数据模型,那么它就可以构成一个可重用的组件。

   1.2 解析LzButton
       一个功能完整的组件应该由3个部分组成:M、V、C
       M: A model that represents the data for the application
       V: The view that is the visual representation of that data.
       C: A controller that takes user input on the view and translates that to changes in the model.
       (引自"A Swing Architecture Overview")
       (http://java.sun.com/products/jfc/tsc/articles/architecture/index.html)
       M表示模型,模型代表着组件的数据内容
       V表示视图,视图代表着组件的视觉形象
       C表示控制器,控制器接收用户输入并对其做出响应

       下面看看一个Openlaszlo系统组件中最常用也是最简单的一个组件:button
       打开C:\Program Files\OpenLaszlo Server 3.3\Server\lps-3.3\lps\components\lz 下面的button.lzx
       会看到3个<include/>标签,这是button组件需要的父类组件。
       接下来的<resource/>是button组件需要的视图资源,大多是flash图片背景。
      
       注意第34行:<class name="button" extends="basebutton" ...这才是组件真正定义的开始。可以看出button继承自父类basebutton,也就是说button的基本行为来自于basebutton,basebutton定义了button组件的基础控制部分,即MVC中的C。
       接下来是一些属性定义:<attribute name="someproperty" value="valuecorresponding"/>name表示属性名称,value是对应的值;
       这些attribute标签是组件需要的属性,这些属性一般都要默认的值,如果需要修改,在使用组件时重载这些属性就可以了。
       接下来这些<method name="".../>代表组件的C,即控制部分。
       最后是<view name=""...,这些代表组件的V,视图部分。前面定义的resource,在这里用到。
       因为按钮组件不需要数据来填充,也就是说它不是用来展现数据,所以就没有M,模型部分。

   1.3 解析List
       list组件和button组件不同的地方在于它有对其内部数据进行操作的部分,即model,M。还是在刚才的目录打开源文件list.lzx,
       在第9行:<class name="list"  extends="baselist"...,可以看出list也是继承自其父类baselist.lzx,即list组件的控制部分。
       当然基础组件的定义,不完全是控制部分,也包含部分模型部分,但是组件的定义则包含了M、V、C三个部分。
      
       比如baselist.lzx中,<method name="getSelection">
                           <method name="getNumItems">
                           <method name="getItemAt" args="index" >
                           <method name="getItem" args="value">
                           <method name="addItem" args="text, value" >
                           <method name="removeItem" args="value" >
                           .....
       这些都是属于数据操作部分,也定义在了父类中,这个没有严格区分。
       而在list.lzx中,数据操作,只定义了<method name="addItem" args="txt, val" >也是重载了父类的方法
       通过super.addItem(txt,val);来重新定义了。

2. 制作一个简单的自定义button
   通过了解系统组件的结构,看来自定义一个组件也不是什么难事了,如何下手做呢,还是找个例子先。
   打开参考文档:http://127.0.0.1:8080/lps-3.3/docs/reference/html-index.html
   找到Base Classes,第一个就是basebutton,点击,查看说明文档和例子,原来这么简单,只要给basebutton加上资源
   就是一个按钮了,那么自己再修改一下不就是自己想要的按钮了吗?
  
   首先,按钮文字是必须要加的,那么需要一个属性来保存文本字符:
   <attribute name="text" type="html" value=""/>
   然后需要一个text组件来显示按钮文字:
   <text name="txt" align="center" valign="middle" resize="true" fgcolor="#333333" text="${parent.text}"/>
   接下来,需要添加鼠标事件,来让按钮上的文字做出点击响应:
   <method event="onmousedown">
          txt.setX(txt.x+1);
          txt.setY(txt.y+1);  
   </method>
   <method event="onmouseup">
          txt.setX(txt.x-1);
          txt.setY(txt.y-1);   
   </method>
   这样就完成了一个具备基本功能的按钮了:
   <class name="mybutton" width="76" height="24" extends="basebutton" resource="longbtn_rsc">
 <attribute name="text" type="html" value=""/>
 <text name="txt" align="center" valign="middle" resize="true" fgcolor="#333333" text="${parent.text}"/>
 <method event="onmousedown">
          txt.setX(txt.x+1);
          txt.setY(txt.y+1);  
 </method>
 <method event="onmouseup">
          txt.setX(txt.x-1);
          txt.setY(txt.y-1);   
 </method>
   </class>
   在canvas里,通过<mybutton name="buttonname" text="clickMe">
                     <handler name="onclick">
                       //do something;
                     </handler>
                   </mybutton>
   就可以使用了。


3. 扩展一个系统组件
   在开发RIA项目时,往往会遇到比较复杂的业务需求,或者大数据量展现等任务,这时,能满足这些任务的组件
   就显得分外重要。笔者在开发第一个任务时,需要在tree组件上进行操作,而这个tree的节点又很多,视图的
   渲染过程往往花费十几秒以上,有时竟然让IE崩溃,郁闷之极。

   幸得网友的指点,找到一个lazytree组件,才解决了这个问题。这是一个扩展了系统tree组件功能的组件,
   它重载了tree节点生成的过程,由原来得一次全部生成,变成逐步生成,大大降低了初始渲染时间。
   <class name="lazytree" extends="tree">
 <!-- Turn off auto-recursion for tree. Get child nodes when tree is opened. -->
 <attribute name="recurse" value="false" type="boolean"/>
 <attribute name="haveChildren" value="false" type="boolean"/>
 <method event="onopen" args="o"><![CDATA[
            // If we already have children, don't fetch them again.
            if (this.haveChildren) return;
            if (o) {
                // Now set recurse to true. This value is used in basetree's
                // createChildTrees() method. See
                // lps/components/base/basetree.lzx for and
                // lps/components/lz/treee.lzx source code.
                this.setAttribute('recurse', true);
                createChildTrees();
                this.setAttribute('recurse', false);
                // We have child nodes.
                this.setAttribute('haveChildren', true);
            }
        ]]></method>
   </class>
   如注释所书,Turn off auto-recursion for tree. Get child nodes when tree is opened,关闭了自动递归过程
   只有当前节点打开时,生成下一级节点。
   由此可见,理解系统组件的结构和原理,是何等重要!

4. 开发高级的自定义组件
   表格是界面开发常用的组件,但是laszlo的grid不够漂亮和精练,所以构建自己的grid就显得必要了。
   以openria网站的资源下载表格为例,需要5列,而且有一列要能提供下载内容的点击操作,经过构思,步骤如下:
  
   第一步:构建表格体包括表头和表体
   <view name="header"...
        <text x="0" text="ID" />
 <text x="40" text="名称" />
 <text x="174" text="描述" />
        <text x="344" text="分类"/>
 <text x="434" text="链接" />
   </view>
   <view name="rowcontainer"...
     <view name="columns"...
        ...
   </view>
   第二步:构建表格头背景和表格体中的行

   表头背景:
   <view name="bg" width="$once{parent.width}"...
   <view name="whitebg" x="1" y="1"...

   动态行:
   <view name="columns" datapath="${parent.datapath}" width="$once{parent.width-2}">
     <simplelayout axis="y" spacing="1"/>
       <view  datapath="*"...
         <text x="0" datapath="@id" width="38"/>
  <text x="40" datapath="@name" width="130"/>
         ...
   </view>
   第三步:添加事件和滚动条
   <text x="434" datapath="@status" width="80" fgcolor="#0000ff">       
          <method event="onclick">
                                                     
          </method> 
          <method event="onmouseover">
                                                   
          </method>
   <method event="onmouseout">
                                                     
          </method>
   </text>
   滚动条:  <scrollbar/>
  
   最后完成的组件代码是:
    <class name="downloadgrid" datapath="" width="510" height="200">
  <view name="bg" width="$once{parent.width}" height="$once{parent.height}" bgcolor="#666666"/>
  <view name="whitebg" x="1" y="1" width="$once{parent.width-2}" height="$once{parent.height-2}" bgcolor="#FFFFFF"/>
  <view name="header" x="1" y="2" width="$once{parent.width-2}" height="18" bgcolor="#87CEFA">
   
   <text x="0" text="ID" />
   <text x="40" text="名称" />
   <text x="174" text="描述" />
   <text x="344" text="分类"/>
   <text x="434" text="链接" />
  </view>
  <view name="rowcontainer" x="1" y="20" datapath="${parent.datapath}" width="$once{parent.width-2}" height="$once{parent.height-22}" clip="true">
   <view name="columns" datapath="${parent.datapath}" width="$once{parent.width-2}">
    <simplelayout axis="y" spacing="1"/>
    <view  datapath="*" width="$once{parent.width}" height="18" bgcolor="#F5F5F5">     
     <text x="0" datapath="@id" width="38"/>
     <text x="40" datapath="@name" width="130"/>
     <text x="174" datapath="@describe" width="166"/>
     <text x="344" datapath="@category" width="76"/>
     <text x="434" datapath="@status" width="80" fgcolor="#0000ff">       
                        <method event="onclick">
                            var hashref = parent.datapath.p.hasAttr('href');
                            if(hashref){
                               var address = parent.datapath.p.getAttr('href');
                               LzBrowser.loadURL(address, '_blank')
                            }                          
                        </method> 
                        <method event="onmouseover">
                           this.setColor(0x000000);                          
                        </method>
                  <method event="onmouseout">
                           this.setColor(0x0000FF);                            
                        </method>    
     </text>
    </view>
   </view>
   <scrollbar/>
  </view>
 </class>
 

5. 总结
  
   组件是laszlo应用的重要组成部分,每次的项目开发都会涉及到组件的开发,而且关系到项目产品的质量和效果,这也是考验一个RIA开发人员水平的重要依据,laszlo的demo中有很多值得研究的组件,网上也有开发人员的作品供大家分享,每次openlaszlo新版本的发布都会有新的组件添加进来,这要感谢众多contributor的慷慨,开源软件正是在这种开放的环境中不断成长起来的,让我们写好laszlo组件,共同促进RIA的发展。
   一年前的今天,我在RIACN上发了一帖,倡导志愿者共同推广openlaszlo技术,到今天为止,开源富客户网络仍然差一部分没能做完,写这篇文章,仅此补偿当初的豪情壮志。


 



分享到:
评论

相关推荐

    openlaszlo-4.9.0-windows-dev-install.part2.rar

    openlaszlo应用程序开发使用的是基于XML的LZX语言,它可以被编译成DHMTL,SWF等格式。...openlaszlo-4.9.0-windows-dev-install.part1.rar openlaszlo-4.9.0-windows-dev-install.part2.rar 下载完成后一起解压。

    openlaszlo-4.9.0-windows-dev-install.part1.rar

    openlaszlo应用程序开发使用的是基于XML的LZX语言,它可以被编译成DHMTL,SWF等格式。...openlaszlo-4.9.0-windows-dev-install.part1.rar openlaszlo-4.9.0-windows-dev-install.part2.rar 下载完成后一起解压。

    openlaszlo-4.7.3-windows-dev-install (1).exe

    openlaszlo应用程序开发使用的是基于XML的LZX语言,它可以被编译成DHMTL,SWF等格式。 是openmeetings视频会议系统的默认开发编译工具。

    OpenLaszlo-SAMSIG-05.ppt

    ### OpenLaszlo:领先的开源富互联网应用开发平台 #### 一、项目概述与历史 OpenLaszlo 是一个开放源代码平台,旨在为全球范围内的互联网提供丰富的应用程序开发及交付服务。它由 Laszlo Systems 公司于 2001 年...

    openlaszlo本地帮助文档

    不过,对于寻求跨平台、高度自定义和轻量级解决方案的开发者来说,OpenLaszlo是一个值得考虑的选择。 遗憾的是,提供的压缩包文件列表中没有具体的手册文件,无法深入探讨手册中的具体内容。若能将手册转换为CHM或...

    Applet & Openlaszlo

    Applet和Openlaszlo是两个在Web开发领域中用于创建动态、交互式用户体验的技术。本文将深入探讨这两个概念以及它们之间的通信机制。 首先,Applet是Java编程语言的一个组成部分,它允许开发者创建可以在Web浏览器中...

    Openlaslzo+jsf

    - **步骤3**:重启Tomcat服务器后,会发现在`webapps`目录下新增了一个名为`openlaszlo-3.3.3-servlet`的文件夹。这意味着OpenLaszlo已经成功部署到了Tomcat服务器上。 ##### 2.2 运行示例LZX文件 - 在浏览器中...

    OpenLaszlo —— 一个快速构建和部署富 Internet 应用程序的平台

    OpenLaszlo —— 一个快速构建和部署富 Internet 应用程序的平台 -- Linux,C,C++,Java,Ajax,XML,perl,php,python,ruby,MySQL,Gnome,KDE,Qt,Gtk,bash,shell,嵌入式,网络,信息安全,操作系统,数据结构,编译原理

    openlaszlo计算器

    这是用Openlaszlo开发的计算器程序,可以实现基本的计算操作。 我是刚学openlaszlo,欢迎朋友们提出宝贵意见!

    改造OpenMeetings成为Flash视频会议室(三)

    1. **类的继承、定义与使用**:在OpenLaszlo中,可以创建自定义组件并实现继承,以便重用和扩展已有组件的功能。 2. **事件与触发**:OpenLaszlo支持事件驱动编程,允许组件之间通过事件进行通信,如点击按钮触发...

    Laszlo技术手册续

    2. **配置步骤**:首先,下载OpenLaszlo Server的servlet文件(如openlaszlo-3.3.3-servlet.war),将其解压并放入Tomcat的webapps目录下。启动Tomcat后,LPS会被自动部署。接着,可以创建LZX文件并进行测试。 **...

    Laszlo与web工程

    - 首先,你需要下载 OpenLaszlo Server 的servlet包,例如 `openlaszlo-3.3.3-servlet.war`,并将它部署到Tomcat的 `webapps` 目录下。 - 启动Tomcat后,会自动解压war文件,并创建一个名为 `openlaszlo-3.3.3-...

    OpenLaszlo-开源

    OpenLaszlo的社区是其成功的关键因素之一。开发者可以在论坛上讨论问题,共享代码片段,甚至合作开发新的功能或模块。此外,OpenLaszlo的API文档和教程为初学者提供了良好的学习资源,帮助他们快速上手并开始开发...

    论文研究-使用OpenLaszlo构建J2EE中的RIA程序 .pdf

    使用OpenLaszlo构建J2EE中的RIA程序,高春阳,龚群侃,当前,Web 应用程序就要进入了一个新的时期,富互联网客户端(RIA ,Rich Internet Application) 以其极大地用户交互性、优秀的外观设计、良好��

    Flex4CookBook.

    Flex 4的核心改进之一是Spark组件模型,它取代了原有的MX组件模型。Spark组件提供了更灵活的布局管理,允许开发者创建更加复杂和自定义的用户界面。此外,Spark组件还强调了样式和外观的分离,使得UI设计和代码逻辑...

    openMeetings二次开发高手的七篇文章

    PhMeetings是基于开源WEB视频会议系统OpenMeetings开发的一个实验性...由于资料的缺乏以及对OpenLaszlo编程的陌生,其中艰辛不足为外人道。今日发一声感慨:如果你想折磨一个程序员,那就让他去干开源软件的二次开发!

    spket1.6.18

    "Spket1.6.18"是一款专为JavaScript和OpenLaszlo开发的智能代码提示工具,它作为Eclipse集成开发环境(IDE)的插件,极大地提升了开发者的工作效率。这款工具的主要功能是为JavaScript和OpenLaszlo语言提供语法高亮...

Global site tag (gtag.js) - Google Analytics