我将根据自己的经验回答你的问题。其中有一些问题是非常开放的,可能会有多个答案适合。
如果您不需要显式更改浏览器URL,则应选择页面向前(page forward)而不是重定向。页面向前比重定向快,因为它需要的步骤较少。如果您想使视图可书签化,则需要使用页面重定向。
仅当您需要向服务器提交POST请求时,才使用/。稍后,您将能够执行页面向前或重定向,具体取决于方法返回的内容。例如:
<h:commandLink action="#{bean.processForm}" value="Submit" />
public String processForm(){
try{
save();
return "list";
}
catch(Excepcion e){
addFacesMessage("Error saving");
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标准方式,所以让框架为您完成检索工作吧!
另请参阅:
f:setPropertyActionListener
甚至根本不调用方法?或者,您会调用方法并以编程方式设置参数吗?请更新您的答案并提供这些信息。 - RinaldoDevf:viewParam
来解析普通的GET参数。请参阅此处。当然,你可以混合使用这两个工具,执行带有参数的POST并在你的结果中发送相同的参数。这是纯HTTP问题。 - Aritz