Java 理解Tapestry原则1&引用;“静态结构、动态性能”;

Java 理解Tapestry原则1&引用;“静态结构、动态性能”;,java,tapestry,Java,Tapestry,我正在学习tapestry 5 web framework,但我不理解关于它的原则1: “静态结构,动态行为”,这是什么意思 如果不向组件添加组件,如何创建动态页面 有人能帮我吗? 提前感谢Tapestry使用模板定义静态内容。这些模板通常是带有占位符变量的html页面,由框架动态地用一些代码替换。模板允许将未更改的内容与更改的内容分离。通常结构比行为更不容易改变。即使您希望动态更改组件的某些元素,您也将使用由动态填充数据的模板定义的组件。此动态数据还可以插入其他组件等。Tapestry使用模板

我正在学习tapestry 5 web framework,但我不理解关于它的原则1: “静态结构,动态行为”,这是什么意思

如果不向组件添加组件,如何创建动态页面

有人能帮我吗?
提前感谢

Tapestry使用模板定义静态内容。这些模板通常是带有占位符变量的html页面,由框架动态地用一些代码替换。模板允许将未更改的内容与更改的内容分离。通常结构比行为更不容易改变。即使您希望动态更改组件的某些元素,您也将使用由动态填充数据的模板定义的组件。此动态数据还可以插入其他组件等。

Tapestry使用模板定义静态内容。这些模板通常是带有占位符变量的html页面,由框架动态地用一些代码替换。模板允许将未更改的内容与更改的内容分离。通常结构比行为更不容易改变。即使您希望动态更改组件的某些元素,您也将使用由动态填充数据的模板定义的组件。此动态数据还可以插入其他组件等。

这意味着您无法在运行时有效地选择或替换组件

比如说,如果您想构建一个门户解决方案,用户可以按照自己的意愿在屏幕上安排组件,Tapestry将不会提供一种有效的方法来实现这一点,因为组件具有静态结构,即您必须在编译时在其模板文件中定义进入组件的内容

或者您可能有一个专门的管理员菜单,因此您可能只想将
菜单
组件替换为派生组件,
管理员菜单
——但您不能,您必须在模板中使用
if
语句,或者使用块将不同的菜单插入布局组件

与此限制相关的是一种反模式:God或über组件试图通过有效地拥有一个包含所有可用组件的巨大模板文件来解决此问题,如下所示:

<t:if t:test="displayComponentA">
     <span t:type="ComponentA" ... />
</t:if>
<t:if t:test="displayComponentB">
     <span t:type="ComponentB" ... />
</t:if>
...

...

然而,这是非常无效的,因为Tapestry组装了整个组件树,包括没有显示的组件,来呈现页面

这意味着您无法在运行时有效地选择或替换组件

比如说,如果您想构建一个门户解决方案,用户可以按照自己的意愿在屏幕上安排组件,Tapestry将不会提供一种有效的方法来实现这一点,因为组件具有静态结构,即您必须在编译时在其模板文件中定义进入组件的内容

或者您可能有一个专门的管理员菜单,因此您可能只想将
菜单
组件替换为派生组件,
管理员菜单
——但您不能,您必须在模板中使用
if
语句,或者使用块将不同的菜单插入布局组件

与此限制相关的是一种反模式:God或über组件试图通过有效地拥有一个包含所有可用组件的巨大模板文件来解决此问题,如下所示:

<t:if t:test="displayComponentA">
     <span t:type="ComponentA" ... />
</t:if>
<t:if t:test="displayComponentB">
     <span t:type="ComponentB" ... />
</t:if>
...

...

然而,这是非常无效的,因为Tapestry组装了整个组件树,包括没有显示的组件,来呈现页面

静态结构并不意味着不能输出动态内容,也不意味着不能向组件添加组件。您不能在运行时将一个组件添加到另一个组件。您可以使用其他组件定义页面或组件结构,但这些都是在呈现页面之前在模板中定义的,而不是在呈现页面时定义的。组件可以选择不渲染自身、渲染其模板的一部分(如果组件和除非组件)等


Tapestry的静态结构导致的少数实际情况之一是组件C不能在其内部使用同一组件的另一个实例。

静态结构并不意味着不能输出动态内容,也不意味着不能向组件添加组件。您不能在运行时将一个组件添加到另一个组件。您可以使用其他组件定义页面或组件结构,但这些都是在呈现页面之前在模板中定义的,而不是在呈现页面时定义的。组件可以选择不渲染自身、渲染其模板的一部分(如果组件和除非组件)等


Tapestry的静态结构导致的少数实际情况之一是组件C不能在其内部使用同一组件的另一个实例。

如果我在dom树上添加一个textfield并从请求中接收值,会发生什么情况?这违反了原则?@iberck:如果您直接在dom上这样做,您将很难处理提交的值。您可以使用FormInjector组件通过AJAX向表单添加输入,不过:我正在寻找但没有找到示例(仅针对AjaxFormLoop)您可以给我一个FormInjector示例吗?
AjaxFormLoop
实际上使用的是
FormInjector
。查看
AjaxFormLoop
的类和模板文件。实际上,
FormInjector
使用名为
inject()
的JavaScript方法呈现一个DIV,您可以从客户端代码触发该方法。然后它发出一个AJAX请求。您必须只为
FormInjector
的“注入”事件生成一个AJAX事件处理程序。谢谢您Henning,我将在AjaxFormLoop中找到如果我在dom树上添加一个文本字段并从请求中接收值会发生什么,这违反了原则?@iberck:如果您直接在dom上执行此操作,您将