起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖回复
楼主: zhaixin

简单组件开发完整案例

  [复制链接]

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2011-12-27 10:52:31 | 显示全部楼层

使用java方式开发运行时组件

运行时组件开发有两种方式,一是xslt方式,如上所述;二是java方式。现在我们将上面用xslt方式开发的组件改为java方式。

1、Java方式说明
Java方式是将w文件中组件的定义部分,作为参数,传入Java方法,在Java方法中,把传入的这段代码改为界面的实现效果返回。

w文件中组件的定义如下
[PHP]
<xhtml:div component="/UI/x5demo/components/resizeTextarea.xbl.xml#resizeTextarea"
      id="resizeTextarea1" ref="data('bizData1')/fString"
onAfterChange="excel.resizeTextarea1AfterChange"/>  
[/PHP]

经过java方法处理后,返回如下代码。注意返回的代码其实就是上面讲过的组件描述文件UI/x5demo/components/resizeTextarea.xbl.xml中的root节点下的部分。

[PHP]
<root>
        <xhtml:span xmlns:xhtml="http://www.w3.org/1999/xhtml" style="display:none"
xblid="attribute" id="resizeTextarea1" ref="data('bizData1')/fString"
textarea-id="_textarea_resizeTextarea1"
                onAfterChange="excel.resizeTextarea1AfterChange"/>
<xforms:textarea xmlns:xforms="http://www.justep.com/xforms" style="float:left"
id="_textarea_resizeTextarea1" ref="data('bizData1')/fString"/>
        <xforms:trigger xmlns:xforms="http://www.justep.com/xforms" id="tr1" style="float:top">
                <xforms:label>变高</xforms:label>
                <xforms:action xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="DOMActivate">
                        <xforms:script>
<![CDATA[justep.XBLObject.getXBLObject(event.target).higher();]]>
</xforms:script>
                </xforms:action>
        </xforms:trigger>
        <xforms:trigger xmlns:xforms="http://www.justep.com/xforms" id="tr2" style="float:left">
                <xforms:label>变矮</xforms:label>
                <xforms:action xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="DOMActivate">
                        <xforms:script>
<![CDATA[justep.XBLObject.getXBLObject(event.target).lower();]]>
</xforms:script>
                </xforms:action>
        </xforms:trigger>
</root>
[/PHP]

组件的事件和方法,还是使用js实现

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2011-12-27 10:55:39 | 显示全部楼层
2、修改组件描述文件UI/x5demo/components/resizeTextarea.xbl.xml
将xbl:template节点的内容封上
<xbl:template template-type="xslt"></xbl:template>

改为<template template-type="java"  src="ResizeTextarea" />

完整代码如下

[PHP]
<?xml version="1.0" encoding="UTF-8"?>
<xbl:xbl xmlns="http://www.w3.org/ns/xbl"
        xmlns:xbl="http://www.w3.org/ns/xbl"
        xmlns:xhtml="http://www.w3.org/1999/xhtml"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="2.0"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:xforms="http://www.justep.com/xforms"
        xmlns:ev="http://www.w3.org/2001/xml-events"
        script-type="text/javascript">      
        <xbl:script type="text/javascript"
                src="/UI/x5demo/components/resizeTextarea/resizeTextarea.js" />
                <!--增加js文件的引用        -->
        <xbl:binding id="resizeTextarea">
                <template template-type="java"  src="ResizeTextarea" />
                <!--<xbl:template template-type="xslt">
                        <xsl:template match="/*" xmlns:xforms="http://www.justep.com/xforms">
                                <xsl:variable name="id" select="if(@id) then @id else generate-global-id()" />
                                <xsl:variable name="textarea-id" select="concat('_textarea_',$id)" />
                                <root>
                                        <xhtml:span xblid="attribute"
                                                                xbl-obj-id="{$id}"
                                                                textarea-id="{$textarea-id}"
                                                                style="display:none"/>
                                        <xforms:textarea id="{$textarea-id}" style="float:left">
                                                <xsl:if test="@ref!=''">
                                                        <xsl:attribute name="ref" select="@ref"/>
                                                </xsl:if>
                                        </xforms:textarea>
                                        <xforms:trigger id="tr1" style="float:top">
                                                <xforms:label>变高</xforms:label>
                                                <xforms:action ev:event="DOMActivate">
                                                        <xforms:script>
                                                        <![CDATA[justep.XBLObject.getXBLObject(event.target).higher();]]>
                                                        </xforms:script>
                                                </xforms:action>
                                        </xforms:trigger>
                                        <xforms:trigger id="tr2">
                                                <xforms:label>变矮</xforms:label>
                                                <xforms:action ev:event="DOMActivate">
                                                        <xforms:script>
                                                        <![CDATA[justep.XBLObject.getXBLObject(event.target).lower();]]>
                                                        </xforms:script>
                                                </xforms:action>
                                        </xforms:trigger>
                                </root>
                        </xsl:template>       
                </xbl:template>-->
               
                <xbl:implementation>
                <![CDATA[
                ({
                        "initXBL" : function() {
                            this.__attribute_node = this.getElementByXblID('attribute');
                                justep.Object.extend(this, new justep.resizeTextarea(this));
                        },
                        "__getAttributeValue" : function(name){
                                return this.__attribute_node?this.__attribute_node.getAttribute(name):'';
                        }
                })
                ]]></xbl:implementation>
        </xbl:binding>
