我想创建一个导航到不同URL的按钮,并在URL中传递一些请求参数。 outputLink有效,但我想要一个按钮,commandButton看起来不错,但我可以传递参数。
有解决方案吗?
答案 0 :(得分:17)
h:commandButton
不会触发GET
请求,而是POST
请求,因此您无法使用它。如果您已经使用JSF 2.0并且目标页面位于相同的上下文中,那么您可以使用h:button
:
<h:button value="press here" outcome="otherViewId">
<f:param name="param1" value="value1" />
<f:param name="param2" value="value2" />
</h:button>
(h:form
)中不需要h:outputLink
。这将创建一个转到otherViewId.jsf?param1=value1¶m2=value2
的按钮。
但是如果你还没有使用JSF 2.0,那么你最好只是抓住CSS来设置链接的样式,就像按钮一样。
<h:outputLink styleClass="button">
类似
a.button {
display: inline-block;
background: lightgray;
border: 2px outset lightgray;
cursor: default;
}
a.button:active {
border-style: inset;
}
答案 1 :(得分:5)
使用按钮关联action
,这是辅助bean中的方法
您可以在支持bean中设置params,并在按下按钮时从链接到action
的方法中读取它们。 action方法应返回String
,导航处理程序将根据faces-config.xml
中的配置检查是否必须移动到新页面。
<h:form>
<h:commandButton value="Press here" action="#{myBean.action}">
<f:setPropertyActionListener target="#{myBean.propertyName1}" value="propertyValue1" />
<f:setPropertyActionListener target="#{myBean.propertyName2}" value="propertyValue2" />
</h:commandButton>
</h:form>
支持bean:
package mypackage;
public class MyBean {
// Init --------------------------------------------------------------------------------------
private String propertyName1;
private String propertyName2;
// Actions -----------------------------------------------------------------------------------
public void action() {
System.out.println("propertyName1: " + propertyName1);
System.out.println("propertyName2: " + propertyName2);
}
// Setters -----------------------------------------------------------------------------------
public void setPropertyName1(String propertyName1) {
this.propertyName1 = propertyName1;
}
public void setPropertyName2(String propertyName2) {
this.propertyName2 = propertyName2;
}
}
这个例子取自 here (BalusC博客,可能他会来告诉你检查那个链接,但我更快!:P)
当然要实现这一点,必须将bean设置为session scoped
。如果您希望它为request scoped
,则可以按照here