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



在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;
    }    
}

相关内容

  • 没有找到相关文章

最新更新