我有一个用于显示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)}
;