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