2013-03-14 3 views
5

Я хочу, чтобы вызвать один метод по ссылке из Facelets:commandLink не вызывает действия слушателя, но CommandButton работает отлично

Моего Facelets код подобен:

<h:commandButton value="A" actionListener="#{customerData.searchedCustomerListA}" /> 

<h:commandLink value="A" actionListener="#{customerData.searchedCustomerListA}"/> 

Архивация кода боба, как:

public void searchedCustomerListA(ActionEvent ae){ 
    customerName = "A"; 
    leftCustomerListAvailable.clear(); 
    if(customerDataBean.getSearchedCustomerList(customerName)!= null) 
     leftCustomerListAvailable =customerDataBean.getSearchedCustomerList("A"); 
} 

Тот же самый код работает для <h:commandButton>, но не работает для <h:commandLink>. Как это вызвано и как я могу его решить?

+0

Вы видите ошибки в консоли JavaScript в браузере при нажатии кнопки 'commandLink'? – partlov

+0

Попробуйте использовать 'action' вместо' actionListener'. – pepuch

+0

Привет, pepuch, я тоже пытался действовать, но не получаю результата. –

ответ

0

Попробуйте это, это будет работать.

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 

<h:form> 

    <h:commandLink type="button" action="#{testBean.tsetLink}"> 
      <h:outputText value="A" /> 
    </h:commandLink> 

</h:form> 
</html> 

ManagedBean

@ManagedBean 
@RequestScoped 
public class TestBean { 

    public void tsetLink(){ 
    System.out.println("Link clicked!!!!!!!!!!!!"); 
    } 
} 
+0

Привет, я пробовал с вашим решением. Но все равно не получить результат. также я пробовал действие вместо actionListener. но результат тот же. –

+0

проблема с версией JSF? –

+0

Какую версию JSF вы используете? Используете ли вы какие-либо библиотеки компонентов, такие как простые шрифты, богатые лица? – neni

3

техническая разница между <h:commandLink> и <h:commandButton> является то, что ссылка использует JavaScript, чтобы представить родительскую форму. Поэтому, если это не работает, когда синтаксически эквивалентная кнопка работает нормально, это может означать только то, что либо JavaScript отключен в браузере, либо файл jsf.js, содержащий обязательные вспомогательные функции, не включен в страницу (что вам должно быть легко заметили, увидев ошибки JS в консоли JS встроенного инструментария разработчиков браузера).

Таким образом, чтобы решить эту проблему, вам нужно проверить, если JS включен в браузере, и что у Вас есть <h:head> компонент вместо обычного HTML <head> в шаблоне, так что JSF будет иметь возможность авто-включать jsf.js файл.

Если бизнес-требования вашего приложения требуют, чтобы приложение функционировало так, как было разработано с отключенным JS, тогда вы должны придерживаться <h:commandButton> и вставлять некоторый CSS, чтобы он выглядел как ссылка (например, удаление фона, отступов, вставка и т. д.).

0

Я столкнулся с этой же проблемой. Я понял, что commandLink не будет работать, когда в той же форме есть commandButton. Когда я перемещаю командуLink в другую форму, она может вызвать действие как обычно. Альтернативный подход заключается в добавлении атрибута «немедленно» = «истина» в commandLink.

<h:form> 
…… 
<div class="control-group"> 
    <div class="controls"> 
     <h:commandButton value="Login" action="#{usrCtrl.login}" class="btn btn-primary"/> 
     <h:commandLink action="#{usrCtrl.register}" value="test" immediate="true"/> 
    </div> 
</div> 
</h:form> 

Прочитано JSF and the “immediate” Attribute – Command Components, чтобы узнать, почему это работает.

0

В моем случае причиной этой проблемы был плохо настроенный фильтр перезаписи URL-адресов. Один из шаблонов фильтров непреднамеренно сопоставлен http://localhost:8080/mysite/javax.faces.resource/jsf.js.xhtml?ln=javax.faces, что предотвращает загрузку jsf.js. Проверьте этот ответ: Clicking h:commandLink causes Uncaught ReferenceError: mojarra is not defined.

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