Tapestry4自定义组件的方法(操作篇)

请参考tapestry官方文档中的一篇文章[url=http://tapestry.apache.org/tapestry4/UsersGuide/components.html]Creating Tapestry components[/url]

我用的是tapestry 4.1.6,开发环境MyEclipse 6.5,容器是tomcat6


转载请注明:
原文地址:[url]http://huxiao.iteye.com/blog/641343[/url]

[size=large][color=red]一、首先是搭建一个简单的环境[/color][/size]

参见tapestry的[url=http://tapestry.apache.org/tapestry4/QuickStart/helloworld.html]hello world[/url]程序

[color=blue]1. 新建一个web项目[/color]

[color=blue]2. 把jar包copy到lib目录下[/color]

[color=blue]3. 在web.xml中配置tapestry[/color]

<servlet>
<servlet-name>t4</servlet-name>
<servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>t4</servlet-name>
<url-pattern>/app</url-pattern>
</servlet-mapping>


[color=blue]4. 在WebRoot目录下新建一个Home.html[/color]

<html>
<head>
<title>Home.html</title>
</head>
<body>
<span jwcid="@Insert" value="ognl:new java.util.Date()"></span>
</body>
</html>


[color=blue]5. 测试[/color]
这时候请使用http://localhost:8080/app访问(地址端口等如果你改了你自己看着搞)

如果能打印出一个时间(如Sun Apr 11 19:55:36 CST 2010)就算配置成功了


[color=red][size=large]二、创建一个名叫Test的组件[/size][/color]

我们的目的:使用这个标签<span jwcid="@Test" ...parameters... />,能出来一些我们想要的东西

首先,我们在Home.html中加上这一句,<span jwcid="@Test" />,访问,他会告诉你Exception: Component 'Test' not found in Namespace@4be179[<application>],这是当然的,因为我们还没有Test这个组件,当tapestry发现你用这个标签的时候,他回去WEB-INF下面去找,如果找不到,就会exception了

[color=blue]1. 新建一个Test.java[/color]

继承自org.apache.tapestry.AbstractComponent类,然后Override一个方法叫renderComponent

package huxiao.components.test;

import org.apache.tapestry.AbstractComponent;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRequestCycle;

public abstract class Test extends AbstractComponent {

@Override
protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) {

}

}



[color=blue]2. 在WEB-INF目录下新建一个文件叫Test.jwc,内容如下:[/color]

<?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="yes" allow-informal-parameters="yes" class="huxiao.components.test.Test">
</component-specification>

注意,其中class="huxiao.components.test.Test"是刚才的Test.java的全路径,这样就把两个文件关联起来了。

[color=blue]3. 测试:[/color]
重启tomcat,再访问,已经不报错了,这时候我们的组件其实已经ok了,但是现在他什么都还不能干

那么我们就来实现一个小小的功能吧,

当我输入<span jwcid="@Test" link="http://huxiao.iteye.com" value="huxiao" />的时候,输出一个连接<a href="http://huxiao.iteye.com">huxiao</a>

[color=blue]4. 修改Test.jwc,配置了两个parameter,link和value,其中link配置为required="yes",value为不必须,如果配置为必须又不写这个参数的话,会报一个没有传参数的exception[/color]

<?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="yes" allow-informal-parameters="yes" class="huxiao.components.test.Test">
<parameter name="link" required="yes"/>
<parameter name="value" required="no"/>
</component-specification>



[color=blue]5. 修改Test.java[/color]

package huxiao.components.test;

import org.apache.tapestry.AbstractComponent;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRequestCycle;

public abstract class Test extends AbstractComponent {

public abstract String getLink();
public abstract String getValue();

@Override
protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) {
/**
* 表示新建一个标签a,所以说,我们完全可以根据我们获取的一个参数来决定新建什么标签
* 比如<span jwcid="@Test" tag="div" />,然后根据tag的值来定新建什么参数,
* 我这里就需要一个a,所以新建a了
*/
writer.begin("a");
/**
* 新建一个属性href,值为getLink(),这个getLink()对应上面的public abstract String getLink()方法
*/
writer.attribute("href", getLink());
//同上
writer.print(getValue());
/**
* 有两个方法,一个是这个,另一个是renderBody(IMarkupWriter writer, IRequestCycle cycle)
* 区别在于,如果是成对的标签<span>ddd</span>,那么renderBody把标签中间的值放回原位,
* 我表达的可能不清楚,大家试一下就知道了
*/
renderInformalParameters(writer, cycle);
//关闭writer
writer.close();
}

}



[color=blue]6. 刷新页面,可以看到我们想要的效果了[/color]


[color=red][size=large]三、使用标签库,或者叫命名空间是不是更合适些?whatever[/size][/color]

到上面为止,我们已经自定义了标签,这一节,我们来让使用更为灵活

[color=blue]1. 在WEB-INF下面新建一个配置文件t4.application[/color]

<?xml version="1.0"?>
<!DOCTYPE application PUBLIC
"-//Apache Software Foundation//Tapestry Specification 4.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">

<application>
<library id="hx" specification-path="/huxiao/components/my.library"/>
</application>


其中hx,就是我们的library的名字了。后面的是路径

[color=blue]2. so,我们自然也要在刚才那个路径下面新建这个文件了my.library[/color]

<?xml version="1.0"?>
<!DOCTYPE library-specification PUBLIC "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
<library-specification>
<component-type type="Test" specification-path="test/Test.jwc"/>

</library-specification>

格式都是固定的,每新建一个component,添加一个<component-type />标签就ok了,刚才我们不是吧*.jwc文件都要放到WEB-INF下面吗?现在看到了吧,我们这里加一个specification-path属性之后,jwc文件就可以随意放置了,这样我们就可以把相应的jwc文件,java文件都放在一起,省的到处乱放了。而在WEB-INF下,我们只需要一个t4.application文件,即使你有n个components

[color=blue]3. 测试[/color]
ok,重启运行一下,效果不变

done!

----------------------------------------------------------------------

[color=red][size=large]四、reference[/size][/color]

[url=http://tapestry.apache.org/tapestry4/UsersGuide/components.html]Creating Tapestry components[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值