Saturday, October 25, 2008

Usage of MarkupWriter and Element in Tapestry5

可以在 @BeginRender 或者 @AfterRender 等 Annotation 声明过的方法内注入 MarkupWriter,用其以 XML 形式组织成一个 DOM 对象来渲染 Tapestry 组件,或者用其调整页面模板中的某个Element,修改其内容或者属性。可以通过 MarkupWriter 接口或者是 Element 类提供的方法操作这个 DOM 对象。
做一个Tapestry input组件的简单例子,无需模板文件:

public void afterRender(MarkupWriter writer) {
Element input = writer.element("input", "id", "input1", "name", "inputName", "value", "inputValue");
input.attribute("type", "text");
writer.end();
}
其中要注意如果用writer.element()打开一个元素标签时,要用writer.end()方法关闭此元素标签。
也可以在 Tapestry Page Class 中可以动态修改其模板文件,如下例子修改页面模板中一个div的文字内容和div属性。
page:
import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.dom.Element;

public class Test {

public void afterRender(MarkupWriter writer) {
Element elem = writer.getDocument().getElementById("elemId");
elem.text(" This text added by Element.text method.");
elem.attribute("style", "border: #ddd 1px solid");
}
}
tml:
<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
<div id="elemId">old inner text.</div>
</html>

在Tapestry5中,假如一个render方法名即符合Tapestry5的命名约定,又对方法做了Annotation声明,当二者不一致时,则此方法在二个render阶段都会被调用。
例如一个方法名叫afterRender,同时在方法中加了@BeginRender的修饰,则此方法在beginRender和afterRender这二个阶段都会被调用。
另外@Inject另外二个服务到页面中,也可以生成MarkupWriter对象,再用此对象操作模板。
@Inject
private ResponseRenderer responseRenderer;

@Inject
private MarkupWriterFactory factory;

如下方式在程序中也可得到MarkupWriter对象。
ContentType contentType = responseRenderer.findContentType(this);
MarkupWriter writer = factory.newMarkupWriter(contentType);

No comments :