`
pengsuyun
  • 浏览: 15244 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

wicket Web beans 学习之BeanMetaData

阅读更多
介绍:
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 参数 删除没有指定在属性集中的参数
分享到:
评论

相关推荐

    Wicket Web Beans-开源

    现在,该项目托管在Google代码上:http://code.google.com/p/wicket-web-beans

    wicket7教程

    Apache Wicket是一个为Java Web开发者提供的组件导向的框架,它能够帮助开发者在不编写大量JavaScript代码的情况下快速...通过学习本教程,Java开发者可以有效地掌握Wicket框架,开发出结构清晰、易于维护的Web应用。

    Wicket.pdf(Wicket开发指南)

    Wicket 作为一种先进的 Java Web 开发框架,不仅提供了丰富的功能和组件库,而且拥有较低的学习曲线,非常适合希望快速构建高质量 Web 应用的开发者。无论是对于初学者还是经验丰富的开发人员来说,掌握 Wicket 都将...

    实战wicket学习总结

    【实战Wicket学习总结】 Wicket是一个Java Web应用程序框架,以其独特的组件模型和强大的MVC设计而备受赞誉。本文将基于三年的Wicket项目经验,深入探讨Wicket的关键特性和在实际开发中遇到的问题及解决方案。 1. ...

    wicket指南

    **Wicket 指南** ...无论你是初学者还是经验丰富的开发者,都可以通过学习Wicket来提升Web应用程序的开发效率和质量。阅读《Wicket开发指南-简体版.pdf》将进一步帮助你掌握这个框架的精髓和实践技巧。

    创建基于wicket的web服务入门实例

    创建基于wicket的web服务入门实例

    wicket 官方JAVA教程

    Wicket是一款开源的Java Web应用程序框架,它强调组件化和声明式编程模型,使得开发人员可以构建出用户界面更加灵活且易于维护的Web应用。本教程将深入探讨Wicket的核心概念、特性以及如何利用它进行实际开发。 1. ...

    apacke-wicket-mvn编译

    【标题】:“apacke-wicket-mvn编译”指的是使用Apache Maven构建工具来编译一个基于Apache Wicket的项目。...通过深入学习和实践,开发者可以充分利用Wicket的优势,高效地构建出高质量的Web应用。

    Wicket的学习(二)

    在本篇“Wicket的学习(二)”中,我们将深入探讨Apache Wicket这一强大的Java Web应用程序框架。Wicket以其组件化、模型-视图-控制器(MVC)的设计模式和强大的状态管理机制,在Web开发领域占据一席之地。这篇博客...

    wicket相关书籍

    通过实例和代码片段,读者可以学习到如何利用 Wicket 的特性来构建高效、可维护的Web应用。 其次,"Pro Wicket" 是 Apress 出版的一本全面介绍 Wicket 框架的专业著作。这本书不仅深入介绍了 Wicket 的基本概念,如...

    wicket的helloworld

    **Wicket HelloWorld程序详解** ...Wicket的强大之处在于它的组件模型和强大的数据绑定机制,使得开发动态、交互性强的Web应用变得更加简单和直观。对于初学者来说,理解这些基础知识是进一步学习Wicket的关键。

    创建并扩展Apache_Wicket_Web应用.doc

    Apache Wicket 是一个基于组件的轻量级Web应用框架,其设计目的是使展现层与业务逻辑分离,便于创建可测试、可调试且支持性强的Web 2.0应用程序。本篇文档关注的是如何在不修改已有代码的情况下扩展一个基于Wicket的...

    wicket简单实例

    这个“wicket简单实例”是为了帮助初学者理解Wicket的工作原理和基本操作,通过运行这些示例,你可以深入学习Wicket的核心特性。 1. **Wicket_link**: 这个示例展示了如何在Wicket应用中创建链接。Wicket的`Link`...

    Wicket1.40.war包+开发指南.rar

    总结,Wicket 1.4.0提供了一种高效、易用的Web开发方式,结合`Wicket开发指南20061106.pdf`和`wicket-examples-1.4.0.war`,开发者可以快速上手,创建出功能丰富的Java Web应用。无论你是初学者还是经验丰富的开发者...

    Wicket 入门

    在当今的 Web 开发领域,Java 框架扮演着举足轻重的角色,其中 Apache Wicket 是一个强大的、面向组件的 Java Web 应用框架,它简化了 Web 应用的开发过程。本文将详细介绍如何在 Eclipse 中使用 Maven 创建一个 ...

    wicket开发指南 pdf

    Wicket 与其他Web框架的不同之处在于它采用了组件驱动的开发模式。每个HTML元素都可以与Java对象对应,这些对象称为组件,它们负责处理用户的交互事件和呈现页面。这种设计使得Wicket能够轻松地实现页面状态管理,...

    wicket 基础知识培训

    Wicket 是一个开源的Java Web框架,用于构建可重用且易于维护的Web应用程序。它以其组件模型和数据绑定机制而闻名,与Struts等传统MVC框架相比,提供了更直观和面向对象的编程方式。 在Wicket基础知识培训中,首先...

Global site tag (gtag.js) - Google Analytics