自定义Tapestry标注
来源:互联网 发布:centos tar 压缩 编辑:程序博客网 时间:2024/05/19 16:50
我们可以利用Tapestry的易扩展特性来扩展它,首先想到的就是注释方式来注入,例如我想实现如下注入
- @InjectPageLink(“Home“) //自定义
- Public abstract ILink getHomeLink();
- @InjectExternalLink(“Category“) //自定义
- Public abstract ILink getCategoryLink(Long categoryId);
这样即去掉了页面的继承,也显得比较直接。
//首先是定义注释类
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target( { ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface InjectPageLink {
String value();
}
//然后写注释的worker类
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import org.apache.hivemind.ApplicationRuntimeException;
import org.apache.hivemind.Location;
import org.apache.hivemind.service.BodyBuilder;
import org.apache.hivemind.service.MethodSignature;
import org.apache.tapestry.annotations.AnnotationUtils;
import org.apache.tapestry.annotations.MethodAnnotationEnhancementWorker;
import org.apache.tapestry.engine.ILink;
import org.apache.tapestry.enhance.EnhancementOperation;
import org.apache.tapestry.spec.IComponentSpecification;
public class InjectPageLinkAnnotationWorker implements
MethodAnnotationEnhancementWorker {
public void performEnhancement(EnhancementOperation op,
IComponentSpecification spec, Method method, Location location) {
//如果返回类型不是是ILink
if (!method.getReturnType().equals(ILink.class))
throw new ApplicationRuntimeException(
"InjectPage annotation must return ILink");
InjectPageLink injectPageLink = method.getAnnotation(InjectPageLink.class);
//获得标签内赋的值
String pageName = injectPageLink.value();
//*********************************************************************************************************
BodyBuilder builder = new BodyBuilder();
builder.begin();
//添加抽象方法的内容
builder .addln( "return getPage().getRequestCycle().getInfrastructure().getServiceMap().getService(
org.apache.tapestry.Tapestry.PAGE_SERVICE).getLink(false,/"{0}/");", pageName);
builder.end();
//*********************************************************************************************************
//将生成的内容添加到抽象方法中去
op.addMethod(Modifier.PUBLIC, new MethodSignature(method), builder .toString(), location);
//判断是不是Getter方法
if (isGetter(method))
op.claimReadonlyProperty(AnnotationUtils.getPropertyName(method));
}
boolean isGetter(Method method) {
return method.getName().startsWith("get") && method.getParameterTypes().length == 0;
}
}
类写好了,然后就是贡献到Tapestry中
<module id="your.model.annotation" version="1.0.0" package="your.package.annotations">
<contribution configuration-id="tapestry.annotation.MethodWorkers">
<worker annotation="InjectPageLink" object="instance:InjectPageLinkAnnotationWorker"/>
<worker annotation="InjectExternalLink" object="instance:InjectExternalLinkAnnotationWorker"/>
</contribution>
</module>