【问题标题】:Choosing how to pass parameters to a target bean/page using JSF选择如何使用 JSF 将参数传递给目标 bean/页面
【发布时间】:2014-03-07 16:56:35
【问题描述】:

我已经使用 JSF 几年了,但在决定如何将参数传递给目标页面/bean 时,我仍然有疑问。

我确实认为这个问题有点复杂,有些人可能会告诉我把它分解成更小的问题。但是,我也认为下面所有问题的答案都是相关的,并且当您希望 JSF 做的只是:“转到该页面并将其作为参数传递”时,它解决了缺乏直观性的问题。

  1. 首先,如何选择转发和重定向?
  2. 之后,h:commandLink/h:commandButtonh:linkh:outputLink如何选择?
  3. 那么,结合我上面选择的选项,我应该使用f:param还是f:setPropertyActionListener?两者都会正确地将参数传递给目标 bean,而与它的作用域无关?
  4. 最后,在目标 bean/页面上,我应该何时使用f:viewParam,或者以编程方式从请求中恢复参数?

【问题讨论】:

    标签: jsf


    【解决方案1】:

    我将根据自己的经验回答您的问题。其中一些是如此开放,以至于可以提供多个答案。

    页面前进 是要走的路,除非您明确要求更改浏览器 url。页面转发基本上比重定向更快,因为它需要更少的步骤。 页面重定向是必需的,如果您想让您的视图可收藏。

    仅在需要POST服务器时使用<h:commandLink />/<h:commandButton />。稍后,您将能够根据方法返回的内容执行页面转发或重定向。举个例子:

    <h:commandLink action="#{bean.processForm}" value="Submit" />
    
    public String processForm(){
        try{
            save();
            return "list";
        }
        catch(Excepcion e){
            addFacesMessage("Error saving");
            //Error saving the object, keep in the same view
            return null;
        }
    }
    

    &lt;h:link outcome="list" value="Go to list" /&gt; 用于JSF 应用程序中的纯页面到页面导航。您可以使用任一页面转发和重定向。使用&lt;f:param /&gt; 传递视图参数。

    &lt;h:outputLink value="www.stackoverflow.com" /&gt; 可用于外部链接到其他网站(而不是您的应用程序)。使用&lt;f:param /&gt; 传递视图参数。不过,对于这种情况,我更喜欢使用纯 HTML 和 &lt;a href="www.stackoverflow.com" /&gt;

    至于在 POST 请求中将参数传递给操作方法,您有多种选择。 f:setPropertyActionListener 在 JSF 1.x 中非常流行,但如果您已经在 2.x 中,我建议您使用 EL 2.2,它允许 方法参数声明。能否使用它取决于您使用的应用程序服务器,但即使不可用,您也可以自己导入。然后,您将能够执行以下操作:

    <h:commandButton action="#{bean.saveCar(currentCar)}" value="Save Car" />
    

    尽可能使用它,它会让事情变得更容易。

    对于视图参数,也使用&lt;f:viewParam /&gt;。这是从 GET 请求中解析参数的标准 JSF 方式,所以只需让框架为您完成检索工作!

    另请参阅:

    【讨论】:

    • 如果您要从页面 A 转发到页面 B,并且两个页面使用不同的 bean,该怎么办。你会使用方法参数吗?如果是,在 bean A 或 B 上调用方法?或者,您会使用f:setPropertyActionListener 并且根本不调用方法吗?或者,您会以编程方式调用方法并设置参数吗?请您用该信息更新您的答案吗?
    • @RinaldoPJr 你误解了 JSF 循环。一件事是将参数传递给实际上与当前视图相关联的视图方法。这是通过 POST 请求完成的,并在我的回答中进行了描述。您要求的是在执行导航时如何传递参数。这可以通过多种方式执行,但我建议使用f:viewParam 来解析普通的 GET 参数。看看this。您当然可以将执行 POST 的两个实用程序与参数混合并在结果中发送相同的参数。这是简单的 HTTP 问题
    • 抱歉,我忘记在上一条评论中提到我试图想一些不是 GET 参数的东西。您说,在执行导航时,“可以通过多种方式执行”,您介意通过解释/示例扩展您的答案吗?
    • Here you have 我前段时间给出的关于闪存范围的答案。这允许您通过视图传递非视图参数。
    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多