我已经使用JSF几年了,但在决定如何将参数传递给目标页面/ bean时,我仍然有疑问。
我认为这个问题有点复杂,有些人可能会告诉我把它分解成更小的问题。但是,我也认为下面所有问题的答案是相关的,并且当你想要JSF做的所有事情时,它解决了缺乏直觉性的问题:“转到该页面并将其作为参数传递”。
h:commandLink
/ h:commandButton
,h:link
或h:outputLink
?f:param
还是f:setPropertyActionListener
?是否将参数正确传递给目标bean,与其范围无关?f:viewParam
,还是以编程方式从请求中恢复参数?答案 0 :(得分:4)
我将根据自己的经验回答你的问题。其中一些是如此开放,以至于不止一个答案适合。
除非您明确要求更改浏览器网址,否则前进页面是可行的方法。页面转发基本上比重定向更快,因为它需要更少的步骤。 如果您想要将您的观看成可收藏,则需要页面重定向。
仅在您需要 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;
}
}
在JSF应用程序中使用<h:link outcome="list" value="Go to list" />
进行纯页面到页面导航。您可以使用向前翻页和重定向。使用<f:param />
传递视图参数。
<h:outputLink value="www.stackoverflow.com" />
可以用于外部链接到其他网站(不在您的应用程序中)。使用<f:param />
传递视图参数。然而,我更喜欢在{@ 1}}中使用普通HTML来处理这种情况。
至于将参数传递给 POST 请求中的操作方法,您有几个选项。 <a href="www.stackoverflow.com" />
在JSF 1.x中如此受欢迎,但如果你已经在2.x我建议你使用EL 2.2,它允许方法参数声明。能够使用它取决于您正在使用的应用程序服务器,但即使不可用,您也可以自行导入。然后,你将能够做到这样的事情:
f:setPropertyActionListener
尽可能地使用它,它会让事情变得更容易。
对于视图参数,也请使用<h:commandButton action="#{bean.saveCar(currentCar)}" value="Save Car" />
。这是从GET请求解析参数的标准JSF方式,所以让框架为您执行检索工作!
另见: