tapestry-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Apache Wiki <wikidi...@apache.org>
Subject [Jakarta-tapestry Wiki] Update of "SpeclessPagesInWEB-INF" by JeffLubetkin
Date Wed, 15 Feb 2006 22:41:56 GMT
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


Mime
View raw message