1.Tapestry的service
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")
- public abstract IEngineService getPageService();
- public ILink getPageLink(String pageName) {
- return getPageService().getLink(false, pageName);
- }
- @InjectObject("engine-service:external")
- public abstract IEngineService getExternalService();
- public ILink getExternalLink(String pageName, Object[] parameters) {
- ExternalServiceParameter esp = new ExternalServiceParameter(pageName,
- parameters);
- return getExternalService().getLink(false, esp);
- }
将上述方法放入到你的项目中自定义的MyBasePage(继承Tapestry的BasePage)中,然后让你的
页面类继承MyBasePage,这样就可以使用上述方法了。
这样在页面提交时可以如下调用
java 代码
- public ILink onDelete(Long id){
- //your code to delete object
- return getPageLink(getPageName());//删除后重新redirect到本页面
- }
- 当然如果这个页面带参数,例如catgoryId=1,则代码如下:
- public ILink onDelete(Long id){
- //your code to delete object
- return getExternalLink(getPageName(),new Object[]{categoryId});
- //删除后重新redirect到本页面,并带一个参数
- }
上述方式通过继承来实现方法调用,感觉不是很好,我们可以利用Tapestry的易扩展特性来扩展它,
首先想到的就是注释方式来注入,例如我想实现如下注入
java 代码
- @InjectPageLink(“Home“)
- Public abstract ILink getHomeLink();
- @InjectExternalLink(“Category“)
- Public abstract ILink getCategoryLink(Long categoryId);
这样即去掉了页面的继承,也显得比较直接。
首先是定义注释类
java 代码
- 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类
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. }