Apache MyFaces Trinidad:动态>内的标签

发布于 2024-11-14 18:43:08 字数 1694 浏览 5 评论 0原文

我有一个简单的要求:我的 的列数是动态的。我将有一个对象列表,someBean.features,它将确定渲染多少列。

下图应该可以阐明我的要求。

带有动态列的表格

在我给出的代码中,使用了 JSTL 标记在 JSF 环境中使用时显然会产生问题。他们做了这样的事情:

<tr:table value="#{someBean.values}">
    <tr:column headerText="Name">
        <tr:outputText value="#{someBean.name}"/>
    </tr:column>
    <c:forEach var="col" items="#{someBean.features}">
        <tr:column headerText="Column-#{col.id}">
            <tr:outputText value="#{col.name}"/>
        </tr:column>
    </c:forEach>
</tr:table>

但是当我分析上面的代码时,方法 someBean.getValues 是上面 标记的输入被调用了数千次,而不是大约 20 次。据我所知,这是由于 标记是一个编译时标记,其中 是渲染时间标签。

所以,这就是我打算做的(将 替换为

<tr:table value="#{someBean.values}">
    <tr:column headerText="Name">
        <tr:outputText value="#{someBean.name}"/>
    </tr:column>
    <tr:iterator var="col" value="#{someBean.features}">
        <tr:column headerText="Column-#{col.id}">
            <tr:outputText value="#{col.name}"/>
        </tr:column>
    </tr:iterator>
</tr:table>

但是,由于某种原因, < code>似乎不喜欢放在 中,并且它永远不会被执行

任何解决方案,提示,指导方针将不胜感激。

哦,我们正在使用 JSF 1.1 和 MyFaces Trinidad 1.0.13 实现,

谢谢。

I have a simple requirement: The number of columns of my <tr:table/> is dynamic. I will have a list of objects, someBean.features which will determine how many columns are rendered.

The following diagram should clarify my requirement.

Table with dynamic columns

In the code that I was given, there was usage of the JSTL <c:forEach/> tag which obviously created problems when used in a JSF environment. They had done something like this:

<tr:table value="#{someBean.values}">
    <tr:column headerText="Name">
        <tr:outputText value="#{someBean.name}"/>
    </tr:column>
    <c:forEach var="col" items="#{someBean.features}">
        <tr:column headerText="Column-#{col.id}">
            <tr:outputText value="#{col.name}"/>
        </tr:column>
    </c:forEach>
</tr:table>

But when I profiled the above code, the method someBean.getValues which is the input to the <tr:table/> tag above was getting called several thousands of times rather than about 20. This - as I figured out - was due to the fact that <c:forEach/> tag is a compile time tag where as <tr:*/> are render time tags.

So, here's what I intend to do (replace <c:forEach/> with <tr:iterator/>:

<tr:table value="#{someBean.values}">
    <tr:column headerText="Name">
        <tr:outputText value="#{someBean.name}"/>
    </tr:column>
    <tr:iterator var="col" value="#{someBean.features}">
        <tr:column headerText="Column-#{col.id}">
            <tr:outputText value="#{col.name}"/>
        </tr:column>
    </tr:iterator>
</tr:table>

But, for some reason, the <tr:iterator/> doesn't seem to like being placed inside a <tr:table/> and it never gets executed.

Any solution, tips, guidelines will be greatly appreciated.

Oh and we're using JSF 1.1 with a MyFaces Trinidad 1.0.13 implementation.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

怪我入戏太深 2024-11-21 18:43:08

我认为(你可能已经知道了;))的唯一方法是编写扩展 UIXTable 并提供自定义标记处理程序来处理 和将 columns 数组展开为 html 列

Only way i think (about which you may know already ;) ) is to write extend UIXTable and provide a custom taghandler to process <tr:columns items="#{columns}"> and expand the columns array into html columns

尾戒 2024-11-21 18:43:08

getter 调用是一种特别便宜的操作。如果你的吸气剂按照他们的意图完成他们的工作,只是返回 bean 属性,那么这实际上应该不会造成伤害。

这种担忧给我的印象是,您在 getter 方法而不是构造函数或某些仅根据请求调用一次的事件方法中错误地执行了一些昂贵的业务工作。你真的应该相应地解决这个问题。 Getters 不应该做任何业务工作,或者最多只是做一些延迟加载。

至于为什么 有效而 无效,那是因为 JSTL 标记在视图构建期间运行,而不是在视图渲染期间运行UIData 组件的唯一有效子组件是 UIColumn 组件。基本上,当要构建视图时,所有 JSTL 标记都将运行,并且您最终会得到一个纯 JSF 视图,其中所有 都已位于正确的位置。当要呈现视图时,所有 JSF 标记都将运行,最终会得到一个纯 HTML 结果,然后可以将其发送到浏览器。

另请参阅:

A getter call is a particularly cheap operation. If your getters do their job as they are intented for, just returning the bean property, then this should really not harm.

This concern gives me the impression that you're incorrectly doing some expensive business job inside a getter method instead of a constructor or some event method which is invoked only once upon a request. You should really fix that accordingly. Getters should not do any business job or at highest just do some lazy loading.

As to why the <c:forEach> works and the <tr:iterator> not, that's because JSTL tags runs during view build time, not during view render time and that the only valid child of an UIData component is an UIColumn component. Basically, when the view is to be built, all JSTL tags will run and you end up with a pure JSF view with all <tr:column> in the right places already. When the view is to be rendered, all JSF tags will run and you end up with a pure HTML result which can then be sent to the browser.

See also:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文