The old "Img" component required that you specified a domain like this: src="context:path/image.gif". For template previewability it's better to separate the domain out into another parameter and default it to context. Here's the result, which I've renamed "Image".

Example use:

<!-- previewable image that is still an asset (localized etc) at runtime -->
<img t:type="Image" src="images/other/header.gif" alt="informals rendered" border="0"/>

Source:

(Modified from T5.0.4. Put it into yourapp.components package)

// Copyright 2006, 2007 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package yourapp.components;

import org.apache.tapestry.Asset;
import org.apache.tapestry.ComponentResources;
import org.apache.tapestry.MarkupWriter;
import org.apache.tapestry.PageRenderSupport;
import org.apache.tapestry.annotations.AfterRender;
import org.apache.tapestry.annotations.BeforeRenderBody;
import org.apache.tapestry.annotations.BeginRender;
import org.apache.tapestry.annotations.Environmental;
import org.apache.tapestry.annotations.Inject;
import org.apache.tapestry.annotations.Parameter;
import org.apache.tapestry.annotations.SupportsInformalParameters;
import org.apache.tapestry.services.AssetSource;

/**
 * Renders an HTML img element using a supplied image source path. The path domain defaults to
 * context but any other tapestry domain can be specified, e.g. "classpath".
 * <p>
 * Renders an id attribute (a {@link PageRenderSupport#allocateClientId(String) uniqued} version
 * of the component's id) as well as informal parameters.
 */
@SupportsInformalParameters
public class Image
{
    @Environmental
    private PageRenderSupport _support;

    @Inject
    private ComponentResources _resources;

    /**
     * The image asset to render.
     */
    @Parameter(required = true, defaultPrefix = "literal")
    private String _src;

    @Parameter(required = false, defaultPrefix = "literal", value = "context")
    private String _domain;

    @Inject
    private AssetSource assetSource;

    @BeginRender
    void begin(MarkupWriter writer)
    {
        String clientId = _support.allocateClientId(_resources.getId());

        Asset image = assetSource.findAsset(null, _domain + ":" + _src, null);
        writer.element("img", "src", image.toClientURL(), "id", clientId);

        _resources.renderInformalParameters(writer);
    }

    @BeforeRenderBody
    boolean beforeRenderBody()
    {
        return false;
    }

    @AfterRender
    void after(MarkupWriter writer)
    {
        writer.end();
    }
}

  • No labels