- 浏览: 94338 次
- 性别:
- 来自: 农村
-
文章分类
最新评论
-
netmanager:
刚接触,正因这个东西而抓狂中。。。。
自助建站工具--TRS -
1d7500:
讲的不是很详细哦 每个标签里的参数都没有说。。。 谁知道哪 ...
struts2.0的标签库(简介) -
summerkai:
// implements IExternalPage
pu ...
tapestry一个方法中从一个页面向不同页面的跳转问题 -
summerkai:
throw new RedirectException(((M ...
tapestry一个方法中从一个页面向不同页面的跳转问题 -
keke020:
keke020 写道window.dialogArgument ...
showModalDialog和showModelessDialog使用心得
开发好控件的管理:
对于自己开发的控件,我们要把它管理起来,以便在以后的开发流程中使用,
我的在这里谈谈如何管理自己开发的控件的问题。具体的方法就是把它归档到一个library
里去。
比如我开发了一些控件,我就把它归档到一个叫Common.library的xml文档里去。
Common.library
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE library-specification PUBLIC
"-//Apache Software Foundation//Tapestry Specification 3.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd>
<library-specification>
<!-- Library Section-->
<library id="contrib" specification-path="/org/apache/tapestry/contrib/Contrib.library"/>
<library id="basic" specification-path="/com/ht/components/basic/Basic.library"/>
<!-- Add more libraries here.-->
<!-- End of Library Section-->
<component-type type="TabPanel" specification-path="tabpanel/TabPanel.jwc"/>
<component-type type="Border" specification-path="border/Border.jwc"/>
<component-type type="ToolItem" specification-path="toolbar/ToolItem.jwc"/>
<component-type type="ToolBar" specification-path="toolbar/ToolBar.jwc"/>
<component-type type="AnchorDirect" specification-path="tree/components/AnchorDirect.jwc"/>
<component-type type="TreeDataView" specification-path="tree/components/TreeDataView.jwc"/>
<component-type type="TreeHeaders" specification-path="tree/components/TreeHeaders.jwc"/>
<component-type type="TreeNodeView" specification-path="tree/components/TreeNodeView.jwc"/>
<component-type type="TreeView" specification-path="tree/components/TreeView.jwc"/>
<component-type type="FileList" specification-path="table/FileList.jwc"/>
<component-type type="WrapInsertText" specification-path="wraptext/WrapInsertText.jwc"/>
<component-type type="HighlightInsertText" specification-path="highlight/HighlightInsertText.jwc"/>
<component-type type="DefaultTableColumnComponent" specification-path="table/DefaultTableColumnComponent.jwc"/>
<component-type type="AlignRightTableColumnComponent" specification-path="table/AlignRightTableColumnComponent.jwc"/>
<component-type type="DefaultTableColumns" specification-path="table/DefaultTableColumns.jwc"/>
</library-specification>
<libray-specification>包含两种元素
一种是library<library id="contrib" specification-path="/org/apache/tapestry/contrib/Contrib.library"/>
因为如果被归档的控件还引用到其他的被归档的控件(控件库),就必须在这里包含进来。
例外一种是
<component-type type="ToolBar" specification-path="toolbar/ToolBar.jwc"/>
就是被归档的控件项定义,这句我们应该有印象,这个控件就是我们前面讨论的ToolBar
注意这个specification-path是相对路径。
比如我的Common.library位于com.ht.components包内,而那个ToolBar.jwc位于com.ht.components.toolbar包内。
页面的开发:
我的Web Application只支持英语和简体中文,以开发Home页为例,我所需要新建的文件
为:
Home.java
Home.page
Home.properties
Home_zh_CN.properties
它们都位于com.ht.home包内,对应的目录为F:\myproject\TapestryExmaple\src\
com\ht\home
Home.html
它位于context下home目录内,对应的目录为F:\myproject\TapestryExmaple\context\home
我的例程为:
Home.java
package com.ht.home;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.tapestry.engine.AbstractEngine;
import org.apache.tapestry.html.BasePage;
import com.ht.web.PatientRecordBasePage;
import com.ht.web.PatientRecordEngine;
import com.ht.components.tabpanel.*;
/**
* @author Hery Tang
*
* Creation Date 2003-9-22
* Version 1.0
*/
public class Home extends PatientRecordBasePage {
public void logout() {
PatientRecordEngine engine = (PatientRecordEngine) getEngine();
engine.logout();
}
}
Home.page
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE page-specification PUBLIC
"-//Apache Software Foundation//Tapestry Specification 3.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd>
<page-specification class="com.ht.home.Home">
<component id="border" type="common:Border">
<message-binding name="title" key="title"/>
<binding name="styleSheet" expression="assets.test"/>
</component>
<context-asset name="$template" path="home/Home.html"/>
<context-asset name="menuIcon" path="home/images/homeIcon.gif"/>
<context-asset name="test" path="home/css/test.css"/>
</page-specification>
Home_zh_CN.properties
menuText=首页
title=首页
actionListener.logout.menuText=注销
welcome=欢迎
welcomeDetail=欢迎使用web病历管理系统,这是一套基于网络的B/S结构的病历管理服务系统,功能新颖,界面友好,欢迎使用。
Home.properties
title=Home
menuText=Home
actionListener.logout.menuText=Logout
welcome=Welcome
welcomeDetail=Welcome to use Web Document Manage System.This system based on B/S network structure, it provides internal documents' management for your company. It's document directory organized as that: a department as a unit, departments can share documents each other. Meanwhile, it provides detailed document version control.
Home.html
<span jwcid="border">
<table align="center" width="100%" height="100">
<tr>
<!-- ========================== START MID COL ======================= -->
<td VALIGN="TOP" width='100%'>
<table width='100%' cellpadding='0' cellspacing='0' border='0'>
<tr>
<td width='10'><img src='home/images/pixel.gif' width='10' height='1' alt='-'></td>
<td width='100%'><img src='home/images/welcome_head_icon.gif' ALIGN="BOTTOM" WIDTH="16" HEIGHT="16" ALT="Welcome!"> <font class='h2' style='color: #080c77;'><span key="welcome">Welcome</span></font></td>
<td width='10'><img src='home/images/pixel.gif' width='10' height='1' alt='-'></td>
</tr>
<tr>
<td height='5' colspan='3' valign='top'><img src='home/images/head_home_line.gif' width='254' height='5' alt='-'></td>
</tr>
<tr>
<td height='5' colspan='3' bgcolor='#ffffff'><img src='home/images/pixel.gif' width='1' height='5' alt='-'></td>
</tr>
<tr>
<td width='10' bgcolor='#ffffff'><img src='home/images/pixel.gif' width='10' height='1' alt='-'></td>
<td width='100%' bgcolor='#ffffff'>
<span key="welcomeDetail">Welcome to use Web Document Manage System.This system based on B/S network structure, it provides internal documents' management for your company. It's document directory organized as that: a department as a unit, departments can share documents each other. Meanwhile, it provides detailed document version control.</span>
</td>
<td width='10' bgcolor='#ffffff'><img src='home/images/pixel.gif' width='10' height='1' alt='-'></td>
</tr>
<tr>
<td height='5' colspan='3' bgcolor='#ffffff'><img src='home/images/pixel.gif' width='1' height='5' alt='-'></td>
</tr>
</table>
</td>
</tr>
</table>
</span>
对于页面的开发,有几个值得讨论的问题,
一 框架化的页面怎么实现
这个很简单,你只要开发一个控件,预先定义好一个显示框架,我就是这么做的,我开发了一个叫Border的控件,然后把变动的显示作为Border可变的内容输出。
你看我的 Home.html,它被<span jwcid="border">**</span>所包围,我的Border控件负责
显示每页确定的内容,变动的则只在Border的一个预定的区域显示。
二 国际化怎么办
Tapestry国际化非常简单,例如英文我要显示welcome,中文显示欢迎
只须这样就行:
<span key="welcome">Welcome</span>(中间的Welcome是预览hmtl用的没有
别的意义),然后你在home.properties设定key-value对为: welcome=Welcome
在Home_zh_CN.properties设定为: welcome=欢迎,不过最后打包时你要将你的
Home_zh_CN.properties用jdk的bin目录下的native2ascii命令转化一下,不然会
显示成乱码。
我们来分析一下Home.page
<page-specification class="com.ht.home.Home">
声明本页对应的class为com.ht.home.Home
<component id="border" type="common:Border">
<message-binding name="title" key="title"/>
<binding name="styleSheet" expression="assets.test"/>
</component>
声明并配置一个Border类型的控件
<message-binding name="title" key="title"/>
指定了本页的title
binding name="styleSheet" expression="assets.test"/>
指定了本页应用的StyleSheet资源
<context-asset name="$template" path="home/Home.html"/>
指定了Home页的模版为home/Home.html
<context-asset name="menuIcon" path="home/images/homeIcon.gif"/>
声明一个context-asset(图标)
<context-asset name="test" path="home/css/test.css"/>
声明一个context-asset(Stylesheet),被上面的Border控件引用
最后讲讲划分子模块的问题:
比如我的Web Application包含两个子模快home, patientrecord,
home对应的包为com.ht.home,绝对路径为F:\myproject\TapestryExmaple\src\
com\ht\home,对应的context目录为home,绝对路径为F:\myproject\
TapestryExmaple\context\home
patientrecord对应的包为com.ht.patientrecord,绝对路径为F:\myproject\TapestryExmaple\src\com\ht\patientrecord,
对应的context目录为patientrecord,绝对路径为F:\myproject\
TapestryExmaple\context\patientrecord
home模块下的页面有
Home,Register,Login,About,PaitentRecordException,SecurityException
patientrecord模块下的页面有
Browser,Create,AddTreatment,AddExamination,AddOperation,AddOperationVisit,AddOperationVisit,AddComment
我需要将这些页面归档,所以对应home子模块有Home.libray,对应于patientrecord
有PatientRecord.library
Home.library的位于com.ht.home包下,
PatientRecord.library位于com.ht.patientrecord包下
他们分别为
Home.library
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE library-specification PUBLIC
"-//Apache Software Foundation//Tapestry Specification 3.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd>
<library-specification>
<!-- Library Section-->
<library id="contrib" specification-path="/org/apache/tapestry/contrib/Contrib.library"/>
<library id="common" specification-path="/com/ht/components/Common.library"/>
<!-- Add more libraries here.-->
<!-- End of Library Section-->
<page name="Home" specification-path="Home.page"/>
<page name="Register" specification-path="Register.page"/>
<page name="Login" specification-path="Login.page"/>
<page name="About" specification-path="About.page"/>
<page name="PaitentRecordException" specification-path="PRException.page"/>
<page name="SecurityException" specification-path="SecurityExceptionPage.page"/>
</library-specification>
PatientRecord.library
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE library-specification PUBLIC
"-//Apache Software Foundation//Tapestry Specification 3.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd>
<library-specification>
<!-- Library Section-->
<library id="contrib" specification-path="/org/apache/tapestry/contrib/Contrib.library"/>
<library id="common" specification-path="/com/ht/components/Common.library"/>
<!-- Add more libraries here.-->
<!-- End of Library Section-->
<page name="Browser" specification-path="Browser.page"/>
<page name="Create" specification-path="Create.page"/>
<page name="AddTreatment" specification-path="AddTreatment.page"/>
<page name="AddExamination" specification-path="AddExamination.page"/>
<page name="AddOperation" specification-path="AddOperation.page"/>
<page name="AddOperationVisit" specification-path="AddOperationVisit.page"/>
<page name="AddComment" specification-path="AddComment.page"/>
</library-specification>
最后我们再看一下patientrecord.application这个Tapestry Web 应用核心配置文件:
patientrecord.application
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC
"-//Apache Software Foundation//Tapestry Specification 3.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd>
<application name="Patient Record System" engine-class="com.ht.web.PatientRecordEngine">
<property name="org.apache.tapestry.visit-class" value="com.ht.web.VisitorState"/>
<property name="com.ht.home-page" value="home:Home"/>
<!--<property name="com.ht.exception-page" value="home:PaitentRecordException"/>-->
<property name="com.ht.security-exception-page" value="home:SecurityExceptionPage"/>
<!--Overrided the Home Service to let us to decide which page will be the home page-->
<service name="home" class="com.ht.web.HomeService"/>
<library id="home" specification-path="/com/ht/home/Home.library"/>
<library id="patientrecord" specification-path="/com/ht/patientrecord/PatientRecord.library"/>
</application>
看看最后两行
<library id="home" specification-path="/com/ht/home/Home.library"/>
<library id="patientrecord" specification-path="/com/ht/patientrecord/PatientRecord.library"/>
我们把那两个libary文件包含进来了,分别对应id为home, patientrecord
,我们要在程序里激活Home页,则只需
得一个IRequestCycle对象cycle
cycle.activate("home:Home");
注意“home:Home“,前一个home是library name,后一个是Page name.这是Tapestry
自定义的名字访问法则。
以上,是我开发Tapestry Web Application的一点心得体会,欢迎讨论批评.
发表评论
-
Tapestry和Hivemind的出现
2008-06-24 10:04 1625Howard Lewis Ship从13岁起就义无反顾的沉迷于 ... -
了解 Tapestry【转】
2008-06-24 09:10 1015在这篇由两部分构成的文章的前一部分中,作者兼 develope ... -
下一代WEB开发模式Tapestry简介[转]
2008-06-24 08:54 1039前言 由于internet技 ... -
后台信息审核的例子
2008-06-06 17:07 1126晚上回家写 -
tapestry4.1中的Autocompleter的用法-转
2008-04-29 09:41 981用tapestry4.1中的dojo的Autocomplete ... -
tapestry一个方法中从一个页面向不同页面的跳转问题
2008-04-08 10:20 1397public abstract YearSelect getY ... -
Tapestry的函数执行顺序[转]
2008-04-01 09:29 9081、protected void finishLoad() { ... -
tapestry的列表
2008-03-30 10:49 1697tapestry的列表有两种, ... -
Tapestry实现文件上传与下载
2008-03-30 10:48 1300开发工具:(转) 1。eclipse3.0 + spindle ...
相关推荐
在Android应用开发中,自定义组件是提升用户体验和实现独特设计的重要手段。本文将深入探讨Android自定义组件的开发过程,旨在帮助开发者更好地理解和实践这一关键技能。 首先,理解Android组件的基本概念至关重要...
Android自定义组件开发的学习过程中,可能会遇到各种挑战,如性能优化、内存管理、线程同步等问题。开发者需要具备扎实的Java基础和面向对象编程思想,同时了解Android系统架构和生命周期管理。 在学习资源方面,...
优秀的自定义组件不仅需要提供丰富的功能,同时也应当具有高效的运行效率和良好的资源管理。总之,自定义组件开发是一项挑战和机遇并存的技术领域,对于有志于成为Android领域专家的开发者来说,深入学习和实践...
使用微搭自定义组件实现搜索组件 微搭作为一款低代码开发平台,可以...使用微搭自定义组件,可以快速实现搜索组件,提高开发效率和灵活性。微搭提供了自定义组件的能力,支持低码组件和源码组件,满足开发者的需求。
在React开发中,组件化是核心特性之一,它允许我们将应用拆分成独立、可复用的部件,提高代码的组织性和可维护性。本案例中,我们关注的是一个使用TypeScript(ts)和React的JSX语法(tsx)实现的自定义日期选择组件...
在Android开发中,自定义组件是提升应用独特性和性能的重要手段。这个"android自定义组件demo"实例提供了三种自定义组件的示例,是学习和理解Android自定义组件的一个宝贵资源。下面我们将深入探讨这三个自定义组件...
在实际开发中,我们还可能遇到一些高级话题,如组件的皮肤ning(Skinning)、状态管理(States)以及组件的性能优化。组件皮肤ning允许我们更改组件的外观,而无需更改其行为。状态管理则让我们能够根据组件的不同...
Flex中的高级自定义组件开发是构建复杂用户界面的关键技术,它允许开发者超越基本组件的限制,以满足特定的业务需求和视觉设计。在创建高级组件时,了解并掌握一些核心方法的重写至关重要,这些方法涉及到组件的生命...
QT自定义分页组件是软件开发中常见的设计模式,特别是在GUI应用中,用于展示大量数据时,分页能有效提高用户体验。在这个项目中,我们有`qt自定义分页组件源代码`,它包含了实现这一功能的核心源码和测试代码。下面...
ASP.NET自定义控件组件开发是一项关键技能,用于构建具有特定功能和外观的网页界面元素。自定义控件能够满足开发者对于网站个性化和扩展性的需求,使得开发者可以根据项目需求定制功能,提高代码重用率,简化开发...
**JSF自定义组件开发详解** JavaServer Faces (JSF) 是一个用于构建Web应用程序的Java框架,它提供了一种模型-视图-控制器(MVC)架构来简化开发过程。在JSF中,自定义组件是扩展其功能的关键部分,允许开发者根据...
总的来说,Qt美化界面和组件源码的学习,包括了理解QSS、自定义组件、信号与槽机制以及布局管理等多方面的内容。掌握这些技能,开发者可以创造出既美观又实用的Qt应用程序,提升用户的操作体验。对于想要深入Qt开发...
总的来说,微信小程序自定义表格组件的开发涵盖了小程序的基础知识,如组件、样式、事件处理和数据管理。通过合理的组件化设计和性能优化,我们可以构建出符合业务需求且用户体验良好的表格组件,充分展示小程序的轻...
在Android开发中,自定义组件是提升应用独特性和用户体验的关键技术。自定义组件允许开发者根据需求扩展Android系统原生组件的功能,或者创建全新的组件样式,从而实现个性化界面和交互效果。下面将详细介绍Android...
Tapestry 5 是一个强大的 Java Web 应用程序开发框架,它强调组件化、模块化以及声明式编程模型,从而提高开发效率和代码可维护性。下面我们将详细讨论如何在 Tapestry 5 中自定义邮件组件。 首先,自定义组件通常...
压缩包中的"Swing开发的一些JAVA常用窗口编程组件源码"提供了实际的代码示例,可以从中学到如何实现具体的自定义组件。通过阅读和理解这些源码,你可以加深对Swing组件自定义的理解,并将其应用到自己的项目中。 总...
本文将深入探讨“FLASH自定义组件”的相关知识点,帮助读者理解如何利用Flash ActionScript 3.0(AS3)创建自己的组件,并进行实际操作。 **自定义组件的基本概念** 在Flash中,组件是可重用的UI元素,例如按钮、...
自定义单选按钮组控件可以提供更好的布局和管理,比如将一组单选按钮包装在一个容器中,统一设置样式。通过响应RadioButton的CheckedChanged事件,可以确保组内只有一个选项被选中。 4. **复选框反选组**: 这种...
通过创建自定义组件,我们可以将复杂的用户界面分解为一系列独立的、易于管理的部分,从而提高代码的可读性和维护性。本教程将深入讲解如何在Vue中编写自定义组件,并提供一个实际的实例。 一、Vue组件基础 1. ...