奇怪的jsf问题

时间:2011-04-27 14:47:07

标签: 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 >

如果我在页面上多次添加不同的网址,我不明白为什么它会多次显示相同的FIRST网址,这些网址分别是每个网址。

为了能够读取我的bean中的指定url,我将它绑定到我的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
}

你能看到问题......?

感谢。

UPDATE :bean在faces-config.xml中指定了Request范围。如果我打印出文本网址的值,它会显示最新网址,但所有内容都来自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网址...

1 个答案:

答案 0 :(得分:2)

问题是由于您将标记文件的<h:outputText>绑定到单个bean属性而引起的。因此,每次添加另一个<myLib:rssFeedReader>标记时,它都将覆盖视图中最后添加的标记的绑定。最后,在渲染视图的过程中评估#{rssReaderBean.rss}时,它只有最后一个视图。

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

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