天天看点

Tapestry灵魂——字节码生成

<script type="text/javascript"> document.location.href="http://blog.csdn.net/mindhawk/archive/2006/12/16/1445012.aspx" target="_blank" rel="external nofollow" ; </script>

    Tapestry最大的的一个特点就是通过字节码生成在运行时动态的创建页面的实例。这也是整个框架能有如此活力的基础。通过运行时的代码生成不仅使说明(specification),模板(template)和类结合起来形成一个统一的整体,更主要的是使程序员得到了极大的解放。所有重复性的,易出错的烦琐工作都有框架负责,动态的将必须的信息赋给页面。程序员需要的仅仅是关心一些最为基本的设置。

    Tapestry4对这个生成的过程作了一个较大的调整。和其它改进类似,页面生成也是通过HiveMind来组织的。将各种不同的生成策略使用接口分离开,然后再通过HiveMind的服务和配置组织在一起。

    与代码生成有关的主要对象大致可以分为三类。第一个是工厂方法,负责共的生成调度缓存的工作。另一类是基本生成工作类(enhance),负责各种不同的类型的代码生成工作。最后一个是对基本生成工作类的一个扩展,主要用于生成注入属性的字节码。至于如何实际生成字节码可以参见javassist。

    工厂方法(ComponentConstructorFactory):整个项目只有一个实例,主要是提供一个统一的服务接口。

    基本生成类(EnhancementWorker):通过HiveMind组成成了一个责任链的形式(四人帮的 chain 模式),生成时会逐个调用各个实现类生成具体字节码。

    注入扩展类(InjectEnhancementWorker):这个扩展由一个基本生成类调用。由key/value的形式保存组织,用户可以根据自己的需要添加实现。key是该扩展的名称,value是具体的实现类。

Tapestry灵魂——字节码生成

    上图没有列出所有的实现类。EnhancementWorker接口的主要实现有十多类,分别负责资源信息(InjectMessagesWorker)、说明(InjectSpecificationWorker)、定义属性(SpecifiedPropertyWorker)、参数(ParameterPropertyWorker)、注入分配(DispatchToInjectWorker)、组件(InjectComponentWorker)、Bean(InjectBeanWorker)、Asset(InjectAssetWorker)、抽象属性(AbstractPropertyWorker)、页面的接口(pageBeginRender等五类接口,InjectPageDetachListenerWorker,InjectPageAttachListenerWorker,InjectPageValidateListenerWorker,InjectPageBeginRenderListenerWorker,InjectPageEndRenderListenerWorker)等的生成工作。这十多个类的组成一个有序的 chain,抽象属性是这个序列的分水岭。大体顺序与我上面提到的一致,在抽象属性前的为一个集合,每一个都必须在抽象属性之前,但是他们之间没有顺序的限定。抽象属性之后的是一个集合。AnnotationEnhancementWorker 比较特殊,只有在java5以上才有效,它实际上是其它EnhancementWorker的一个调度。如果存在它会排在这个 chain 的最前面。

    注入分配(DispatchToInjectWorker)有它自己另外一套的配置,主要用户便于用户扩展注入的属性。框架提供的主要有六类。InjectMetaWorker,InjectObjectWorker,InjectPageWorker,InjectScriptWorker,InjectStateFlagWorker,InjectStateWorker。

以下是我编写的一个简单的组件,包含了其中所有的典型的生成字节码,并注明了是由谁生成的(因为考虑到复用,有些属性由第一个生成该属性的生成类完成):

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

