奇怪的JSF问题

  • 本文关键字:问题 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包含它,多次在我的页面上,我不明白为什么它多次显示相同的FIRST url rss提要,而不是单独取每个url。

为了能够读取bean中指定的url,我将其绑定到facet中的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作用域。如果我打印出文本url的值,它显示的是最新的url,但所有的内容都取自FIRST…

所以基本上for:

<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的内容,但当页面呈现时,文本值将显示为空的第一个和雅虎url从第二个…

出现这个问题是因为您将标记文件的<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)};

相关内容

  • 没有找到相关文章

最新更新