Wicket组件-每次都必须添加()吗?

Wicket组件-每次都必须添加()吗?,wicket,Wicket,我正在尝试使用wicket构建一个简单的应用程序,到目前为止我印象深刻。我一直在利用Component类根据用户输入或模型确定页面上元素的行为。我看到了组件模型与JSF的相似之处,但发现wicket生命周期更易于管理 我一直无法理解的是,必须为页面上提到的每个wicket:id向树中添加每个组件,特别是对于没有任何子项的组件。在标记中已经定义了树的情况下,在java代码中构建树似乎很费力。我错过了什么 编辑 我或许应该举个例子。我有一个输入框的标签,在某些情况下,我希望能够修改它。标记中标签的文

我正在尝试使用wicket构建一个简单的应用程序,到目前为止我印象深刻。我一直在利用Component类根据用户输入或模型确定页面上元素的行为。我看到了组件模型与JSF的相似之处,但发现wicket生命周期更易于管理

我一直无法理解的是,必须为页面上提到的每个wicket:id向树中添加每个组件,特别是对于没有任何子项的组件。在标记中已经定义了树的情况下,在java代码中构建树似乎很费力。我错过了什么

编辑


我或许应该举个例子。我有一个输入框的标签,在某些情况下,我希望能够修改它。标记中标签的文本和属性在95%的时间内都可以使用。

简短回答:是的,您必须添加它们

详细回答:您可以创建自定义代码来实现这一点,但我怀疑这是否值得

对于JSF,您使用一个非html标记,它有一个与之关联的组件类型,例如,
h:inputText
对应于类
HtmlInputText
,因此它知道实例化哪个类

对于Wicket,HTML文件只包含(除少数例外)HTML标记,并且您必须为添加到标记中的每个
Wicket:id
-标记的标记实例化一个具体组件,因为它无法确定
是否意味着
标签、
反馈面板、
WebMarkupContainer
,或者一些自定义组件

使用JSF,您可以在标记中执行Wicket在Java代码中执行的操作,即构建组件树、将组件绑定到属性以及处理事件。它将所有内容保存在一个文件中(您不必为每个模板文件创建一个类),这有很多缺点(有些人可能认为它有一些优点,我离题了)

你的页面绝不仅仅是一个简单的表单,什么都不做。您想要转换和验证输入,想要处理提交,想要使用Ajax更新组件。使用JSF,您可以在(不可编译、类型不安全、工具不完善、不可重构)模板中完成所有这些工作,从而使其充满了表达式、配置标记和-gawd-bank-business逻辑

如果Wicket对此有支持(而且,就目前而言,它具有您自己构建此加载项所需的灵活性),那么您必须向标记添加大量额外的注释(特殊的、非标准的标记和属性),以声明要实例化的类、要更新的模型、要执行的验证等。,牺牲了框架的两大优点:干净的HTML模板,以及视觉和逻辑的清晰分离

有一个框架试图在模板中做更多的工作,同时保持比JSF(其实并不难)更少的膨胀。但是从中可以看出,您仍然必须使用非标准标记并遵循任意约定将模板绑定到代码(您可能会喜欢它,但如果是这种情况,您有baaad品味,对不起:P)

我有一个输入框的标签,在某些情况下,我希望能够修改它。标记中标签的文本和属性在95%的情况下都可以


您可以尝试将标签的内容包装在模型中,将该标签封装在容器中,然后重新绘制容器(
target.add(container);
)。

如果您需要添加它们,请关闭。wicket最强大的功能之一是,允许您制作可重用组件,特别是html组件

建造房子的方法有一百万种,但大多数人不会 考虑从头开始建造厕所、浴缸和玻璃窗。 既然你能用比我便宜的钱买一个厕所,为什么还要自己建一个呢 建造它会花费你很多钱,而当你不太可能的时候,你会 生产一个比你在商店里能买到的更好的?以同样的方式, 大多数软件工程师试图重用软件模块。“制造或购买” 决策不仅仅包括模块是否可用; 一般来说,重用软件模块更便宜,并且会导致更多的错误 健壮的系统。重用软件也意味着您不必编写代码 一次又一次地使用相同的功能。(wicket in action:曼宁)


因此,为了拥有一个可重用的wicket页面,wicket只需要一个html页面来显示它的组件层次结构或它们的位置。这些组件的类型和型号留给程序员。

这是一个很好的答案,解释了很多。我可能会重新思考我是如何处理我的问题的,似乎我在使用wicket,就像我在使用JSF一样,代价是没有使用这两种技术的优点。