- 浏览: 1208560 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (353)
- java基础 (40)
- tapestry (16)
- gwt (14)
- ajax (7)
- linux (8)
- ubuntu (18)
- eclipse (6)
- dojo (2)
- javascript (7)
- maven (4)
- 日常生活 (29)
- web2.0 (2)
- jsonrpc (1)
- compass (1)
- lucene (0)
- spring (10)
- cluster (3)
- 数据结构 (2)
- sqlserver (1)
- tomcat (2)
- swing (1)
- servlet (1)
- hibernate (1)
- firefox (1)
- Java-Puzzlers (1)
- Wicket (2)
- mysql (10)
- windows (5)
- Webwork (1)
- struts2 (1)
- Seam (2)
- jboss (1)
- idea (6)
- 分布计算 (3)
- Python-Django (7)
- Hadoop (1)
- 工具 (3)
- Tokyo Tyrant (2)
- Comet (1)
- android (115)
- 音乐 (6)
- cxf (1)
- mqtt (1)
最新评论
-
hesai_vip:
学习了,感谢
gradlew wrapper使用下载到本地的gradle.zip文件安装。 -
imknown:
姚瑶大坏蛋 写道我也遇到了这个,用你这个方法,导致下拉刷新不起 ...
解决android-Ultra-Pull-To-Refresh下拉刷新组件中嵌套ViewPager的一个bug -
姚瑶大坏蛋:
我也遇到了这个,用你这个方法,导致下拉刷新不起作用了,你遇到过 ...
解决android-Ultra-Pull-To-Refresh下拉刷新组件中嵌套ViewPager的一个bug -
寐语者:
LeaderElection(String zookeeper ...
使用Zookeeper来为你的程序加上Leader Election的功能。 -
fyc0109:
博主, 安装了一部分还是报这个错误!FAILURE: Buil ...
gradlew wrapper使用下载到本地的gradle.zip文件安装。
我们一般需要为生产和开发环境准备两套error page。 tapestry在开发环境下的error page做得非常漂亮。 非常详细, 但是在生产环境下就不能暴露太多的信息。 而且error page的外观也需要定制。 这时候tapestry默认的error page就不行了。 所以我们期望的是在开发的时候我们需要tapestry自带的error page, 而在生产环境下我们需要定制自己的error page。
http://wiki.apache.org/tapestry/Tapestry5ExceptionPage
上面这篇文章告诉我们怎样替换掉tapestry自带的error page。 但是我们需要更灵活的方式。
OK, 下面开始写代码。 我们在AppModule class 添加以下代码段。
我们只要关注64至72行的代码。 64行以上的代码是实现Tapestry4中的RedirectException作用的。我们可以只看64至72行的代码就行了。 这段代码很简单。 如果是productionMode(我们运行时servlet container时加了-Dtapestry.production-mode 参数)的话, 我们去拿"ProductionExceptionReport"页面。 然后调用reportException方法。 最后转到ProductionExceptionReport页面。 如果不是production mode的话,我们使用tapestry默认的RequestExceptionHandler去处理这个异常。 这样tapestry就使用自带的异常页面了。
ProductionExceptionReport页面实现了tapestry5的ExceptionReporter 接口。 这里要注意的是
你不能把它cast成ProductionExceptionReporter, 这是由tapestry5的classloader超成的。 tapestry5文档中有说明。 你可以在reportException方法中做些事情。 比如发邮件通知管理员。
下面是个简单的error page的模板页面。
OK。大工告成!
在你开发的环境中启动参数中加上-Dtapestry.production-mode=false
参考:
http://wiki.apache.org/tapestry/Tapestry5ExceptionPage
http://tapestry.apache.org/tapestry5/cookbook/exceptions.html
http://wiki.apache.org/tapestry/Tapestry5ExceptionPage
上面这篇文章告诉我们怎样替换掉tapestry自带的error page。 但是我们需要更灵活的方式。
OK, 下面开始写代码。 我们在AppModule class 添加以下代码段。
// handle RedirectException public static RequestExceptionHandler decorateRequestExceptionHandler( final Object delegate, final Response response, final RequestPageCache requestPageCache, final LinkFactory linkFactory, final ComponentClassResolver resolver, @Symbol(SymbolConstants.PRODUCTION_MODE) final boolean productionMode, final PageResponseRenderer renderer ) { return new RequestExceptionHandler() { public void handleRequestException(Throwable exception) throws IOException { // check if wrapped Throwable cause = exception; if (exception.getCause() instanceof RedirectException) { cause = exception.getCause(); } //Better way to check if the cause is RedirectException. Sometimes it's wrapped pretty deep.. int i = 0; while(true){ if(cause == null || cause instanceof RedirectException || i > 1000){ break; } i++; cause = cause.getCause(); } // check for redirect if (cause instanceof RedirectException) { // check for class and string RedirectException redirect = (RedirectException)cause; URL url = redirect.getUrl(); if (url != null) { response.sendRedirect(url.toString()); return ; } Link pageLink = redirect.getPageLink(); if (pageLink == null) { // handle Class (see ClassResultProcessor) String pageName = redirect.getMessage(); Class<?> pageClass = redirect.getPageClass(); if (pageClass != null) { pageName = resolver.resolvePageClassNameToPageName(pageClass.getName()); } // handle String (see StringResultProcessor) Page page = requestPageCache.get(pageName); pageLink = linkFactory.createPageLink(page, false); } // handle Link redirect if (pageLink != null) { response.sendRedirect(pageLink.toRedirectURI()); return; } } if (productionMode) { Page page = requestPageCache.get("ProductionExceptionReport"); ExceptionReporter rootComponent = (ExceptionReporter) page.getRootComponent(); rootComponent.reportException(exception); renderer.renderPageResponse(page); }else { // no redirect so pass on the exception ((RequestExceptionHandler)delegate).handleRequestException(exception); } } }; }
我们只要关注64至72行的代码。 64行以上的代码是实现Tapestry4中的RedirectException作用的。我们可以只看64至72行的代码就行了。 这段代码很简单。 如果是productionMode(我们运行时servlet container时加了-Dtapestry.production-mode 参数)的话, 我们去拿"ProductionExceptionReport"页面。 然后调用reportException方法。 最后转到ProductionExceptionReport页面。 如果不是production mode的话,我们使用tapestry默认的RequestExceptionHandler去处理这个异常。 这样tapestry就使用自带的异常页面了。
import java.util.List; import org.apache.tapestry5.Asset; import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.ioc.services.ExceptionAnalysis; import org.apache.tapestry5.ioc.services.ExceptionAnalyzer; import org.apache.tapestry5.ioc.services.ExceptionInfo; import org.apache.tapestry5.services.ExceptionReporter; public class ProductionExceptionReport implements ExceptionReporter { @Property(write=false) private Throwable exception; @Inject private ExceptionAnalyzer analyzer; @Property private List<ExceptionInfo> stack; public void reportException(Throwable exception) { this.exception = exception; ExceptionAnalysis analysis = analyzer.analyze(exception); stack = analysis.getExceptionInfos(); sendExceptionByEmail(); } private void sendExceptionByEmail() { System.out.println(".......................Send Email .............."); } @Override public Asset[] getCsses() { return new Asset[] {getIndexCssAsset()}; } }
ProductionExceptionReport页面实现了tapestry5的ExceptionReporter 接口。 这里要注意的是
ExceptionReporter rootComponent = (ExceptionReporter)page.getRootComponent();
你不能把它cast成ProductionExceptionReporter, 这是由tapestry5的classloader超成的。 tapestry5文档中有说明。 你可以在reportException方法中做些事情。 比如发邮件通知管理员。
下面是个简单的error page的模板页面。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <t:layout home="false" errorPage="true" showAddNewSite="false" showSideBar="false" title="literal:Error" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"> <font color="red">有错误发生,请联系管理员。</font> <br/> <a t:type="pagelink" t:page="Index">重新开始</a> </t:layout>
OK。大工告成!
在你开发的环境中启动参数中加上-Dtapestry.production-mode=false
参考:
http://wiki.apache.org/tapestry/Tapestry5ExceptionPage
http://tapestry.apache.org/tapestry5/cookbook/exceptions.html
发表评论
-
解决用run-jetty-run锁住css,js文件的问题。
2008-09-25 17:46 6585开发中用run-jetty-run插件启动jetty调式tap ... -
T5这么多的Page Lifecycle method, 应该怎样使用?
2008-09-04 18:18 2368Tapestry5种大概有以下Page ... -
扔掉T5复杂的Grid组件,打造自己灵活的支持分页排序组件。
2008-01-03 13:12 2826Grid算是比较T5中较复杂的一个组件,我也有篇介绍Grid怎 ... -
对Tapestry的一点思考。
2007-12-27 23:33 4064Tapestry5已经开发了蛮久了。 听说最近要发布T5.0. ... -
Tapestry 5.0.5 bug, TAPESTRY-1648
2007-08-26 12:20 2601有一个domian object, 其中有个property的 ... -
T5 技巧 3:使用“t::body”进行布局。
2007-08-25 00:08 2897现在正在使用T5开发一个小项目。 因为现在T5还正处于发展中。 ... -
T5 技巧 2:为Grid组件的每一行增加“删除/修改”链接。
2007-08-21 12:35 8965现在正在使用T5开发一个小项目。 因为现在T5还正处于发展中。 ... -
T5 技巧 1:解决Form的提交乱码问题。
2007-08-21 10:58 8303现在正在使用T5开发一个小项目。 因为现在T5还正处于发展中。 ... -
T5 developing with WTP and TOMCAT
2007-08-16 09:50 2710以下是我发给tapestry右键列表的问题。 现在还没有人回复 ... -
Wicket Vs Tapestry
2007-05-11 14:41 7447我是一个tapestry的老用户。从学校毕业就开始使用tape ... -
Tapestry5中 page template不能reload。
2007-05-09 13:50 5854上午看了下tapestry5的文档,然后自己写了个简单的页面。 ... -
Tapestry Table 组件的强大(分页查询时只fetch当前页的数据)。
2006-03-01 16:00 4312导入的blog格式乱了,大 ... -
Tapestry 显示图片
2006-03-06 16:00 2745导入的blog格式乱了,请看我的msn spaces blog ... -
@Persist 解释
2006-03-08 16:00 3119a) @Persist("client") ... -
原创 Tapestry的Cache组件
2006-12-22 11:24 5056有许多页面的一部分或者这个页面是很少更新的,他们通常是由外部文 ...
相关推荐
本文利用Tapestry 5开发一个简单的具有创建/读/更新/删除功能的应用,在创建这个应用的过程中,本文体会到Tapestry带来的开发效率的提升。从多方面来讲解 Tapestry应用,比如应用的页面导航(page navigation)、...
tapestry5组件说明使用及登陆修改等简单实例
Tapestry5和jQuery集成.使用jQuery以极少的兼容问题完全替换Prototype 和 Scriptaculous库 标签:tapestry5
Tapestry是一个基于控件的框架以致于用它开发Web应用类似开发传统的GUI应用。你用Tapestry开发Web应用时你无需关注以操作为中心的(Operation-centric) Servlet API.引用Tapestry网站上的一句话:"Tapestry用对象...
Tapestry 4 官方文档中文版本,现在中文资料比较少,和大家共享一下
Drobiazko和R. Zubairov合作撰写了一篇文章,详细介绍Apache Tapestry 版本5——一个...文章向读者展示了创建组件方法,并谈到了Tapestry中的IoC以及Ajax的相关特性 译者 沙晓兰 发布于 2008年7月2日 下午9时30分
里面用详细实例说明了tapestry5的使用方法 简单 实用 详细 一看就会 在这里提醒一下大家,这个教程讲的是tapestry5而不是tapestry4,如果需要看tapestry4的话,请看我传的另外一本有关tapestry的教程,英文的那本,...
Tapestry5最新中文教程.doc 作者 Renat Zubairov & Igor Drobiazko译者 沙晓兰 发布于 2008年7月2日 下午9时30分 社区 Java 主题 Web框架 ----------------------------------------- Tapestry5.1实例教程.pdf ...
Tapestry 4 官方文档中文版本,包括Tapestry4 Quick Start(2)和Tapestry4 Users Guide(2)两个文档 还有tapestry中文字典等
最新Tapestry 5 電子書
老外的一个ppt介绍Tapestry 5
Tapestry5 英文版入门技术指导!
Tapestry5开发环境搭建(Eclipse),包括服务器搭建。。。
tapestry5组件说明使用等简单实例。Apache Tapestry是一个使用Java语言创建web应用的面向组件的开发框架。Tapestry应用建立在根据组件构建的页面的基础上。这个框架能够提供输入验证(input validation)、本地化/...
Tapestry 5开发指南(英文) Tapestry 5开发指南(英文) Tapestry 5开发指南(英文) Tapestry 5开发指南(英文)
tapestry页面编辑组件,可以实现文本框,单选框,多选框和下拉框等的自动生成,并返回改变后的数据。
tapestry4.02中封装ext的GridPanel组件
Tapestry5.0.16文档和大家一起学习
Tapestry简述: Tapestry是一个servle的扩展,它运行于servlet容器(Tomcat)或包含servlet容器的服务器(如Jboss) 通过使用Tapestry,开发者完全不需要使用JSP技术,用户只需要使用Tapestry提供的模板技术即可, ...
Tapestry5实例(开发步骤),环境搭建后必看的实例。。。