以下似乎在XHTML facelet模板中被忽略:
<f:metadata>
<f:viewParam name="id" value="#{backingBean.id}" />
</f:metadata>
(至少根据Glassfish2.2的Mojarra)
Java Server Faces 2.0完整参考文献p.540:
f:metadata标签封装了用于指定的元素集 Facelet视图的元数据,因此必须是子视图 f:视图标记,可能不会出现在模板中。至于JSF2.0,唯一的 此标记的目的是封装f:viewParam标记。
我当前的应用程序必须在数百个XHTML页面的每一个中包含上述内容,但是在模板中失败,我无法引入视图参数处理策略。事实上,我想要的是所有页面共同的视图参数处理策略的混合,然后是对采用其他查询参数的特定页面的一些额外处理。
很高兴获得建议,
Webel
答案 0 :(得分:3)
不幸的是,那是by spec。您最好的选择是使用@ManagedProperty
代替。
public class BackingBean {
@ManagedProperty("#{param.id}")
private Long id;
// ...
}
唯一的缺点是,它没有提供使用XHTML的声明性转换/验证的优势。如有必要,您可以使用@PostConstruct
方法完成此项工作。
答案 1 :(得分:0)
回答我自己的问题所以可以与代码标记共享解决方案(我希望可以将代码标记放在注释中而不是需要答案,或者如果有人可以建议如何):
/** Unlike {@link Tracker}, only tracks within a single request.
*
* This is useful for the idFrom request parameter tracking in combination
* with an idFrom @ManagedProperty.
*
* This can't be done in session scope.
*
* @author darrenkelly
*/
@ManagedBean
@RequestScoped
public class RequestTracker extends All_ {
/** Creates a new instance of RequestTracker */
public RequestTracker() {
}
@EJB private ElementQuery elementQuery;
@ManagedProperty("#{param.idFrom}")
private Long idFrom;
/**
* The id of the element page one came from to reach a tracked overview page.
*
* @return
*/
public Long getIdFrom() {
return idFrom;
}
public void setIdFrom(Long idFrom) {
if (idFrom != null) {
this.idFrom = idFrom;
elementFrom = elementQuery.find(idFrom);
if (elementFrom == null) {
String $error = "No element with identifier idFrom(" + idFrom + ") found as referring element";
JsfUtil.addErrorMessage($error);
}
}
}
private Element elementFrom;
/** The Element from whose page one came to a another page.
*/
public Element getElementFrom() {
return elementFrom;
}
public void setElementFrom(Element elementFrom) {
this.elementFrom = elementFrom;
}
}