`
ybhuxiao
  • 浏览: 193277 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
请参考tapestry官方文档中的一篇文章Creating Tapestry components

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


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

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

参见tapestry的hello world程序

1. 新建一个web项目

2. 把jar包copy到lib目录下

3. 在web.xml中配置tapestry
  <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>


4. 在WebRoot目录下新建一个Home.html
<html>
<head>
<title>Home.html</title>
</head>   
<body>
<span jwcid="@Insert" value="ognl:new java.util.Date()"></span>
</body>
</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
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) {
		
	}

}



2. 在WEB-INF目录下新建一个文件叫Test.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="yes" allow-informal-parameters="yes" class="huxiao.components.test.Test">
</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 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>



5. 修改Test.java
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();
	}

}



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


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

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

1. 在WEB-INF下面新建一个配置文件t4.application
<?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的名字了。后面的是路径

2. so,我们自然也要在刚才那个路径下面新建这个文件了my.library
<?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

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

done!

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

四、reference

Creating Tapestry components



0
2
分享到:
评论

相关推荐

    tapestry5 自定义组件

    在 Tapestry 5 框架中,自定义组件是扩展其功能的关键方式,它允许开发者根据特定需求创建个性化和可重用的 UI 元素。Tapestry 5 是一个强大的 Java Web 应用程序开发框架,它强调组件化、模块化以及声明式编程模型...

    Tapestry简单入门.rar_java Tapestry_tapestry

    你可以直接使用这些组件,也可以根据需求自定义组件。自定义组件通常涉及以下几个方面: 1. **组件类**:定义组件的Java类,实现其逻辑。 2. **模板文件**:使用HTML和特殊的Tapestry标记来描述组件的外观。 3. **...

    tapestry4开发指南

    在深入探讨Tapestry 4的编程模型时,读者将学习如何使用Ivy或Maven来管理依赖,理解配置文件的结构,以及如何编写自定义组件。此外,书中还会涉及组件库的使用,包括内置的表单组件、导航组件等,这些组件可以帮助...

    深入浅出Tapestry4一书源代码(2)

    当用户在页面上进行操作时,如点击按钮或提交表单,Tapestry会触发相应的事件,然后调用对应的事件处理方法。这种模型使得开发者能够轻松地响应用户的交互行为,无需编写大量的JavaScript代码。 在"深入浅出...

    tapestry4.02中封装ext的GridPanel组件

    在`GridPanel.java`中,会定义Tapestry组件的Java类,包括属性、方法和事件处理逻辑。 3. **配置模板**:编写对应的HTML/TML模板文件,如`GridPanel.tml`,在这个模板中,可以通过Tapestry的标记语言来创建...

    tapestry4和5学习资料

    这份文档可能包含了一些关键或高级的主题,比如性能优化、安全策略、自定义组件开发、MVC模式在Tapestry中的应用等。它是进一步提升Tapestry开发技能的重要参考资料。 6. **tapestry用户手册.pdf**: 用户手册...

    Tapestry4开发指南

    每个Tapestry页面和组件都有其生命周期,包括初始化、渲染和服务方法调用等阶段。理解这些生命周期对于正确设计和优化组件至关重要。 6. **模板语言和组件API** Tapestry4使用特殊的HTML模板语言,允许在HTML中...

    tapestry官方中文文档及中文字典

    3. **组件创建**:介绍Tapestry的组件模型,如何创建自定义组件,以及使用内置组件如表单、链接等。 4. **页面和组件生命周期**:解释页面和组件的生命周期方法,如构造器、初始化和销毁方法。 5. **事件处理和数据...

    tapestry4 深入浅出 水果店实例

    - 探索Tapestry4的组件库,了解更多的内置组件和如何自定义组件。 通过这个水果店实例,你可以深入理解Tapestry4的框架结构和工作流程,从而更好地应用于实际的Web开发项目。在实践中不断修正和优化,你将对...

    tapestry 实例

    3. **事件驱动**:Tapestry 采用事件驱动模型,用户操作可以触发组件内的事件,进而调用相应的处理方法。这种方式简化了页面与服务器间的交互逻辑。 4. **模板和元数据**:每个组件都有一个HTML模板,用于定义组件的...

    tapestry-project-4.1.5

    在实际应用中,Tapestry 提供了丰富的内置组件,如表格、表单、链接等,同时支持自定义组件,扩展性极强。它的模板语言结合了HTML 和Java 代码,使得界面设计与逻辑控制相分离,提高了开发效率。此外,Tapestry 还...

    关于Tapestry的一些个人总结

    6. **自定义组件**:除了使用内置的组件之外,开发者还可以根据自己的需求创建自定义组件。这些组件可以继承自`BaseComponent`,并通过Java类进行实现。 #### 四、Tapestry与其他Web框架的对比 目前主流的Web框架...

    tapestry4.02中封装ext的TabPanel组件

    使用这些文件,开发者可以创建一个完全自定义的TabPanel组件,包括自定义标签、动态加载内容、以及响应用户操作的逻辑。Tapestry的强类型和事件驱动特性使得组件的维护和扩展变得容易,而Ext TabPanel则提供了优秀的...

    tapestry table

    一个关于table在tapestry里应用的例子

    Tapestry

    开发者通常不会直接实现这些接口,而是继承如`AbstractComponent`或`BaseComponent`这样的基础类来创建自定义组件。`IRequestCycle`、`IMarkupWriter`和`IEngine`是三个重要的接口,它们分别处理请求周期管理、HTML...

    Tapestry 重要资料 教你认识tapestry

    3. **BaseComponent类**:扩展了AbstractComponent,添加了模板定位和读取功能,大多数自定义组件会继承它。 4. **IPage接口**:表示Tapestry页面,通常会继承自BasePage。 5. **IRequestCycle, IMarkupWriter, ...

    tapestry的文档

    在学习过程中,开发者会了解到如何使用Tapestry的组件进行页面布局、如何通过tapestry组件实现数据的增删改查操作、如何通过tapestry的LinkSubmit组件实现表单提交、如何进行表单验证以及如何使用tapestry的上传组件...

    Tapestry开发

    4. **动态页面渲染:**Tapestry支持动态页面渲染,允许开发者根据用户的操作实时更新页面内容。 #### 二、Tapestry开发指南概述 ##### 第一节:Tapestry基础概念 **1. Web框架需求背景:** - **跨应用重用困难:...

    Tapestry In Action

    - **自定义组件**:教授如何创建自定义表单组件,以满足特定业务需求。包括组件的设计原则、开发流程以及如何实现复杂数字输入等。 - **组件库集成**:介绍了如何集成现有的第三方组件库到Tapestry应用中,以扩展...

Global site tag (gtag.js) - Google Analytics