今晚我第一次开始玩JSF 2.0,我已经设法凑齐了一个托管bean,它返回了一个电影列表,还有一个xhtml页面,可以显示一个电影表格从托管bean返回。
继续前进之后,我试图在数据表中添加一个链接,以便创建一个单独的xhtml页面,该页面只显示单个电影的细节。但我似乎在新的xhtml页面中使用电影bean时遇到了麻烦。
以下是主要列表xhtml页面中的代码:
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h:form>
<h:dataTable value="#{filmResourceBean.allFilms}" var="film">
<h:column><f:facet name="header">Title</f:facet>
<h:commandLink value="#{film.title}" action="film.xhtml" />
<f:param name="id" value="#{film.imdbId}" />
</h:column>
<h:column><f:facet name="header">Plot</f:facet>#{film.plot}</h:column>
</h:dataTable>
</h:form>
</h:body>
以下是支持此页面的托管bean的代码:
@ManagedBean(name="filmResourceBean")
@SessionScoped
public class FilmResource implements Serializable {
public List<Film> getAllFilms() {
// This just returns a basic list of films, its not needed here to save space...
}
public Film getFilm(String id) {
// THis just returns a film object that matches the given id, again to save space its not needed
}
}
现在我试图重新创建的想法是当用户按下主列表xhtml页面中的表格中的链接时,它们被重定向到新的xhtml页面,该页面应该通过getFilm显示应该显示的电影托管bean中的(String id)方法。
这就是我目前所拥有的,它只打印出电影对象的基本toString(),例如:org.jmcdonnell.mavenproject1.Film@34c3eb7c
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Facelet Title</title>
</h:head >
<h:body >
<h:outputText value="#{filmResourceBean.getFilm(id)}"></h:outputText>
</h:body>
</html>
我想在这里首先展示的是电影的标题,我尝试了#{filmResourceBean.getFilm(id).title}
或#{filmResourceBean.getFilm(id)}.title
等的不同组合,但它们都不起作用,并且是新的JSF,我不确定在哪里看或者我在寻找什么。我在网上找到的教程也没有告诉我这样做的方法,或者至少不是我设法发现的。有人能指出我正确的方向吗?
答案 0 :(得分:2)
您几乎正确,您需要使用#{filmResourceBean.getFilm(id).title}
,但问题在于参数id
。使用f:param
打开视图时,它会将参数作为GET参数传递。要在目标视图中使用它,您需要使用param['key']
,因此在您的情况下,最终代码应为:
#{filmResourceBean.getFilm(param['id']).title}