You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by Apache Wiki <wi...@apache.org> on 2006/02/15 23:41:56 UTC

[Jakarta-tapestry Wiki] Update of "SpeclessPagesInWEB-INF" by JeffLubetkin

Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Jakarta-tapestry Wiki" for change notification.

The following page has been changed by JeffLubetkin:
http://wiki.apache.org/jakarta-tapestry/SpeclessPagesInWEB-INF

New page:
= How to have specless pages, but keep your templates under WEB-INF =

With Tapestry 4.0 and Java 1.5, annotations make it possible to eliminate page specifications.  Tapestry will create an implicit specification for any template that is referenced.  However, it will only look for these templates in the servlet root, which eliminates the added security of keeping templates under WEB-INF so that they're not directly readable.

One way around this is to use an `ISpecificationResolverDelegate` to look in WEB-INF to generate these implicit specifications.  This code will look for specifications relative to the application root, which is where your Tapestry application specification (Foo.application) sits.  If that file is in WEB-INF, then this code will search for the templates under WEB-INF, keeping them out of the servlet context root.

The class:
{{{
public class AppSpecRelativeSpecificationResolverDelegate implements
		ISpecificationResolverDelegate
{
	private String templateExtension;
	
	public IComponentSpecification findPageSpecification(IRequestCycle cycle,
			INamespace namespace, String simplePageName)
	{
		String templateName = simplePageName + getTemplateExtension();
		Resource namespaceLocation = namespace.getSpecificationLocation();
		Resource templateResource = namespaceLocation.getRelativeResource( templateName );
		if ( templateResource.getResourceURL() != null )
		{
			return setupImplicitPage( simplePageName, templateResource, namespaceLocation );
		}
		
		return null;
	}

	public IComponentSpecification findComponentSpecification(
			IRequestCycle cycle, INamespace namespace, String type)
	{
		return null;
	}

    private String getTemplateExtension( )
    {
        return templateExtension;
    }

    private IComponentSpecification setupImplicitPage(String simpleName, Resource resource, Resource namespaceLocation)
    {
        Resource pageResource = namespaceLocation.getRelativeResource(simpleName + ".page");

        IComponentSpecification specification = new ComponentSpecification();
        specification.setPageSpecification(true);
        specification.setSpecificationLocation(pageResource);
        specification.setLocation(new LocationImpl(resource));

        return specification;
    }

    public void setTemplateExtension(String extension)
    {
        if ( extension.charAt(0) != '.' )
        	extension = "." + extension;
        
        templateExtension = extension;
    }
}
}}}

And here's the necessary .application file config (package names obviously need to change):
{{{
<extension name="org.apache.tapestry.specification-resolver-delegate" 
	class="com.foo.bar.AppSpecRelativeSpecificationResolverDelegate">
    	<configure property="templateExtension" value=".html"/> 
</extension>
}}}

---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-dev-help@jakarta.apache.org