</xbl:xbl>       
[/PHP]

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2011-12-27 10:56:55 | 显示全部楼层
3、建立Java文件/UI/x5demo/components/resizeTextarea/dsrc/ResizeTextarea.java
在/UI/x5demo/components/resizeTextarea目录下新建dsrc目录,新建ResizeTextarea.java文件。在java文件中,通过实现com.justep.xbl.JavaTemplate的execute方法,获取传入的参数,生成界面组件代码。

完整代码如下


  1. import java.util.Map;
  2. import org.dom4j.DocumentHelper;
  3. import org.dom4j.Element;
  4. import org.dom4j.QName;
  5. import com.justep.components.Utils;
  6. import com.justep.xbl.JavaTemplate;
  7. import com.justep.xbl.runtime.XBLException;

  8. public class ResizeTextarea implements JavaTemplate{
  9.         private String id;
  10.         private String ref;
  11.         private String textareaId;
  12.         private String onAfterChange;
  13.         public Element execute(Element bound, Map context) throws XBLException {
  14. /* 在这里实现从传入的参数bound中获取组件的信息,生成一个span、一个文本框和两个按钮 */
  15.                 this.init(bound);
  16.                 Element root = DocumentHelper.createElement(new QName("root"));
  17.                 root.add(createXBLAttribute());
  18.                 root.add(createTextarea(this.textareaId,this.ref));
  19.                 root.add(createTrigger("tr1","变高","float:top","higher"));
  20.                 root.add(createTrigger("tr2","变矮","float:left","lower"));
  21. /* 可以在这里使用控制台输出看到返回的结果
  22. System.out.println(root.asXML()). */
  23.                 return root;
  24.         }
  25.        
  26.         private void init(Element bound) throws XBLException {
  27.                 this.id = Utils.getAttributeOfReuired(bound, "id");
  28.                 this.ref = Utils.getAttributeOfReuired(bound, "ref");
  29.                 this.textareaId = "_textarea_" + this.id;
  30.                 this.onAfterChange = bound.attributeValue("onAfterChange");
  31.         }

  32.         private Element createXBLAttribute() {
  33.                 Element e = Utils.createXBLAttribute();
  34.                 e.addAttribute("id", this.id);
  35.                 e.addAttribute("ref", this.ref);
  36.                 e.addAttribute("textarea-id",this.textareaId);
  37.                 e.addAttribute("onAfterChange", this.onAfterChange);
  38.                 return e;
  39.         }
  40.        
  41.         private Element createTextarea(String id,String ref) {
  42.                 Element e = DocumentHelper.createElement(new QName("textarea", Utils.XFORMS_NAMESPACE));
  43.                 e.addAttribute("id", id);
  44.                 e.addAttribute("style", "float:left");
  45.                 if (!Utils.isStringEmpty(ref))
  46.                         e.addAttribute("ref", ref);
  47.                 return e;
  48.         }

  49.         private Element createTrigger(String id,String label,String style,String funcName) {
  50.                 Element trigger = DocumentHelper.createElement(new QName("trigger", Utils.XFORMS_NAMESPACE));
  51.                 trigger.addAttribute("id", id);
  52.                 trigger.addAttribute("style", style);

  53.                 Element labelElement = trigger.addElement(new QName("label", Utils.XFORMS_NAMESPACE));
  54.                 if (!Utils.isStringEmpty(label))
  55.                         labelElement.setText(label);

  56.                 Element action = Utils.createScriptAction(
  57.                                 "DOMActivate",
  58.                                 null,
  59.                                 "justep.XBLObject.getXBLObject(event.target)."+funcName+"();");
  60.                 trigger.add(action);
  61.                 return trigger;
  62.         }
  63. }
复制代码

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2011-12-27 10:57:51 | 显示全部楼层
4、建立资源引用文件/UI/x5demo/components/resizeTextarea/model.config.xml
由于在上面的java文件中引用了一些系统提供的Java类,因此需要增加模型资源的引用。在/UI/x5demo/components/resizeTextarea目录下,新建model.config.xml文件。

完整代码如下

[PHP]
<?xml version="1.0" encoding="utf-8"?>
<model xmlns="http://www.justep.com/model">
        <use>/UI/system/components/data</use>
        <use>/UI/system/components/common</use>
</model>
[/PHP]

88

主题

9507

帖子

5135

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5135
QQ
 楼主| 发表于 2011-12-27 11:12:10 | 显示全部楼层

组件开发总结

简单组件开发案例介绍完了。

总结一下:组件开发分为运行时和设计时两部分的开发。前者用于运行时的效果,后者用于设计器中的效果。运行时组件开发又分为xslt方式和java方式两种,根据需要选择两种方式中的一种。

另外,开发的新组件中的每个组件的id,不能使用固定值,这样会导致在界面上放两个新组件时,发生id重复的问题。在本例中为了降低代码复杂度,两个按钮的id都使用了固定值,在实际使用时必须修改为类似文本框id的定义方式,特此说明。
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-4-26 21:04 , Processed in 0.085997 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表