java - 奇怪的jsf问题

标签 java jsf

我有一个用于显示 rss 内容的 Facelet 组件:

rssFeedReader.xhtml

<h:outputText
    binding="#{rssReaderBean.text}"
    value="#{url}">
    <f:attribute
        name="url"
        value="#{url}" />
</h:outputText>

<ui:repeat
    value="#{rssReaderBean.rss}"
    var="rss">
    <ice:panelGroup>
        <ice:outputLabel
            value="#{rss['publishDate']} - "
            rendered="#{not empty rss['publishDate']}">
        </ice:outputLabel>
        <a
            href="#{rss['link']}"
            target="_blank">#{rss['title']}</a>
    </ice:panelGroup>
    <ice:panelGroup>
        <ice:outputLabel>#{rss['description']}</ice:outputLabel>
    </ice:panelGroup>
    <hr />
</ui:repeat>

我将它包含在我需要的地方,例如:

<myLib:rssFeedReader url="http://rss.news.yahoo.com/rss/topstories"></myLib:rssFeedReader >

如果我在页面上多次将其包含在不同的 url 中,我不明白为什么它会多次显示相同的第一个 url rss feed,而不是单独获取每个 url。

为了能够读取 bean 中指定的 url,我将其绑定(bind)到 Facelet 中的 h:outputText。来自 RssReaderBean bean 的代码:

private HtmlOutputText text;
public HtmlOutputText getText() {
    return text;
}

public void setText(final HtmlOutputText text) {
    this.text = text;
}

以及获取 url 并返回列表的方法:

public List<Rss> getRss() {
        try {
            final URL u = new URL((String) text.getAttributes().get("url"));
///read the rss feed and prepare the result, this code works good so its not required here
}

你能看出问题所在吗...?

谢谢。

更新:bean 具有 faces-config.xml 中指定的请求范围。如果我打印出文本 url 的值,它会显示最新的 url,但所有内容均取自 FIRST...

所以基本上是:

<gra:rssFeedReader url="http://blog.test.com/feed/rss/"></gra:rssFeedReader>
                    <gra:rssFeedReader url="http://rss.news.yahoo.com/rss/topstories"></gra:rssFeedReader>

它打印出 blog.test.com 的内容,但渲染页面时的文本值将显示第一个为空,第二个为 yahoo url...

最佳答案

该问题是由于您绑定(bind) <h:outputText> 引起的标记文件到单个 bean 属性。所以,每次你添加另一个 <myLib:rssFeedReader>标签,它将覆盖与 View 中最后添加的标签的绑定(bind)。最后,当#{rssReaderBean.rss}在渲染 View 期间被评估,它手中只有最后一个。

有多种方法可以解决这个问题。最干净的方法是创建一个完全有值(value)的自定义UIComponent其中您将 URL 指定为属性。该属性应该特定于组件,而不是特定于单个 bean 属性。另一种方法是使用 Map<String, HtmlOutputText>相反,这会很笨拙。

或者,如果您正在运行支持 Servlet 3.0/EL 2.2 的容器,或者将标准 EL 实现替换为接受方法参数的容器(例如 JBoss EL),那么您可以将 URL 作为参数传递。例如。 #{rssReaderBean.rss(url)} 。有关安装/配置详细信息,请参阅this answer .

关于java - 奇怪的jsf问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5805998/

相关文章:

java - 使用 JSF 时有时会缺少 http GET 参数

javascript - 关闭编译器。基于 JSF 的页面中的单/双引号优化

jsf - JSF中组件的水平放置

java - 为什么我的构造函数不工作?

java - Spring 依赖注入(inject)失败

ajax - JSF - 使用 AJAX 和 selectOneListbox 创建动态菜单

javax.faces.FacesException : Error performing conversion of value

java - 如何在类实例和这些属性的其他可能用户之间共享属性?

java - Spring MVC 基于 Java 的配置 - 未检测到 servlet 调度程序

java - java或python中范围的递归最大函数