在XHTML小页面模板中,以下内容似乎是可以忽略的:
<f:metadata>
<f:viewParam name="id" value="#{backingBean.id}" />
</f:metadata>
(至少与Mojarra根据Glassfish2.2)
Java Server Faces 2.0 Complete Reference说p.540:
元数据标签封装了用于指定的一组元素的元数据,因此必须是Facelet视图的子视图F:视图标签,可能不会出现在模板中。从JSF2.0开始,唯一的这个标签的目的是封装f:viewParam标签。
对于我当前的应用程序来说,必须在数百个XHTML页面中的每一个页面中都包含上述内容是乏味的,但是它在模板中失败了,我无法引入视图参数处理策略。事实上,我想要的是两者兼得,一种对所有页面都通用的视图参数处理策略的混合,然后对接受额外查询参数的特定页面进行一些额外的处理。
谢谢你的建议,
Webel
不幸的是,这是规范规定的。您最好使用@ManagedProperty
代替。
public class BackingBean {
@ManagedProperty("#{param.id}")
private Long id;
// ...
}
唯一的缺点是它不提供使用XHTML声明性转换/验证的优势。如果有必要,您可以在@PostConstruct
方法中完成此工作。
回答我自己的问题,以便可以与代码标记共享解决方案(我希望有人可以将代码标记放在评论中,而不是需要答案,或者如果有人可以请建议如何):
/** 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;
}
}