Tapest笔记(四)

原创 2007年09月25日 10:23:00

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.       }  

 

 

OllyDbg 使用笔记 (四)

OllyDbg 使用笔记 (四) 参考 书:《加密与解密》 视频:小甲鱼 解密系列 视频 这个RegisterMe程序,运行前和运行后都会有neg窗口。破解目标,去除这个两个窗口。 用OD直接...
  • billvsme
  • billvsme
  • 2014年08月01日 23:23
  • 1054

pixhawk 四旋翼笔记1

开始入坑pixhawk。讲讲遇到的坑。(见解可能有误,欢迎拍砖) 1.一开始并不清楚pixhawk飞控是什么,后来发现是一个开源硬件平台,而且有两大开源飞控代码可以在其上运行。一个出自APM开源社区点...
  • u010566411
  • u010566411
  • 2016年03月01日 20:02
  • 2111

FPGA笔记(四)

FPGA笔记(四) 又到了周末,今天晚上感觉还有些状态,这几天状态都不好,也没有好好学习!这可是不行的,要好好努力!加油!Rome is not built in one day! 今天在看消抖的列子...
  • Struggle_For_M
  • Struggle_For_M
  • 2016年05月29日 21:24
  • 538

互联网电商大数据环境 ——大数飓数据分析实践培训精华笔记(一)——简介入门

互联网电商大数据环境 ——数据分析实践培训精华笔记(一) 工作内容 项目:DW数据库建设/经分/客户精准营销/推荐系统需求/移动端数据分析 数据:流量数据/交易数据B2C/会员与活动数据/物流与配...
  • houxiaoqin
  • houxiaoqin
  • 2015年08月11日 09:56
  • 1194

四旋翼飞行器的姿态解算小知识点

笔者最近在做四旋翼飞行器的研究工作,所以在这里总结一下关于姿态解算的小知识点。 知识点比较零碎,涉及到:飞行器导航的基本原理、四元数的理解、加速度计和陀螺仪的理解、欧拉角的理解、飞行器的数据融合方案、...
  • yzhajlydy
  • yzhajlydy
  • 2013年11月24日 20:42
  • 18085

python 学习笔记 4 -- 函数篇

本文主要是针对python的函数定义做的笔记,详细记录各种需要了解的知识,比如规范、参数、返回值、局部变量、全局变量以及doc_string的相关知识,使用大量简单例子作为解释更容易理解!...
  • longerzone
  • longerzone
  • 2013年12月09日 13:32
  • 2700

linux笔记-磁盘及文件系统管理详解

第十四章、磁盘及文件系统管理详解 08_03_磁盘及文件系统管理详解之一   磁盘管理:          机械式硬盘:          U盘、光盘、...
  • xiaobudaics
  • xiaobudaics
  • 2016年10月20日 23:23
  • 890

【原创】【程序小游戏】平面四子棋 C++

平面四子棋事先声明:代码是我自个儿写的,规则不是我发明的~~~~。 我觉得我真是太不务正业了!规则在一个7*12的棋盘里,下四子棋。只不过,这个棋盘是竖立着的,它的棋子是从上往下掉的。 比如说: ...
  • c20182030
  • c20182030
  • 2017年05月20日 22:30
  • 668

四元素(Quaternion)与旋转

四元素性质及其与欧拉角、旋转矩阵的转换关系
  • u010297353
  • u010297353
  • 2015年10月11日 18:22
  • 1742

坐标转换之四参数

四参数转换用在投影坐标系中,当已知坐标不是投影
  • u012839396
  • u012839396
  • 2014年05月16日 09:24
  • 3219
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Tapest笔记(四)
举报原因:
原因补充:

(最多只允许输入30个字)