选择如何使用JSF将参数传递给目标bean/page

3

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

我认为这个问题有点复杂,有些人可能会告诉我将其分解成较小的问题。但是,我也认为以下所有问题的答案都相关,并且它解决了JSF缺乏直观性的问题,当您想让JSF执行“转到那个页面并将此作为参数传递”时。

  1. 首先,如何在转发和重定向之间进行选择?
  2. 之后,如何在h:commandLink/h:commandButton、h:link或h:outputLink之间进行选择?
  3. 然后,结合上面选择的选项,我应该使用f:param还是f:setPropertyActionListener?无论目标bean的范围如何,两者都能正确传递参数吗?
  4. 最后,在目标bean/page上,我应该何时使用f:viewParam,或以编程方式从请求中恢复参数?
1个回答

4
我将根据自己的经验回答你的问题。其中有一些问题是非常开放的,可能会有多个答案适合。
如果您不需要显式更改浏览器URL,则应选择页面向前(page forward)而不是重定向。页面向前比重定向快,因为它需要的步骤较少。如果您想使视图可书签化,则需要使用页面重定向。
仅当您需要向服务器提交POST请求时,才使用/。稍后,您将能够执行页面向前或重定向,具体取决于方法返回的内容。例如:
<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;
    }
}

在JSF应用程序中,使用<h:link outcome="list" value="转到列表" />进行纯页面导航。您可以使用页面前进和重定向。使用<f:param />传递视图参数。

<h:outputLink value="www.stackoverflow.com" />可用于将链接指向其他站点(而不是您的应用程序)的外部链接。使用<f:param />传递视图参数。但我个人更喜欢在这种情况下使用带有<a href="www.stackoverflow.com" />的普通HTML。

至于在POST请求中向操作方法传递参数,您有几个选项。在JSF 1.x中,f:setPropertyActionListener非常受欢迎,但如果您已经使用2.x,我建议您使用EL 2.2,它允许方法参数声明。能否使用它取决于您使用的应用程序服务器,但即使不可用,您也可以自行导入。然后,您就可以做出这样的事情:

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

尽可能地使用它,这会让事情变得更加简单。

对于视图参数,也要使用<f:viewParam />。这是解析来自GET请求的参数的JSF标准方式,所以让框架为您完成检索工作吧!

另请参阅:


如果您要从页面A转发到页面B,而这两个页面使用不同的bean,该怎么办?您会使用方法参数吗?如果是,是在bean A或B上调用方法?还是使用f:setPropertyActionListener甚至根本不调用方法?或者,您会调用方法并以编程方式设置参数吗?请更新您的答案并提供这些信息。 - RinaldoDev
@RinaldoPJr,你误解了JSF周期。一件事是将参数传递给实际绑定到当前视图的视图方法。这是通过POST请求完成的,并在我的答案中进行了描述。你所要求的是如何在执行导航时传递参数。这可以通过多种方式来执行,但我建议使用f:viewParam来解析普通的GET参数。请参阅此处。当然,你可以混合使用这两个工具,执行带有参数的POST并在你的结果中发送相同的参数。这是纯HTTP问题。 - Aritz
抱歉,在我上一条评论中忘了提到,我试图想出一些不是GET参数的东西。你说,在进行导航时,“可以有多种方式来实现”,你介意在回答中进一步解释/举例说明吗? - RinaldoDev
这里是我之前给出的关于Flash作用域的答案(链接:https://dev59.com/W2gu5IYBdhLWcg3wnoWC#21277621)。这个作用域允许你通过视图传递非视图参数。 - Aritz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接