我有一个用于显示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网址...
答案 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。