Tapestry4自定义异常页面时候出错
jirabotuo
2008-12-16
在T4上自定义异常页面时候,出现以下错误:
引用 Unable to present exception page: Class $MyException_15 does not contain a property named 'exception'. Session id : D00A92DCA3980860EA5B34235921C591 Exceptions: org.apache.hivemind.ApplicationRuntimeException: Class $MyException_15 does not contain a property named 'exception'. component: $MyException_15@3c1[MyException] location: context:/MyException.page, line 6, column 21 org.apache.hivemind.util.ClassAdaptor.getPropertyAdaptor(ClassAdaptor.java:136) org.apache.hivemind.util.ClassAdaptor.write(ClassAdaptor.java:60) org.apache.hivemind.util.PropertyUtils.write(PropertyUtils.java:54) org.apache.tapestry.error.ExceptionPresenterImpl.presentException(ExceptionPresenterImpl.java:44) $ExceptionPresenter_11e3f0f3807.presentException($ExceptionPresenter_11e3f0f3807.java) $ExceptionPresenter_11e3f0f3806.presentException($ExceptionPresenter_11e3f0f3806.java) org.apache.tapestry.engine.AbstractEngine.activateExceptionPage(AbstractEngine.java:117) org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:269) org.apache.tapestry.services.impl.InvokeEngineTerminator.service(InvokeEngineTerminator.java:54) $WebRequestServicer_11e3f0f3860.service($WebRequestServicer_11e3f0f3860.java) $WebRequestServicer_11e3f0f385c.service($WebRequestServicer_11e3f0f385c.java) org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.service(WebRequestServicerPipelineBridge.java:61) $ServletRequestServicer_11e3f0f3842.service($ServletRequestServicer_11e3f0f3842.java) org.apache.tapestry.request.DecodedRequestInjector.service(DecodedRequestInjector.java:55) $ServletRequestServicerFilter_11e3f0f383e.service($ServletRequestServicerFilter_11e3f0f383e.java) $ServletRequestServicer_11e3f0f3844.service($ServletRequestServicer_11e3f0f3844.java) org.apache.tapestry.multipart.MultipartDecoderFilter.service(MultipartDecoderFilter.java:52) $ServletRequestServicerFilter_11e3f0f383c.service($ServletRequestServicerFilter_11e3f0f383c.java) $ServletRequestServicer_11e3f0f3844.service($ServletRequestServicer_11e3f0f3844.java) org.apache.tapestry.services.impl.SetupRequestEncoding.service(SetupRequestEncoding.java:53) $ServletRequestServicerFilter_11e3f0f3840.service($ServletRequestServicerFilter_11e3f0f3840.java) $ServletRequestServicer_11e3f0f3844.service($ServletRequestServicer_11e3f0f3844.java) $ServletRequestServicer_11e3f0f3836.service($ServletRequestServicer_11e3f0f3836.java) org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java:126) org.apache.tapestry.ApplicationServlet.doGet(ApplicationServlet.java:103) javax.servlet.http.HttpServlet.service(HttpServlet.java:690) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) java.lang.Thread.run(Unknown Source) 谢谢帮忙看下。主要不知道这个异常什么原因造成的。难道是说我的MyException类没有“exception”这个属性。怎么理解呢? 自定义异常页面时,总共建立了 MyException.java,MyException.html,MyException.page三个文件。 hivemodule.xml配置文件添加了一段: 引用 <!-- 自定义异常页面 --> <contribution configuration-id="tapestry.InfrastructureOverrides"> <property name="exceptionPageName" value="MyException" /> </contribution> MyException.java代码: import org.apache.log4j.Logger; import org.apache.tapestry.PageNotFoundException; import org.apache.tapestry.annotations.InitialValue; import org.apache.tapestry.html.BasePage; public abstract class MyException extends BasePage { private static Logger logger = Logger.getLogger(PageNotFoundException.class); @InitialValue("false") public abstract boolean isPageNotFound(); public abstract void setPageNotFound(boolean pageNotFound); public void setExcepiton(Throwable t){ logger.error("an exception occured",t); if(t instanceof PageNotFoundException || t.getCause() instanceof PageNotFoundException){ this.setPageNotFound(true); } } } MyException.html代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>错误信息页面</title> <link href="css/index_x.css" rel="stylesheet" type="text/css" /> </head> <body> <br /> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td> </td> <td><table border="0" cellspacing="0" cellpadding="0"> <tr> <td height="5" bgcolor="#35A425"></td> </tr> <tr> <td height="3" bgcolor="#54874F"></td> </tr> <tr> <td><div style="width:548px; border-bottom: #d2d2d2 solid 1px; border-left: #d2d2d2 solid 1px; border-right: #d2d2d2 solid 1px; background-color: #FFFFFF;"> <table border="0" cellpadding="0" cellspacing="0" > <tr> <td align="center" valign="top" background="images/erro3_03.jpg"><img src="images/error3_03.jpg" width="444" height="457" /> <p align="right"> </p></td> </tr> </table> </div></td> </tr> <tr> <td> </td> </tr> </table></td> </tr> <tr> <td width="25%"> </td> <td width="75%"> </td> </tr> <tr> <td> </td> <td> </td> </tr> </table> <br /> </body> </html> MyException.page代码: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE page-specification PUBLIC "-//Apache Software Foundation//Tapestry Specification 4.0//EN" "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd"> <page-specification> </page-specification> |
|
jirabotuo
2008-12-16
谢谢帮忙看下。主要不知道这个异常什么原因造成的。难道是说我的MyException类没有“exception”这个属性。怎么理解呢?
|
|
tapestry
2008-12-16
不知道你怎么理解的属性,不过确实你的类里没有exception这个属性,你可以定义抽象的getException()方法,或者直接实现这个方法,抽象的tapestry中叫属性,直接实现的版本是ognl直接调用的。
|
|
jirabotuo
2008-12-17
谢谢Tapestry兄,知道原因了。确实是我的MyException类没有exception属性。
因为我定义了一个void setException(Throwable t)方法,可是没有定义相对的返回方法getException()。 于是,我在MyException中定义了个抽象方法: public abstract Throwable getException(); 就可以了。 我想问下Tapestry兄,T4里面对bean是怎么解释的?有相关资料吗?这里采用的方法跟javabean有点类似。 |
|
tapestry
2008-12-17
它就是将抽象的getter和setter定义为属性,它会生成个类,实现抽象的getter和setter的方法,并在类中增加那个域,就跟我们自己在bean中加域一样,不过它有自己的属性生命周期管理方法,比如初始化等。
|
|
jirabotuo
2008-12-17
理解了。
还想问下Tapestry兄,就是我用Tapestry4.1开发时,刷新当前页面,表单老是重复提交。请问怎么解决呢? 我看了你那篇文章,试过好像不行啊! |
|
jirabotuo
2008-12-17
我的form代码是这样的:
MyHtml.html <form jwcid="@Form" listener="listener:onSubmit" action=""> <table> <tr> <td><input type="submit" onclick="return checkQuForm();" value="提交"/></td> </tr> </table> </form> listener方法如下: @InjectPage("ZhuanJiaWenDa") public abstract ZhuanJiaWenDa getZhuanJiaWenDaPage(); public abstract void setFlag(int flag); //操作状态位,1为成功,2为失败 public abstract void setMsg(String msg); //操作提示信息 public IPage onSubmit(){ ZhuanJiaWenDa page = this.getZhuanJiaWenDaPage(); if(!this.getCurDVExist()) { page.setFlag(2); page.setMsg("您尚未登录,无法提交问题!"); return page; } QA qa = new QA(); qa.setQuTitle(this.getQuTitle1()); qa.setQuestion(com.doone.pcdoctor.util.StringFormat.getHtmlString(this.getQuContent())); qa.setUserId(this.getDefaultUserId()); qa.setNickname(this.getDefaultUser()); if(this.getQADao().addQA(qa)) { page.setFlag(1); page.setQuContent(null); page.setQuTitle1(null); page.setMsg("问题提交成功,我们将尽快联系专家为您解答!"); } else { page.setFlag(2); page.setMsg("问题提交失败,请稍候再试!"); } return page; } 当我提交数据完后,刷新当前页面,数据会重复提交。(因为重复提交了表单,listener方法被调用了2次)。请问用什么方法可以不重复提交表单呢? |
|
tapestry
2008-12-18
不要返回IPage对象,返回ILink对象,这样就是redirect了。
|
|
jirabotuo
2008-12-18
返回ILink确实是可以了。
但是我的这句代码没被调用到了。 page.setMsg("您尚未登录,无法提交问题!"); |
|
tapestry
2008-12-18
ILink无法设值,它redirect过去后是无状态的。你可以实现IExternalLink,通过参数传值给它。
|