介绍:
wicket Web beans(WWB) 是wicket的一个表单制作工具,作用:通过一系列配置,可以直接根据bean的属性,制作表单中的元素,很方便,目前发现一个缺点,form中的样式的定制不是很方面,可能需要进一步的研究wicketwebbean中的代码,才能更好的用好这个工具。
工具的原理其实很简单,下文中介绍的BeanMetaData也是原理中很重要的一个组成部分,这个类主要跟bean对应起来,作为bean的元数据存在,bean中的属性与ElementMetaData这个类对应起来,WWB其实也是通过这些元数据,利用java的反射机制,制成component,然后将所有的component放在container,也就是一个BeanForm中,同意展现出来。刚才说的表单样式的问题,其实工具的提供者考虑了这个问题,工具中的一些标注中,已经提供了样式这个属性,去改变bean属性的样式,虽然这样,但是在样式的使用上,个人觉得不是很方便,直观。下面主要对BeanMetaData这个类进行说明:
关键属性;
private Class<?> beanClass; // 对象类,与bean对应
private Class<?> metaDataClass;
private Beans beansMetaData;
private List<Bean> collectedBeans = new ArrayList<Bean>(); //所有的bean标注的集合
private String context; //通过context可以指定对应的bean,
private Component component;
private ComponentRegistry componentRegistry; //注册bean属性的fieldType
// List of all properties.
private List<ElementMetaData> elements = new ArrayList<ElementMetaData>(); //所有属性和action方法的元数据集合
private List<TabMetaData> tabs = new ArrayList<TabMetaData>(); //tabs元数据的集合
关键方法:
init()
1、 // Check if bean supports PropertyChangeListeners.
2、// Deduce actions from the component.
3、// Create defaults based on the bean itself. (根据BeanMetaData的构造参数,对所有ElementMetaData的viewOnly进行设置)
3.1、bean的属性有属性类型,在构造ElementMetaData对象时,会传入属性类型propertyType
说明:1-3的操作创建元数据的过程,包括bean对象、bean对象下的属性和action方法
下面的步骤涉及到元数据 根据标注进行属性设置:
4、// Collect various sources of metadata for the bean we're interested in.
4.1、collectAnnotations() //收集bean标注(beanClass、metaBeanClass、component)
4.2、collectFromBeanProps(); //Collection Beans from the beanprops file, if any.
4.3、collectBeansAnnotation(beansMetaData, false);
5、// Process action annotations on component.
processActionAnnotation(action, method.getName());
注意点: 1、action如果指定名字必需跟method的一样
2、action中的值都会以参数的形式保存在元数据中
6、// Determine the hierarchy of Bean contexts. I.e., the default Bean is always processed first, followed by those that
// extend it, etc. This acts as a stack.
List<Bean> beansHier = buildContextStack();
Bean标注有context属性,bean标注的propertyName中属性的出现顺序会影响到表单中属性的显示顺序
processBeanAnnotation(bean);
步骤一、将bean的标注属性设置到bean的元数据里面
步骤二、
for (String actionName : bean.actionNames()) {
if (!handleElementRemove(actionName, true)) {
findElementAddPseudos(ACTION_PROPERTY_PREFIX + actionName);
}
}
handleElementRemove : 删除actionName的action元数据
for (Action action : bean.actions()) {
if (!handleElementRemove(action.name(), false)) {
processActionAnnotation(action, null);
}
}
上面代码的逻辑:bean中如果指定了action数组,在element中查找有没有名字相同的action,有则删除,没有则将action的参数设置到对应的元数据中。
processTabAnnotation(Tab tab, TabMetaData tabMetaData) //处理tab标注,作用:创建tab,并为tab中的属性创建元数据,并且标记tabid
现在处理的都是bean标注中的属性
7、// Ensure that if a context was specified, that we found one in the metadata. Otherwise it might have been a typo.
8、// Post-process Bean-level parameters bean元数据的参数为PARAM_DISPLAYED,清楚element和tabs集合
9、// Configure tabs 作用:如果tabs集合为空,则创建一个默认的tab元数据
if (tabs.isEmpty()) {
// Create single default tab.
tabs.add(new TabMetaData(this, DEFAULT_TAB_ID, getParameter(PARAM_LABEL)));
}
String defaultTabId = tabs.get(0).getId();
if (!getBooleanParameter(PARAM_EXPLICIT_ONLY) || defaultTabId.equals(DEFAULT_TAB_ID)) {
// Post-process each property based on bean parameters
for (ElementMetaData elementMeta : elements) {
// If element is not on a tab, add it to the first. If it's an
// action, it must have been assigned an order to
// appear on a tab. Otherwise it is a global action.
if (elementMeta.getTabId() == null
&& (!elementMeta.isAction() || (elementMeta.isAction() && elementMeta
.isActionSpecifiedInProps()))) {
elementMeta.setTabId(defaultTabId);
}
}
}
上面两段代码,将bean对象的属性和action 都放在了默认的tab下面
10、// Remove elements not specified in props 根据 PARAM_EXPLICIT_ONLY 参数 删除没有指定在属性集中的参数
分享到:
相关推荐
现在,该项目托管在Google代码上:http://code.google.com/p/wicket-web-beans
Apache Wicket是一个为Java Web开发者提供的组件导向的框架,它能够帮助开发者在不编写大量JavaScript代码的情况下快速...通过学习本教程,Java开发者可以有效地掌握Wicket框架,开发出结构清晰、易于维护的Web应用。
Wicket 作为一种先进的 Java Web 开发框架,不仅提供了丰富的功能和组件库,而且拥有较低的学习曲线,非常适合希望快速构建高质量 Web 应用的开发者。无论是对于初学者还是经验丰富的开发人员来说,掌握 Wicket 都将...
【实战Wicket学习总结】 Wicket是一个Java Web应用程序框架,以其独特的组件模型和强大的MVC设计而备受赞誉。本文将基于三年的Wicket项目经验,深入探讨Wicket的关键特性和在实际开发中遇到的问题及解决方案。 1. ...
**Wicket 指南** ...无论你是初学者还是经验丰富的开发者,都可以通过学习Wicket来提升Web应用程序的开发效率和质量。阅读《Wicket开发指南-简体版.pdf》将进一步帮助你掌握这个框架的精髓和实践技巧。
创建基于wicket的web服务入门实例
Wicket是一款开源的Java Web应用程序框架,它强调组件化和声明式编程模型,使得开发人员可以构建出用户界面更加灵活且易于维护的Web应用。本教程将深入探讨Wicket的核心概念、特性以及如何利用它进行实际开发。 1. ...
【标题】:“apacke-wicket-mvn编译”指的是使用Apache Maven构建工具来编译一个基于Apache Wicket的项目。...通过深入学习和实践,开发者可以充分利用Wicket的优势,高效地构建出高质量的Web应用。
在本篇“Wicket的学习(二)”中,我们将深入探讨Apache Wicket这一强大的Java Web应用程序框架。Wicket以其组件化、模型-视图-控制器(MVC)的设计模式和强大的状态管理机制,在Web开发领域占据一席之地。这篇博客...
通过实例和代码片段,读者可以学习到如何利用 Wicket 的特性来构建高效、可维护的Web应用。 其次,"Pro Wicket" 是 Apress 出版的一本全面介绍 Wicket 框架的专业著作。这本书不仅深入介绍了 Wicket 的基本概念,如...
**Wicket HelloWorld程序详解** ...Wicket的强大之处在于它的组件模型和强大的数据绑定机制,使得开发动态、交互性强的Web应用变得更加简单和直观。对于初学者来说,理解这些基础知识是进一步学习Wicket的关键。
Apache Wicket 是一个基于组件的轻量级Web应用框架,其设计目的是使展现层与业务逻辑分离,便于创建可测试、可调试且支持性强的Web 2.0应用程序。本篇文档关注的是如何在不修改已有代码的情况下扩展一个基于Wicket的...
这个“wicket简单实例”是为了帮助初学者理解Wicket的工作原理和基本操作,通过运行这些示例,你可以深入学习Wicket的核心特性。 1. **Wicket_link**: 这个示例展示了如何在Wicket应用中创建链接。Wicket的`Link`...
总结,Wicket 1.4.0提供了一种高效、易用的Web开发方式,结合`Wicket开发指南20061106.pdf`和`wicket-examples-1.4.0.war`,开发者可以快速上手,创建出功能丰富的Java Web应用。无论你是初学者还是经验丰富的开发者...
在当今的 Web 开发领域,Java 框架扮演着举足轻重的角色,其中 Apache Wicket 是一个强大的、面向组件的 Java Web 应用框架,它简化了 Web 应用的开发过程。本文将详细介绍如何在 Eclipse 中使用 Maven 创建一个 ...
Wicket 与其他Web框架的不同之处在于它采用了组件驱动的开发模式。每个HTML元素都可以与Java对象对应,这些对象称为组件,它们负责处理用户的交互事件和呈现页面。这种设计使得Wicket能够轻松地实现页面状态管理,...
Wicket 是一个开源的Java Web框架,用于构建可重用且易于维护的Web应用程序。它以其组件模型和数据绑定机制而闻名,与Struts等传统MVC框架相比,提供了更直观和面向对象的编程方式。 在Wicket基础知识培训中,首先...