JSF2:如何使用模板实现站点范围的viewParam处理策略

时间:2011-09-08 06:35:50

标签: jsf jsf-2 facelets

以下似乎在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

2 个答案:

答案 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;
    }    
}