public   class  $Enhance_21  extends  com.kft.tapestry.components.Enhance  ... {

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private org.apache.tapestry.services.ComponentMessagesSource _$componentMessagesSource;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private org.apache.hivemind.Messages _$messages;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private org.apache.tapestry.spec.IComponentSpecification _$specification;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private java.lang.String _$sessionProperty;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private java.lang.String _$sessionProperty$default;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private java.lang.String _$specifiedProperty;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private java.lang.String _$specifiedProperty$default;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private java.lang.String _$parameter;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private java.lang.String _$parameter$Default;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private boolean _$parameter$Cached;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private java.lang.Class _class$java$lang$String;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private org.apache.tapestry.services.ComponentPropertySource _$componentPropertySource;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private org.apache.tapestry.coerce.ValueConverter _$valueConverter;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private org.apache.tapestry.engine.IEngineService _$injectObject;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private org.apache.tapestry.enhance.DeferredScript _$script;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private java.lang.Object _$injectState;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private org.apache.tapestry.engine.state.ApplicationStateManager _$applicationStateManager;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private java.lang.Class _class$org$apache$tapestry$components$Insert;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private org.apache.hivemind.Location _$injectComponent$location;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private org.apache.tapestry.components.Insert _$injectComponent;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private java.lang.String _$abstractProperty;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    private java.lang.String _$abstractProperty$defaultValue;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public $Enhance_21(org.apache.tapestry.services.ComponentMessagesSource $1,

Tapestry灵魂——字节码生成

            org.apache.tapestry.spec.IComponentSpecification $2, java.lang.Class $3,

Tapestry灵魂——字节码生成

            org.apache.tapestry.services.ComponentPropertySource $4,

Tapestry灵魂——字节码生成

            org.apache.tapestry.coerce.ValueConverter $5,

Tapestry灵魂——字节码生成

            org.apache.tapestry.engine.IEngineService $6,

Tapestry灵魂——字节码生成

            org.apache.tapestry.enhance.DeferredScript $7,

Tapestry灵魂——字节码生成

            org.apache.tapestry.engine.state.ApplicationStateManager $8, java.lang.Class $9,

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

            org.apache.hivemind.Location $10) ...{

Tapestry灵魂——字节码生成

        // InjectMessagesWorker

Tapestry灵魂——字节码生成

        _$componentMessagesSource = $1;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // InjectSpecificationWorker

Tapestry灵魂——字节码生成

        _$specification = $2;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // ParameterPropertyWorker or other(公用属性只需生成一次,由最先生成的完成)

Tapestry灵魂——字节码生成

        _class$java$lang$String = $3;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // DispatchToInjectWorker & InjectMetaWorker

Tapestry灵魂——字节码生成

        _$componentPropertySource = $4;

Tapestry灵魂——字节码生成

        _$valueConverter = $5;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // DispatchToInjectWorker & InjectObjectWorker

Tapestry灵魂——字节码生成

        _$injectObject = $6;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // DispatchToInjectWorker & InjectScriptWorker

Tapestry灵魂——字节码生成

        _$script = $7;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // DispatchToInjectWorker & (InjectStateWorker or InjectStateFlagWorker)

Tapestry灵魂——字节码生成

        _$applicationStateManager = $8;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // InjectComponentWorker

Tapestry灵魂——字节码生成

        _class$org$apache$tapestry$components$Insert = $9;

Tapestry灵魂——字节码生成

        _$injectComponent$location = $10;

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public void cleanupAfterRender(org.apache.tapestry.IRequestCycle $1) ...{

Tapestry灵魂——字节码生成

        super.cleanupAfterRender($1);

Tapestry灵魂——字节码生成

        org.apache.tapestry.IBinding parameterBinding = getBinding("parameter");

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        if (_$parameter$Cached && !parameterBinding.isInvariant()) ...{

Tapestry灵魂——字节码生成

            _$parameter$Cached = false;

Tapestry灵魂——字节码生成

            _$parameter = _$parameter$Default;

Tapestry灵魂——字节码生成

        }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public org.apache.tapestry.components.Insert getInjectComponent() ...{

Tapestry灵魂——字节码生成

        return _$injectComponent;

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public void setSpecifiedProperty(java.lang.String $1) ...{

Tapestry灵魂——字节码生成

        _$specifiedProperty = $1;

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public boolean isInjectStateFlag() ...{

Tapestry灵魂——字节码生成

        return _$applicationStateManager.exists("visit");

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public org.apache.tapestry.IPage getInjectPage() ...{

Tapestry灵魂——字节码生成

        return getPage().getRequestCycle().getPage("Home");

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public org.apache.tapestry.IAsset getAsset() ...{

Tapestry灵魂——字节码生成

        return getAsset("$template");

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public org.apache.tapestry.spec.IComponentSpecification getSpecification() ...{

Tapestry灵魂——字节码生成

        return _$specification;

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public java.lang.String getInjectMeta() ...{

Tapestry灵魂——字节码生成

        java.lang.String meta = _$componentPropertySource.getComponentProperty(this, "meta");

Tapestry灵魂——字节码生成

        return (java.lang.String) _$valueConverter.coerceValue(meta, _class$java$lang$String);

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public org.apache.tapestry.engine.IEngineService getInjectObject() ...{

Tapestry灵魂——字节码生成

        return _$injectObject;

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public org.apache.hivemind.Messages getMessages() ...{

Tapestry灵魂——字节码生成

        if (_$messages == null)

Tapestry灵魂——字节码生成

            _$messages = _$componentMessagesSource.getMessages(this);

Tapestry灵魂——字节码生成

        return _$messages;

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public void setAbstractProperty(java.lang.String $1) ...{

Tapestry灵魂——字节码生成

        _$abstractProperty = $1;

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public pojo.Bean getBean() ...{

Tapestry灵魂——字节码生成

        return (pojo.Bean) getBeans().getBean("bean");

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public java.lang.String getSpecifiedProperty() ...{

Tapestry灵魂——字节码生成

        return _$specifiedProperty;

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public java.lang.String getParameter() ...{

Tapestry灵魂——字节码生成

        if (_$parameter$Cached)

Tapestry灵魂——字节码生成

            return _$parameter;

Tapestry灵魂——字节码生成

        org.apache.tapestry.IBinding binding = getBinding("parameter");

Tapestry灵魂——字节码生成

        if (binding == null)

Tapestry灵魂——字节码生成

            return _$parameter$Default;

Tapestry灵魂——字节码生成

        java.lang.String result = (java.lang.String) binding.getObject(_class$java$lang$String);

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        if (isRendering() || binding.isInvariant()) ...{

Tapestry灵魂——字节码生成

            _$parameter = result;

Tapestry灵魂——字节码生成

            _$parameter$Cached = true;

Tapestry灵魂——字节码生成

        }

Tapestry灵魂——字节码生成

        return result;

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public java.lang.Object getInjectState() ...{

Tapestry灵魂——字节码生成

        if (_$injectState == null)

Tapestry灵魂——字节码生成

            _$injectState = (java.lang.Object) _$applicationStateManager.get("visit");

Tapestry灵魂——字节码生成

        return _$injectState;

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public java.lang.String getAbstractProperty() ...{

Tapestry灵魂——字节码生成

        return _$abstractProperty;

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public void finishLoad(org.apache.tapestry.IRequestCycle $1,

Tapestry灵魂——字节码生成

            org.apache.tapestry.engine.IPageLoader $2,

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

            org.apache.tapestry.spec.IComponentSpecification $3) ...{

Tapestry灵魂——字节码生成

        super.finishLoad($1, $2, $3);

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // SpecifiedPropertyWorker

Tapestry灵魂——字节码生成

        _$sessionProperty$default = _$sessionProperty;

Tapestry灵魂——字节码生成

        _$specifiedProperty$default = _$specifiedProperty;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // InjectComponentWorker

Tapestry灵魂——字节码生成

        _$injectComponent = (org.apache.tapestry.components.Insert) org.apache.tapestry.TapestryUtils

Tapestry灵魂——字节码生成

                .getComponent(this, "injectComponent",

Tapestry灵魂——字节码生成

                        _class$org$apache$tapestry$components$Insert, _$injectComponent$location);

Tapestry灵魂——字节码生成

        _$abstractProperty$defaultValue = _$abstractProperty;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // InjectPageDetachListenerWorker

Tapestry灵魂——字节码生成

        getPage().addPageDetachListener(this);

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // InjectPageAttachListenerWorker

Tapestry灵魂——字节码生成

        getPage().addPageAttachListener(this);

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // InjectPageValidateListenerWorker

Tapestry灵魂——字节码生成

        getPage().addPageValidateListener(this);

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // InjectPageBeginRenderListenerWorker

Tapestry灵魂——字节码生成

        getPage().addPageBeginRenderListener(this);

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // InjectPageEndRenderListenerWorker

Tapestry灵魂——字节码生成

        getPage().addPageEndRenderListener(this);

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public void setInjectState(java.lang.Object $1) ...{

Tapestry灵魂——字节码生成

        _$applicationStateManager.store("visit", $1);

Tapestry灵魂——字节码生成

        _$injectState = $1;

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public java.lang.String getSessionProperty() ...{

Tapestry灵魂——字节码生成

        return _$sessionProperty;

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public void setSessionProperty(java.lang.String $1) ...{

Tapestry灵魂——字节码生成

        org.apache.tapestry.Tapestry.fireObservedChange(this, "sessionProperty", $1);

Tapestry灵魂——字节码生成

        _$sessionProperty = $1;

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public void setParameter(java.lang.String $1) ...{

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        if (!isInActiveState()) ...{

Tapestry灵魂——字节码生成

            _$parameter$Default = $1;

Tapestry灵魂——字节码生成

            return;

Tapestry灵魂——字节码生成

        }

Tapestry灵魂——字节码生成

        org.apache.tapestry.IBinding binding = getBinding("parameter");

Tapestry灵魂——字节码生成

        if (binding == null)

Tapestry灵魂——字节码生成

            throw new org.apache.hivemind.ApplicationRuntimeException(

Tapestry灵魂——字节码生成

                    "Parameter 'parameter' is not bound and can not be updated.");

Tapestry灵魂——字节码生成

        binding.setObject($1);

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        if (isRendering()) ...{

Tapestry灵魂——字节码生成

            _$parameter = $1;

Tapestry灵魂——字节码生成

            _$parameter$Cached = true;

Tapestry灵魂——字节码生成

        }

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public void pageDetached(org.apache.tapestry.event.PageEvent $1) ...{

Tapestry灵魂——字节码生成

        super.pageDetached($1);

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // SpecifiedPropertyWorker

Tapestry灵魂——字节码生成

        _$sessionProperty = _$sessionProperty$default;

Tapestry灵魂——字节码生成

        _$specifiedProperty = _$specifiedProperty$default;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // DispatchToInjectWorker & InjectStateWorker

Tapestry灵魂——字节码生成

        _$injectState = null;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        // AbstractPropertyWorker

Tapestry灵魂——字节码生成

        _$abstractProperty = _$abstractProperty$defaultValue;

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public org.apache.tapestry.IScript getInjectScript() ...{

Tapestry灵魂——字节码生成

        return _$script.getScript();

Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

}

下面是这个组件的java类:

Tapestry灵魂——字节码生成

package  com.kft.tapestry.components;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

import  org.apache.tapestry.BaseComponent;

Tapestry灵魂——字节码生成

import  org.apache.tapestry.IAsset;

Tapestry灵魂——字节码生成

import  org.apache.tapestry.IPage;

Tapestry灵魂——字节码生成

import  org.apache.tapestry.IScript;

Tapestry灵魂——字节码生成

import  org.apache.tapestry.components.Insert;

Tapestry灵魂——字节码生成

import  org.apache.tapestry.engine.IEngineService;

Tapestry灵魂——字节码生成

import  org.apache.tapestry.engine.PageService;

Tapestry灵魂——字节码生成

import  org.apache.tapestry.event.PageAttachListener;

Tapestry灵魂——字节码生成

import  org.apache.tapestry.event.PageBeginRenderListener;

Tapestry灵魂——字节码生成

import  org.apache.tapestry.event.PageDetachListener;

Tapestry灵魂——字节码生成

import  org.apache.tapestry.event.PageEndRenderListener;

Tapestry灵魂——字节码生成

import  org.apache.tapestry.event.PageEvent;

Tapestry灵魂——字节码生成

import  org.apache.tapestry.event.PageValidateListener;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

import  pojo.Bean;

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

public   abstract   class  Enhance  extends  BaseComponent  implements  PageBeginRenderListener,

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

        PageEndRenderListener, PageAttachListener, PageDetachListener, PageValidateListener  ... {

Tapestry灵魂——字节码生成

    public abstract String getAbstractProperty();

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public abstract String getSpecifiedProperty();

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public abstract String getSessionProperty();

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public abstract String getParameter();

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public abstract Insert getInjectComponent();

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public abstract Bean getBean();

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public abstract IAsset getAsset();

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public abstract IPage getInjectPage();

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public abstract String getInjectMeta();

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public abstract IEngineService getInjectObject();

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public abstract IScript getInjectScript();

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public abstract Object getInjectState();

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public abstract boolean isInjectStateFlag();

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public void pageAttached(PageEvent event) ...{

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public void pageBeginRender(PageEvent event) ...{

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public void pageValidate(PageEvent event) ...{

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    public void pageDetached(PageEvent event) ...{

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

    }

Tapestry灵魂——字节码生成

}

Tapestry灵魂——字节码生成

下面是该组件的说明文件:

Tapestry灵魂——字节码生成

<? xml version="1.0" ?>

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

<! DOCTYPE component-specification PUBLIC

Tapestry灵魂——字节码生成

  "-//Apache Software Foundation//Tapestry Specification 4.0//EN"

Tapestry灵魂——字节码生成

  "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd" >

Tapestry灵魂——字节码生成

< component-specification  class ="com.kft.tapestry.components.Enhance" >

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

     < bean  name ="bean"  class ="pojo.Bean"  property ="bean" />

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

     < property  name ="specifiedProperty" />

Tapestry灵魂——字节码生成

     < property  name ="sessionProperty"  persist ="session" />

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

     < parameter  name ="parameter" />

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

     < component  id ="injectComponent"  type ="Insert"  property ="injectComponent" >

Tapestry灵魂——字节码生成

         < binding  name ="value"  value ="literal:mindhawk" />

Tapestry灵魂——字节码生成

     </ component >

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

     < asset  name ="$template"  path ="context:WEB-INF/component/Enhance.html"  property ="asset" />

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

     < inject  property ="injectPage"  type ="page"  object ="Home" />

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

     < meta  key ="meta"  value ="meta" />

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

     < inject  property ="injectMeta"  type ="meta"  object ="meta" />

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

     < inject  property ="injectObject"  object ="engine-service:page" />

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

     < inject  property ="injectScript"  type ="script"  object ="Enhance.script" />

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

     < inject  property ="injectState"  type ="state"  object ="visit" />

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

     < inject  property ="injectStateFlag"  type ="state-flag"  object ="visit" />

Tapestry灵魂——字节码生成
Tapestry灵魂——字节码生成

</ component-specification >

Tapestry灵魂——字节码生成

模版文件很简单,不会对生成的代码有影响,这里就不列出来了。

继续阅读