Yes , you are right ,maybe using ComponentEventRequestHandler is the best way now . But I wish that the next version of tapestry will provide some service to render html more easily.^_^
The AjaxComponentEventRequestHandler is the key of partial-rendering , maybe I should spend much more time to study it someday. Here somebody named mindhawk provides another option: //-------------------------------------------------------------- 如果直接用renderqueue比较简单,不过可能有一些副作用,比如框架提供的安全检查和错误报告等都跳过啦。 If use renderqueue directly , it will be more simple , but has some negative effect , such as security checks and error reporting provided by the framework will be skiped . 下面给你一个简单的实现供你参考。 Here comes a simple implement for your reference 我定义了一个Tapestry的服务,负责渲染block或者rendercommand。 I define a tapestry services, for rendering the Block and Rendercommand AppModule ================= public static void bind(ServiceBinder binder) { binder.bind(RenderFacade.class, RenderFacade.class); //注册服务 } ================= RenderFacade ================= package com.once.tapestry.services; import java.io.PrintWriter; import java.io.StringWriter; import org.apache.tapestry5.Block; import org.apache.tapestry5.ContentType; import org.apache.tapestry5.MarkupWriter; import org.apache.tapestry5.internal.services.RenderQueueImpl; import org.apache.tapestry5.ioc.LoggerSource; import org.apache.tapestry5.ioc.services.TypeCoercer; import org.apache.tapestry5.runtime.RenderCommand; import org.apache.tapestry5.services.MarkupWriterFactory; import org.slf4j.Logger; /** * @author mindhawk * */ public class RenderFacade { private final MarkupWriterFactory markupWriterFactory; private final LoggerSource loggerSource; private final TypeCoercer typeCoercer; public RenderFacade(MarkupWriterFactory markupWriterFactory, LoggerSource loggerSource, TypeCoercer typeCoercer) { super(); this.markupWriterFactory = markupWriterFactory; this.loggerSource = loggerSource; this.typeCoercer = typeCoercer; } public String render(Block block) { RenderCommand command = typeCoercer.coerce(block, RenderCommand.class); return render(command); } public String render(RenderCommand command) { MarkupWriter writer = markupWriterFactory.newMarkupWriter(new ContentType("text/html;charset=UTF-8")); String name = "tapestry.render.CommandRender"; Logger logger = loggerSource.getLogger(name); RenderQueueImpl queue = new RenderQueueImpl(logger); queue.push(command); // Run the queue until empty. queue.run(writer); StringWriter stringWriter = new StringWriter(); PrintWriter pw = new PrintWriter(stringWriter); writer.toMarkup(pw); return stringWriter.toString(); } } ============== 下面给出测试页面 Now comes the test page RenderCommands (TML): ====================== <html title="About test" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter"> <body> <t:block t:id="b1"> <div>Hello world!</div> </t:block> <t:block t:id="b2"> <div>World peace!</div> </t:block> ${renderB1}<br/> ${renderB2} </body> </html> ====================== RenderCommands (Page): ====================== package com.once.tapestry.pages; import org.apache.tapestry5.Block; import org.apache.tapestry5.ioc.annotations.Inject; import com.once.tapestry.services.RenderFacade; public class RenderCommands { @Inject private Block b1; @Inject private Block b2; @Inject private RenderFacade renderFacade; public String getRenderB1() { return renderFacade.render(b1); } public String getRenderB2() { return renderFacade.render(b2); } } ======================= -- View this message in context: http://tapestry.1045711.n5.nabble.com/tapestry-push-proof-of-concept-tp5697644p5709898.html Sent from the Tapestry - User mailing list archive at Nabble.com. --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org