Я хотел бы сделать кнопку, которая перешла к другому URL, и передайте некоторые параметры запроса через в URL. outputLink работает, но я хотел бы кнопку, кнопка выглядит хорошей, но я могу передать параметры.
Существует ли решение?
Запрос 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;
}
С кнопкой вы связываете действие
, которое является методом в компоненте поддержки.
Вы можете установить параметры в bean-компоненте поддержки и прочитать их при нажатии кнопки из метода, связанного с действием 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>
Поддерживающий компонент:
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;
}
}
Этот пример взят из здесь (блог BalusC, вероятно, он придет и скажет вам проверить эту ссылку, но я быстрее!: P)
Конечно для этого компонент должен быть установлен как с областью сеанса
. Если вы хотите, чтобы это был запрос
, вы можете выполнить шаги здесь