- 浏览: 189077 次
文章分类
最新评论
-
Ghostbb:
每次来都帮你点广告的说!哈哈!
Tapestry5开发系列:如何在Eclipse中运行jetty -
yhjhoo:
连有图片都没有啊
Tapestry5开发系列:如何在Eclipse中运行jetty -
yu_xian81:
mappedBy的是@OneToMany,也就是说One这一方 ...
Hibernate annotation的关系定义 -
biaoming:
我的也是出现找不到slf4j.logger问题.但我按楼主的图 ...
Tapestry5开发系列:如何在Eclipse中运行jetty -
KorbenZhang:
o,是我看的不仔细。不过我都是放在class相对应的资源包中。 ...
Tapestry5-如何在根目录下加载组件模板
Tapestry中构建选择列表需要使用IPropertySelectionModel,Model可以映射选择列表中的Label和Option,Tapestry中已经提供一个常用的StringSelectonModel,具体组件使用如下:<o:p></o:p>
Html代码<o:p></o:p>
Java代码
java 代码
- public abstract class DetailsPage extends BasePage {
- public static final IPropertySelectionModel GENDER_MODEL =
- new StringPropertySelectionModel(new String[] { "Unspecified", "Female", "Male" });
- public abstract String getGender();
- public void formSubmit(IRequestCycle cycle) {
- // Process form submission
- String genderSelection = getGender();
- ...
- }
- }
开发中比较常见的选择列表就是类别的选择,,一般是新建一个类别的SelectionModel,例如如下代码
java 代码
- public class TypeSelectionModel implements IPropertySelectionModel, Serializable {
- private List TypeList;
- public ItemSelectionModel(List typeList) {
- this. typeList = typeList;
- }
- public int getOptionCount() { return typeList.size(); }
- public Object getOption(int index) {
- return ((Type)typeList.get(index)).getId();
- }
- public String getLabel(int index) {
- return ((Type) typeList.get(index)).getName();
- }
- public String getValue(int index) { return Integer.toString(index); }
- public Object translateValue(String value) {
- return getOption(Integer.parseInt(value));
- }
- }
这只是传统方法,开发中的类别如果多了,每一个都要新建一个SelectionModel。
下面是在Tapestry JumpStart里看到的通用的SelectionModel,感觉比较不错,现介绍给大家,具体代码如下:
java 代码
- package com.javaeye.tapestrying.selectionModel;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.ArrayList;
- import java.util.List;
- import org.apache.tapestry.form.IPropertySelectionModel;
-
- public class ObjectPropertySelectionModel implements IPropertySelectionModel {
- private List _list;
- private Method _methodToGetLabel = null;
- private Method _methodToGetOption = null;
- private boolean _allowNoSelection = false;
- private String _noSelectionMessage = null;
- private int _offset = 0;
- public ObjectPropertySelectionModel() {
- _list = new ArrayList();
- throw new UnsupportedOperationException("Do not use the default constructor.");
- }
- /**
- *
- * @param list
- * the list of objects to represent in a PropertySelection
- * component. WARNING: The objects in the list MUST implement
- * equals(Object obj) and hashCode(), and if they are EJB3
- * Entities those methods MUST return the same thing for
- * different instances of the same detached entity (eg. by
- * matching on Id only).
- * @param clazz
- * the class of objects in the list.
- * @param nameOfMethodToGetLabel
- * the name of the method that PropertySelection must invoke on
- * each object in the list to get its label to display in the
- * list on the page. For example, the method name might be
- * "getShortName".
- * @param nameOfMethodToGetOption
- * the name of the method that PropertySelection must invoke on
- * an object when it has been selected. The result is put into
- * the property named in the "value" parameter of the
- * PropertySelection. For example, the method name might be
- * "getKey". If you want the result to be the the whole object
- * then set this argument to null.
- *
- */
- public ObjectPropertySelectionModel(Listextends Object> list, Class clazz, String nameOfMethodToGetLabel,
- String nameOfMethodToGetOption) { this(list, clazz, nameOfMethodToGetLabel, nameOfMethodToGetOption, false, null);
- }
- /**
- *
- * @param list
- * the list of objects to represent in a PropertySelection
- * component. WARNING: The objects in the list MUST implement
- * equals(Object obj) and hashCode(), and if they are EJB3
- * Entities those methods MUST return the same thing for
- * different instances of the same detached entity (eg. by
- * matching on Id only).
- * @param clazz
- * the class of objects in the list.
- * @param nameOfMethodToGetLabel
- * the name of the method that PropertySelection must invoke on
- * each object in the list to get its label to display in the
- * list on the page. For example, the method name might be
- * "getShortName".
- * @param nameOfMethodToGetOption
- * the name of the method that PropertySelection must invoke on
- * an object when it has been selected. The result is put into
- * the property named in the "value" parameter of the
- * PropertySelection. For example, the method name might be
- * "getKey". If you want the result to be the the whole object
- * then set this argument to null.
- * @param allowNoSelection
- * If true then adds an element to the start of the list. Its
- * option is null.
- * @param noSelectionLabel
- * If null then no label. A typical label might be "Select...".
- *
- */
- public ObjectPropertySelectionModel(Listextends Object> list, Class clazz, String nameOfMethodToGetLabel,
- String nameOfMethodToGetOption, boolean allowNoSelection, String noSelectionLabel) {
- try {
- _list = list;
- _methodToGetLabel = clazz.getMethod(nameOfMethodToGetLabel, (Class[]) null);
- if (nameOfMethodToGetOption != null) {
- _methodToGetOption = clazz.getMethod(nameOfMethodToGetOption, (Class[]) null);
- }
- _allowNoSelection = allowNoSelection;
- if (_allowNoSelection) {
- _noSelectionMessage = noSelectionLabel;
- _offset = 1;
- }
- }
- catch (SecurityException e) {
- throw new IllegalStateException(e);
- }
- catch (NoSuchMethodException e) {
- throw new IllegalArgumentException("Given nameOfMethodToGetLabel=\"" + nameOfMethodToGetLabel + "\", nameOfMethodToGetOption=\""
- + nameOfMethodToGetOption + "\", class=\"" + clazz + "\".", e);
- }
- }
- public int getOptionCount() {
- return _list.size() + _offset;
- }
- public Object getOption(int index) {
- if (_allowNoSelection) {
- if (index < _offset) {
- return null;
- }
- }
- Object o = _list.get(index - _offset);
- if (_methodToGetOption == null) {
- return o;
- }
- else {
- try {
- Object option = _methodToGetOption.invoke(o, (Object[]) null);
- return option;
- }
- catch (IllegalArgumentException e) {
- throw new IllegalStateException("Problem with the given methodToGetOption \"" + _methodToGetOption + "\": ", e);
- }
- catch (IllegalAccessException e) {
- throw new IllegalStateException("Problem with the given methodToGetOption \"" + _methodToGetOption + "\": ", e);
- }
- catch (InvocationTargetException e) {
- throw new IllegalStateException("Problem with the given methodToGetOption \"" + _methodToGetOption + "\": ", e);
- }
- }
- }
- public String getLabel(int index) {
- if (_allowNoSelection) {
- if (index < _offset) {
- return _noSelectionMessage;
- }
- }
- Object o = _list.get(index - _offset);
- try {
- String label = _methodToGetLabel.invoke(o, (Object[]) null).toString();
- return label;
- }
- catch (IllegalArgumentException e) {
- throw new IllegalStateException("Problem with the given methodToGetLabel \"" + _methodToGetOption + "\": ", e);
- }
- catch (IllegalAccessException e) {
- throw new IllegalStateException("Problem with the given methodToGetLabel \"" + _methodToGetOption + "\": ", e);
- }
- catch (InvocationTargetException e) {
- throw new IllegalStateException ("Problem with the given methodToGetLabel \"" + _methodToGetOption + "\": ", e);
- }
- }
- public String getValue(int index) {
- return Integer.toString(index);
- }
- public Object translateValue(String value) {
- return value == null ? null : getOption(Integer.parseInt(value));
- }
- }
具体使用如下,假如现在有一个配件类型的类
java 代码
- public class FittingType {
- private Long id;
- private String name;
- private Set<fitting></fitting> fittings = new HashSet<fitting></fitting>();
- //getter and setter
- }
<o:p></o:p>
创建配件类时,需要选择配件类型
java 代码
- private IPropertySelectionModel fittingTypeSelectionModel;
- public IPropertySelectionModel getFittingTypeSelectionModel() {
- if (fittingTypeSelectionModel == null) {
- List<fittingtype></fittingtype> fittingTypes = getFittingTypeService().findAll();
- fittingTypeSelectionModel = new ObjectPropertySelectionModel(
- fittingTypes, FittingType.class, "getName", "getId", true,
- "选择分类");
- }
- return fittingTypeSelectionModel;
- }
- public abstract Long getFittingTypeId();
- public ILink onSave() {
- //其他
- if (getFittingTypeId() != null) {
- fitting.setType(getFittingTypeService()
- .findByID(getFittingTypeId()));
- }
- //其他
- }
Html中定义组件<o:p></o:p>
java 代码
- "type@PropertySelection" model="ognl:fittingTypeSelectionModel" value="ognl:fittingTypeId" displayName="配件类型"/>
<o:p> </o:p>
具体定义中
fittingTypeSelectionModel = new ObjectPropertySelectionModel(<o:p></o:p>
fittingTypes, FittingType.class, "getName", "getId", true,<o:p></o:p>
"选择分类");<o:p></o:p>
}<o:p></o:p>
参数1:候选的List
参数2:类别
参数3:label的getter方法
参数4:option的getter方法
参数5:是否允许没有选项
参数6:没有选项时的label
<o:p> </o:p>
好了,项目中又多了个通用的东西,开发时又可以happy了。
java 代码
- "@PropertySelection" model="ognl:@com.myexample.DetailsPage@GENDER_MODEL" value="ognl:gender"/>
评论
4 楼
cgc520
2007-06-19
错是不错,可是我总觉得效率还是太低了,因为它用到了java的一些反射机制.页面刷新的时候可能会慢点吧!
3 楼
wrong1111
2006-12-15
这个不错!!!顶一下,建议加精!!!
2 楼
zhangqidi
2006-12-07
very good
1 楼
tapestry
2006-12-07
改了n遍终于提交上来了,请问html代码如何加,加上去之后自动解析,后边的都没有了,上边的是去掉了好多html代码后的,少了一些内容。
发表评论
-
Tapestry4.1.x中内置的ajax(不用写任何的javascript)
2007-07-27 11:20 9574Tapestry4.1.x中内置dojo实现ajax功能,不用 ... -
Tapestry4常用的注入对象
2007-07-15 21:50 4547注入方式: @InjectObject("servi ... -
新版Tapestry4.1.2在性能上的提升
2007-06-27 16:13 6780一、ognl2.7带来的性能上的提升 这个版本应该早就该释出的 ... -
深入理解Tapestry的Rewind
2006-12-30 16:07 12022Tapestry的rewind一直是学习和使用Tapestry ... -
在Tapestry中使用redirect-after-post模式控制表单提交
2006-11-27 22:37 8984Tapestry中表单的提交有很多问题,刷新导致表单的重复提交 ... -
在Tapestry4中使用SoftReference实现ObjectPool
2006-11-20 16:31 3672Tapestry4.0.x版本的PagePool实现很简单,只 ... -
在Tapestry4中使用SWFUpload上传文件
2006-11-18 15:06 7853Tapestry4中上传文件的组件对文件的处理做了很好 ...
相关推荐
6. **切换皮肤**:在Tapestry中,可以轻松实现皮肤的切换,这通常涉及到更换CSS样式表和可能的图片资源。开发者可以通过配置文件或程序逻辑来改变应用的外观,满足不同用户需求。 7. **自主分页**:Tapestry提供了...
在Tapestry中,大多数的编程都是声明式的,这意味着开发者可以使用XML或注解来定义页面和组件的行为,而不是编写大量的Java代码。这降低了代码的复杂性,提高了可读性和维护性。 4. **页面和组件生命周期**: ...
"tapestry中文字典"可能包含对Tapestry框架中的专有名词、API和概念的中文解释,帮助读者更准确地理解和记忆。它可能是以索引形式存在,方便查找和查阅。 通过学习这些文档,开发者可以全面了解Tapestry 4的架构和...
在Tapestry 5 中,开发者可以通过创建CRUD(创建、读取、更新、删除)功能的应用来了解框架的核心概念。这包括页面导航、依赖注入和资源注入、用户输入验证以及状态管理。Tapestry 还内置了Ajax支持,使得创建Ajax...
3. **Tapestry Hibernate**: 这个库提供了与Hibernate ORM框架的集成,允许开发者方便地在Tapestry应用中使用Hibernate进行数据持久化操作。通过源码,我们可以学习如何在Tapestry中配置和使用Hibernate服务。 4. *...
在"Tapestry入门.docx"中,你将了解到如何设置开发环境,包括安装必要的工具和库,配置IDE(如Eclipse或IntelliJ IDEA),以及创建第一个Tapestry应用。这通常涉及以下几个步骤: 1. **环境配置**:安装Java ...
在Tapestry中,模型、视图和控制器的概念得到了清晰的体现。`Model`代表数据和业务逻辑,`View`负责呈现,而`Controller`则处理用户请求并协调模型和视图。Tapestry API提供了`org.apache.tapestry5.corelib....
在这个完整的教程中,我们将深入探讨Tapestry中的Table和Tree组件,这两种组件在数据展示和交互中扮演着重要角色。 ### Tapestry Table组件 Table组件是Tapestry中用于显示数据列表的关键组件。它允许开发者以表格...
Tapestry5最新中文教程.doc 作者 Renat Zubairov & Igor Drobiazko译者 沙晓兰 发布于 2008年7月2日 下午9时30分 社区 Java 主题 Web框架 ----------------------------------------- Tapestry5.1实例教程.pdf ...
Tapestry是一个强大的Java web应用程序框架,它融合了MVC(Model-View-Controller)模式和模板技术,为开发者提供了一种高效且优雅的方式来构建动态Web应用。Tapestry的核心理念是将视图逻辑与业务逻辑完全分离,...
在IT行业中,Web开发是一个重要的领域,而Tapestry和ExtJS是两个广泛使用的框架,它们各自在构建动态和交互式的Web应用上有着独特的优点。本文将深入探讨Tapestry 4.02版本中对ExtJS的GridPanel组件进行封装的相关...
3. **声明式编程**:Tapestry 3允许开发者在HTML模板中直接嵌入Java代码,减少了编写繁琐的控制器逻辑的需要。开发者可以通过简单的属性和事件绑定来声明组件的行为。 **二、Tapestry 3 的工作原理** 1. **页面和...
Tapestry5.0.16文档和大家一起学习
在Tapestry 5 中,应用由组件构建,页面由这些组件组成。这些组件可以独立开发和复用,增强了代码的模块性和可维护性。通过依赖注入(Dependency Injection,DI)和资源注入(Resource Injection),Tapestry 5 可以...
Tapestry3.1在设计初期即在Hivemind框架下构建,但由于某些原因,没有从Hivemind中独立出来,从而发展成了Tapestry4.0。Tapestry4与Hivemind的结合,虽然在最初可能会引发一些争议,尤其是对于那些习惯于Spring框架...
这个框架在Web应用开发中提供了一种组件化和模板化的编程模型,使得开发者可以更高效地构建动态、交互式的Web页面。以下是对Tapestry 4官方文档中版本的详细解析: 1. **组件化开发**: Tapestry 4的核心特性之一...
在IT行业中, Tapestry 是一个基于Java的开源Web应用程序框架,它强调组件化、类型安全和高度可测试性。Tapestry 5.3.5是该框架的一个版本,提供了许多增强的功能和改进。在这个场景中,我们关注的是"IOC用户登陆...
1. Tapestry 已经在许多大型 web 应用程序中得到应用。 2. Tapestry 已经在许多知名公司中得到应用。 Tapestry 的发展前景: 1. Tapestry 的发展前景非常广阔。 2. Tapestry 将继续关注的是产生动态的 HTML 页面。...