首页 > 其他 > 详细

Tapestry 4.* 版本 如何自定义组件

时间:2014-03-08 01:40:44      阅读:549      评论:0      收藏:0      [点我收藏+]
请参考tapestry官方文档中的一篇文章Creating Tapestry components 

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

一、首先是搭建一个简单的环境 

参见tapestry的hello world程序 

1. 新建一个web项目 

2. 把jar包copy到lib目录下 

3. 在web.xml中配置tapestry 
Xml代码  bubuko.com,布布扣
  1. <servlet>  
  2.   <servlet-name>t4</servlet-name>  
  3.   <servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>  
  4.   <load-on-startup>0</load-on-startup>  
  5. </servlet>  
  6. <servlet-mapping>  
  7.   <servlet-name>t4</servlet-name>  
  8.   <url-pattern>/app</url-pattern>  
  9. </servlet-mapping>  


4. 在WebRoot目录下新建一个Home.html 
Html代码  bubuko.com,布布扣
  1. <html>  
  2. <head>  
  3. <title>Home.html</title>  
  4. </head>     
  5. <body>  
  6. <span jwcid="@Insert" value="ognl:new java.util.Date()"></span>  
  7. </body>  
  8. </html>       


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

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


二、创建一个名叫Test的组件 

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

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

1. 新建一个Test.java 

继承自org.apache.tapestry.AbstractComponent类,然后Override一个方法叫renderComponent 
Java代码  bubuko.com,布布扣
  1. package huxiao.components.test;  
  2.   
  3. import org.apache.tapestry.AbstractComponent;  
  4. import org.apache.tapestry.IMarkupWriter;  
  5. import org.apache.tapestry.IRequestCycle;  
  6.   
  7. public abstract class Test extends AbstractComponent {  
  8.   
  9.     @Override  
  10.     protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) {  
  11.           
  12.     }  
  13.   
  14. }  


2. 在WEB-INF目录下新建一个文件叫Test.jwc,内容如下: 
Xml代码  bubuko.com,布布扣
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE component-specification PUBLIC  
  3.   "-//Apache Software Foundation//Tapestry Specification 4.0//EN"  
  4.   "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">  
  5. <component-specification allow-body="yes" allow-informal-parameters="yes" class="huxiao.components.test.Test">  
  6. </component-specification>  

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

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

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

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

4. 修改Test.jwc,配置了两个parameter,link和value,其中link配置为required="yes",value为不必须,如果配置为必须又不写这个参数的话,会报一个没有传参数的exception 
Xml代码  bubuko.com,布布扣
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE component-specification PUBLIC  
  3.   "-//Apache Software Foundation//Tapestry Specification 4.0//EN"  
  4.   "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">  
  5. <component-specification allow-body="yes" allow-informal-parameters="yes" class="huxiao.components.test.Test">  
  6.     <parameter name="link" required="yes"/>  
  7.     <parameter name="value" required="no"/>  
  8. </component-specification>  



5. 修改Test.java 
Java代码  bubuko.com,布布扣
  1. package huxiao.components.test;  
  2.   
  3. import org.apache.tapestry.AbstractComponent;  
  4. import org.apache.tapestry.IMarkupWriter;  
  5. import org.apache.tapestry.IRequestCycle;  
  6.   
  7. public abstract class Test extends AbstractComponent {  
  8.   
  9.     public abstract String getLink();  
  10.     public abstract String getValue();  
  11.   
  12.     @Override  
  13.     protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) {  
  14.         /** 
  15.          * 表示新建一个标签a,所以说,我们完全可以根据我们获取的一个参数来决定新建什么标签 
  16.          * 比如<span jwcid="@Test" tag="div" />,然后根据tag的值来定新建什么参数, 
  17.          * 我这里就需要一个a,所以新建a了 
  18.          */  
  19.         writer.begin("a");  
  20.         /** 
  21.          * 新建一个属性href,值为getLink(),这个getLink()对应上面的public abstract String getLink()方法 
  22.          */  
  23.         writer.attribute("href", getLink());  
  24.         //同上  
  25.         writer.print(getValue());  
  26.         /** 
  27.          * 有两个方法,一个是这个,另一个是renderBody(IMarkupWriter writer, IRequestCycle cycle) 
  28.          * 区别在于,如果是成对的标签<span>ddd</span>,那么renderBody把标签中间的值放回原位, 
  29.          * 我表达的可能不清楚,大家试一下就知道了 
  30.          */  
  31.         renderInformalParameters(writer, cycle);  
  32.         //关闭writer  
  33.         writer.close();  
  34.     }  
  35.   
  36. }  


6. 刷新页面,可以看到我们想要的效果了 


三、使用标签库,或者叫命名空间是不是更合适些?whatever 

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

1. 在WEB-INF下面新建一个配置文件t4.application 
Xml代码  bubuko.com,布布扣
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE application PUBLIC   
  3.   "-//Apache Software Foundation//Tapestry Specification 4.0//EN"   
  4.   "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">  
  5.     
  6. <application>    
  7.     <library id="hx" specification-path="/huxiao/components/my.library"/>  
  8. </application>  

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

2. so,我们自然也要在刚才那个路径下面新建这个文件了my.library 
Xml代码  bubuko.com,布布扣
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE library-specification PUBLIC "-//Apache Software Foundation//Tapestry Specification 4.0//EN"  
  3.   "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">  
  4. <library-specification>  
  5.     <component-type type="Test" specification-path="test/Test.jwc"/>  
  6.       
  7. </library-specification>  

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

3. 测试 
ok,重启运行一下,效果不变 

done! 

Tapestry 4.* 版本 如何自定义组件,布布扣,bubuko.com

Tapestry 4.* 版本 如何自定义组件

原文:http://blog.csdn.net/hello_world_it/article/details/20712853

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!