2010-06-09 2 views
7

Я хотел бы сделать кнопку, которая перемещается по другому URL-адресу и передает некоторые параметры запроса через URL-адрес. OutputLink работает, но мне нужна кнопка, commandButton выглядит хорошо, но я могу передавать параметры.Параметры JSF commandButton URL-адрес

Есть ли решение?

ответ

16

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&param2=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; 
} 
5

С помощью кнопки можно поставить в соответствие action, который является методом в бэк-боба Вы можете установить Params в бэк-боба и читать их, когда вы нажимаете кнопку, от метода, связанного с 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; 
    } 

} 

Этот пример взят из here (BalusC блог, вероятно, он придет и сказать вам, чтобы проверить эту ссылку, но я быстрее: P)

Конечно, чтобы достичь этого, bean должен быть установлен как session scoped. Если вы хотите быть request scoped вы можете следовать инструкциям here

Смежные вопросы