Хочу создать Tapestry компонент - DatePeriodPicker. Суть в чем - есть два поля DatePicker dateBegin и dateEnd соответственно значения из полей должны выставляться и передаваться. Вот html компонента: | Код | <html> <body jwcid="$content$"> <div id="picker"> <div id="datel"><input type="text" jwcid="dateBegin"/> Begin date</div> <div id="date2"><input type="text" jwcid="dateEnd"/> End date</div> </div> </body> </html>
|
DatePeriodPicker.jwc: | Код | <?xml version="1.0"?> <!DOCTYPE component-specification PUBLIC "-//Apache Software Foundation//Tapestry Specification 4.0//EN" "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd"> <component-specification allow-body="no" class="org.beq.tapestry.components.DatePeriodPicker"> <parameter name="dateBegin" required="no"/> <parameter name="dateEnd" required="no"/> <component id="dateBegin" type="DatePicker"> <binding name="value" value="dateBegin"/> <binding name="translator" value="translator:date,pattern=dd/MM/yyyy"/> </component> <component id="dateEnd" type="DatePicker"> <binding name="value" value="dateEnd"/> <binding name="translator" value="translator:date,pattern=dd/MM/yyyy"/> </component> </component-specification>
|
Вот код java класса: | Код | package org.beq.tapestry.components;
import java.util.Date;
import org.apache.tapestry.BaseComponent; import org.apache.tapestry.IMarkupWriter; import org.apache.tapestry.IRequestCycle;
public abstract class DatePeriodPicker extends BaseComponent {
public abstract Date getDateBegin(); public abstract void setDateBegin(Date dateBegin);
public abstract Date getDateEnd(); public abstract void setDateEnd(Date dateEnd);
protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) { super.renderComponent(writer, cycle); } }
|
Вызываю в Home.html: | Код | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>DatePeriodPicker Test</title> <script type="text/javascript" src="/DatePeriodPicker/app?service=asset&path=%2Fdojo%2Fdojo.js"></script> </head> <body jwcid="@Body"> <form jwcid="form"> <input type="text" jwcid="datePeriodPicker"/> <br/> <input type="submit"/> </form> </body> </html>
|
вот Home.page: | Код | <?xml version="1.0"?> <!DOCTYPE page-specification PUBLIC "-//Apache Software Foundation//Tapestry Specification 4.0//EN" "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd"> <page-specification class="org.beq.tapestry.DatePeriodPickerDemo.Home"> <component id="datePeriodPicker" type="DatePeriodPicker"> <binding name="value" value="dateBegin"/> <binding name="value" value="dateEnd"/> </component> <component id="form" type="Form"> <binding name="listener" value="listener:onSubmit"/> </component> </page-specification>
|
Вот Home.java: | Код | package org.beq.tapestry.DatePeriodPickerDemo;
import java.util.Date;
import org.apache.tapestry.IPage; import org.apache.tapestry.annotations.InjectPage; import org.apache.tapestry.html.BasePage;
public abstract class Home extends BasePage {
// Получение параметров @InjectPage("Result") public abstract IPage getResult(); public abstract Date getDateBegin(); public abstract Date getDateEnd();
public IPage onSubmit() { IPage resultPage = getResult(); return resultPage; } }
|
В принципе все делаю как написано в книге EnjoyWebDevWithTapestry. Компонент рисуется но после нажатия на кнопку я получаю вот такой эксепшн: | Код | Unable to update OGNL expression '<parsed OGNL expression>' of $DatePeriodPicker_1@9bd09361[Home/datePeriodPicker] to null: Method "setDateBegin" failed for object $DatePeriodPicker_1@9bd09361[Home/datePeriodPicker] org.apache.tapestry.BindingException Unable to update OGNL expression '<parsed OGNL expression>' of $DatePeriodPicker_1@9bd09361[Home/datePeriodPicker] to null: Method "setDateBegin" failed for object $DatePeriodPicker_1@9bd09361[Home/datePeriodPicker] binding: ExpressionBinding[Home/datePeriodPicker dateBegin] location: context:/WEB-INF/DatePeriodPicker.jwc, line 9, column 44 4 "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd"> 5 <component-specification allow-body="no" class="org.beq.tapestry.components.DatePeriodPicker"> 6 <parameter name="dateBegin" required="no"/> 7 <parameter name="dateEnd" required="no"/> 8 <component id="dateBegin" type="DatePicker"> 9 <binding name="value" value="dateBegin"/> 10 <binding name="translator" value="translator:date,pattern=dd/MM/yyyy"/> 11 </component> 12 <component id="dateEnd" type="DatePicker"> 13 <binding name="value" value="dateEnd"/> 14 <binding name="translator" value="translator:date,pattern=dd/MM/yyyy"/>
[ +/- ] Exception: Unable to update OGNL expression '<parsed OGNL expression>' of $DatePeriodPicker_1@9bd09361[Home/datePeriodPicker] to null: Method "setDateBegin" failed for object $DatePeriodPicker_1@9bd09361[Home/datePeriodPicker] org.apache.hivemind.ApplicationRuntimeException Unable to update OGNL expression '<parsed OGNL expression>' of $DatePeriodPicker_1@9bd09361[Home/datePeriodPicker] to null: Method "setDateBegin" failed for object $DatePeriodPicker_1@9bd09361[Home/datePeriodPicker] component: $DatePeriodPicker_1@9bd09361[Home/datePeriodPicker] location: context:/WEB-INF/Home.page, line 6, column 59 1 <?xml version="1.0"?> 2 <!DOCTYPE page-specification PUBLIC 3 "-//Apache Software Foundation//Tapestry Specification 4.0//EN" 4 "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd"> 5 <page-specification class="org.beq.tapestry.DatePeriodPickerDemo.Home"> 6 <component id="datePeriodPicker" type="DatePeriodPicker"> 7 <binding name="value" value="dateBegin"/> 8 <binding name="value" value="dateEnd"/> 9 </component> 10 <component id="form" type="Form"> 11 <binding name="listener" value="listener:onSubmit"/>
[ +/- ] Exception: Method "setDateBegin" failed for object $DatePeriodPicker_1@9bd09361[Home/datePeriodPicker] [ +/- ] Exception: Parameter 'dateBegin' is not bound and can not be updated. org.apache.hivemind.ApplicationRuntimeException Parameter 'dateBegin' is not bound and can not be updated. Stack Trace: $DatePeriodPicker_1.setDateBegin($DatePeriodPicker_1.java) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:532) ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:826) ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:978) ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:75) ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:131) ognl.OgnlRuntime.setProperty(OgnlRuntime.java:1670) ognl.ASTProperty.setValueBody(ASTProperty.java:101) ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:177) ognl.SimpleNode.setValue(SimpleNode.java:246) ognl.Ognl.setValue(Ognl.java:476) org.apache.tapestry.services.impl.ExpressionEvaluatorImpl.writeCompiled(ExpressionEvaluatorImpl.java:132) $ExpressionEvaluator_113196e125c.writeCompiled($ExpressionEvaluator_113196e125c.java) org.apache.tapestry.binding.ExpressionBinding.setObject(ExpressionBinding.java:170) $DatePicker_2.setValue($DatePicker_2.java) org.apache.tapestry.form.DatePicker.rewindFormComponent(DatePicker.java:198) org.apache.tapestry.form.AbstractFormComponent.renderComponent(AbstractFormComponent.java:94) org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:710) org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:174) org.apache.tapestry.BaseComponent.renderComponent(BaseComponent.java:92) org.beq.tapestry.components.DatePeriodPicker.renderComponent(DatePeriodPicker.java:33) org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:710) org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:174) org.apache.tapestry.AbstractComponent.renderBody(AbstractComponent.java:523) org.apache.tapestry.form.FormSupportImpl.rewind(FormSupportImpl.java:612) org.apache.tapestry.form.Form.renderComponent(Form.java:205) org.apache.tapestry.AbstractComponent.render(AbstractComponent.java:710) org.apache.tapestry.services.impl.DefaultResponseBuilder.render(DefaultResponseBuilder.java:174) org.apache.tapestry.form.Form.rewind(Form.java:278) org.apache.tapestry.engine.RequestCycle.rewindForm(RequestCycle.java:460) org.apache.tapestry.form.Form.trigger(Form.java:289) org.apache.tapestry.engine.DirectService.triggerComponent(DirectService.java:170) org.apache.tapestry.engine.DirectService.service(DirectService.java:146) $IEngineService_113196e11ce.service($IEngineService_113196e11ce.java) org.apache.tapestry.services.impl.EngineServiceOuterProxy.service(EngineServiceOuterProxy.java:72) org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:246) org.apache.tapestry.services.impl.InvokeEngineTerminator.service(InvokeEngineTerminator.java:54) $WebRequestServicer_113196e11a5.service($WebRequestServicer_113196e11a5.java) $WebRequestServicer_113196e11a1.service($WebRequestServicer_113196e11a1.java) org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.service(WebRequestServicerPipelineBridge.java:61) $ServletRequestServicer_113196e1187.service($ServletRequestServicer_113196e1187.java) org.apache.tapestry.request.DecodedRequestInjector.service(DecodedRequestInjector.java:55) $ServletRequestServicerFilter_113196e1183.service($ServletRequestServicerFilter_113196e1183.java) $ServletRequestServicer_113196e1189.service($ServletRequestServicer_113196e1189.java) org.apache.tapestry.multipart.MultipartDecoderFilter.service(MultipartDecoderFilter.java:52) $ServletRequestServicerFilter_113196e1181.service($ServletRequestServicerFilter_113196e1181.java) $ServletRequestServicer_113196e1189.service($ServletRequestServicer_113196e1189.java) org.apache.tapestry.services.impl.SetupRequestEncoding.service(SetupRequestEncoding.java:53) $ServletRequestServicerFilter_113196e1185.service($ServletRequestServicerFilter_113196e1185.java) $ServletRequestServicer_113196e1189.service($ServletRequestServicer_113196e1189.java) $ServletRequestServicer_113196e0ff5.service($ServletRequestServicer_113196e0ff5.java) org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java:123) org.apache.tapestry.ApplicationServlet.doPost(ApplicationServlet.java:168) javax.servlet.http.HttpServlet.service(HttpServlet.java:709) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) java.lang.Thread.run(Thread.java:619)
|
Дело в том что с Tapestry Только начал разбираться, но этот setDateBegin меня уже достал. Я не могу понять толи из компонента нельзя возвращать 2 значения то-ли что. Подскажите пожалуйста в чем может быть трабла или хотя бы в какую сторону копать? Я уже и убирал описание методов getBeginDate, getEndDate из Home.java и делал getDatePeriodPicker естественно описав его в Home.page - не помогает! Я в отчаянии. Это сообщение отредактировал(а) Strange74 - 11.6.2007, 09:35
|