【问题标题】:Set bean property from JSF page从 JSF 页面设置 bean 属性
【发布时间】:2010-08-13 15:38:11
【问题描述】:

我需要做一件非常简单的事情——将当前 URL 从 JSF (2.0) 页面传递到托管 bean。这是获取登录表单的 URL 所必需的,它将在登录后将用户重定向回当前页面。 (我使用 GAE 并且 bean 是它的用户服务的包装,如果它确实重要的话)。我尝试的任何明显方法都不起作用
<c:set /> - 不起作用(没有任何错误或警告消息)
将当前 URL 作为参数的 getter - 不起作用。
如此多的问题和许多食谱,但都是复杂而不优雅的。为什么?可能是我(就像其他人一样)错过了一个关键的设计原则?我会很感激任何答案 - 简单明了的食谱或解释为什么不这样做。

【问题讨论】:

    标签: jsf javabeans


    【解决方案1】:

    它可以通过#{request.requestURL} 获得(或者如果您只想要域相对路径,请使用#{request.requestURI})。使用f:param 传递,@ManagedProperty 处理。

    <h:commandButton action="#{bean.submit}" value="submit">
        <f:param name="url" value="#{request.requestURL}" />
    </h:commandButton>
    

    @ManagedProperty("#{param.url}")
    private String url;
    

    需要注意的是,h:commandButton 中的 f:param 在 JSF 1.x 中不起作用。您想改用h:commandLink


    更新 根据 cmets:我知道您想“将当前 URL 传递给托管 bean”。但是您实际上想要“访问托管 bean 中的当前 URL”。

    在这种情况下,或者#{param.url}替换为#{request.requestURL}

    @ManagedProperty("#{request.requestURL}")
    private String url;
    

    或者通过ExternalContext#getRequest()从JSF引擎盖下获取原始HttpServletRequest实例:

    HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
    String requestURL = request.getRequestURL();
    

    【讨论】:

    • 是的,我知道当用户按下提交按钮时它会起作用。但是我可以在不与用户进行任何交互的情况下设置一些 bean 属性吗?在收到 HTTP GET 请求后,我需要使用特定的 requestURI 初始化一个 bean 属性,并且能够获取取决于页面下方 requestURI 的其他属性。有可能吗?
    • 是的,这是我的错,我很抱歉这个模棱两可的问题。现在这两个选项都可以完全满足我的需要!谢谢BalusC!
    • @Odelya:仅当属性的范围小于 bean 的范围时。在这个特定示例中,属性是请求范围的,那么 bean 必须是请求范围的,它不能有比这更广泛的范围。
    猜你喜欢
    • 2012-06-30
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2012-08-04
    相关资源
    最近更新 更多