Tapest笔记(四)

1.Tapestryservice

IRequestCycle对象:

控制一个单一的请求周期。

l         通过IEngineService对象响应URL

l         决定响应页面

l         表现响应页面

l         释放所有资源

l         异常操作

l         加载页面模板

l         跟踪也面属性的变化并储存也面状态

l         缓存也面对象

 

IPageRecorder对象

在请求周期内存储页面状态,并在下一个请求周期到来之前,将也面已经发生变化的状态恢复到初始值

 

IPageSource对象

通过也面规范从缓存池中加载页面对象。

 

IPageLoader对象

创建页面对象实例

 

IEngine对象

每个单一客户拥有自己的engine对象。

 

IEngineService对象

Tapestry的核心service通过IEngine对象向也面和组件提供service.

Service的作用是构建URL编码以响应请求,或解析请求中包含URL

 

WebRequest对象

包含当前请求的所有信息

 

WebResponse对象

控制客户端响应,并创建输出流

 

WebContext 对象

ServletContext的封装

 

WebSession对象

HttpSession的封装

 

 

 

 

hivemind里配置以达到上传文件大小设定:
<implementation service-id="tapestry.multipart.ServletMultipartDecoder">
<create-instance class="org.apache.tapestry.multipart.MultipartDecoderImpl,maxSize=-1" model="threaded" />
</implementation>

 

 

 

消除刷新导致表单的重复提交、dirty form warning

显示不友好的URL

 

java 代码

 @InjectObject("engine-service:page")  

  1.   
  2.   public abstract IEngineService getPageService();  
  3.   
  4.        public ILink getPageLink(String pageName) {  
  5.   
  6.            return getPageService().getLink(false, pageName);  
  7.   
  8.   }  
  9.   
  10.   
  11.   
  12.       @InjectObject("engine-service:external")  
  13.   
  14.   public abstract IEngineService getExternalService();  
  15.   
  16.        public ILink getExternalLink(String pageName, Object[] parameters) {  
  17.   
  18.      ExternalServiceParameter esp = new ExternalServiceParameter(pageName,  
  19.   
  20.             parameters);  
  21.   
  22.      return getExternalService().getLink(false, esp);  
  23.   
  24.   }  

将上述方法放入到你的项目中自定义的MyBasePage(继承TapestryBasePage)中,然后让你的

页面类继承MyBasePage,这样就可以使用上述方法了。

这样在页面提交时可以如下调用

java 代码

 

  1. public ILink onDelete(Long id){  
  2.   
  3.    
  4.   
  5. //your code to delete object  
  6.   
  7.    
  8.   
  9. return getPageLink(getPageName());//删除后重新redirect到本页面  
  10.   
  11. }  
  12.   
  13. 当然如果这个页面带参数,例如catgoryId=1,则代码如下:  
  14.   
  15. public ILink onDelete(Long id){  
  16.   
  17.    
  18.   
  19. //your code to delete object  
  20.   
  21.    
  22.   
  23. return getExternalLink(getPageName(),new Object[]{categoryId});  
  24. //删除后重新redirect到本页面,并带一个参数  
  25.   
  26. }  

上述方式通过继承来实现方法调用,感觉不是很好,我们可以利用Tapestry的易扩展特性来扩展它,
首先想到的就是注释方式来注入,例如我想实现如下注入

java 代码

 

  1. @InjectPageLink“Home“  
  2.   
  3. Public abstract ILink getHomeLink();  
  4.   
  5.    
  6.   
  7. @InjectExternalLink“Category“  
  8.   
  9. Public abstract ILink getCategoryLink(Long categoryId);  

 

这样即去掉了页面的继承,也显得比较直接。

首先是定义注释类

java 代码

 

  1. import java.lang.annotation.ElementType;  
  2.   
  3. import java.lang.annotation.Retention;  
  4.   
  5. import java.lang.annotation.RetentionPolicy;  
  6.   
  7. import java.lang.annotation.Target;  
  8.   
  9.    
  10.   
  11. @Target( { ElementType.METHOD })  
  12.   
  13. @Retention(RetentionPolicy.RUNTIME)  
  14.   
  15. public @interface InjectPageLink {  
  16.   
  17.     String value();  
  18.   
  19. }  

 

然后写注释的worker

java 代码

 

1.           import java.lang.reflect.Method;  

2.             

3.           import java.lang.reflect.Modifier;  

4.             

5.              

6.             

7.           import org.apache.hivemind.ApplicationRuntimeException;  

8.             

9.           import org.apache.hivemind.Location;  

10.         

11.       import org.apache.hivemind.service.BodyBuilder;  

12.         

13.       import org.apache.hivemind.service.MethodSignature;  

14.         

15.       import org.apache.tapestry.annotations.AnnotationUtils;  

16.         

17.       import org.apache.tapestry.annotations.MethodAnnotationEnhancementWorker;  

18.         

19.       import org.apache.tapestry.engine.ILink;  

20.         

21.       import org.apache.tapestry.enhance.EnhancementOperation;  

22.         

23.       import org.apache.tapestry.spec.IComponentSpecification;  

24.         

25.          

26.         

27.       public class InjectPageLinkAnnotationWorker implements  

28.         

29.              MethodAnnotationEnhancementWorker {  

30.         

31.          

32.         

33.           public void performEnhancement(EnhancementOperation op,  

34.         

35.                  IComponentSpecification spec, Method method, Location location) {  

36.         

37.              if (!method.getReturnType().equals(ILink.class))  

38.         

39.                  throw new ApplicationRuntimeException(  

40.         

41.                         "InjectPage annotation must return ILink");  

42.         

43.          

44.         

45.              InjectPageLink injectPageLink = method  

46.         

47.                     .getAnnotation(InjectPageLink.class);  

48.         

49.          

50.         

51.              String pageName = injectPageLink.value();  

52.         

53.          

54.         

55.              BodyBuilder builder = new BodyBuilder();  

56.         

57.          

58.         

59.              builder.begin();  

60.         

61.              builder  

62.         

63.                     .addln(  

64.         

65.                            "return getPage().getRequestCycle().getInfrastructure().getServiceMap().getService( 

66.        

67.       org.apache.tapestry.Tapestry.PAGE_SERVICE).getLink(false,/"{0}/");",  

68.         

69.                            pageName);  

70.         

71.          

72.         

73.              builder.end();  

74.         

75.          

76.         

77.              op.addMethod(Modifier.PUBLIC, new MethodSignature(method), builder  

78.         

79.                     .toString(), location);  

80.         

81.          

82.         

83.              if (isGetter(method))  

84.         

85.                  op.claimReadonlyProperty(AnnotationUtils.getPropertyName(method));  

86.         

87.           }  

88.         

89.          

90.         

91.           boolean isGetter(Method method) {  

92.         

93.              return method.getName().startsWith("get")  

94.         

95.                     && method.getParameterTypes().length == 0;  

96.         

97.           }  

98.         

99.       }  

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值