自定义Tapestry标注

来源:互联网 发布:centos tar 压缩 编辑:程序博客网 时间:2024/05/19 16:50
我们可以利用Tapestry的易扩展特性来扩展它,首先想到的就是注释方式来注入,例如我想实现如下注入

  1. @InjectPageLink(“Home“)  //自定义
  2. Public abstract ILink getHomeLink(); 

  3. @InjectExternalLink(“Category“)  //自定义
  4. 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>









 
 
原创粉丝点击