Окно поиска JSF2 - PullRequest
       6

Окно поиска JSF2

2 голосов
/ 25 сентября 2011

Я разрабатываю небольшое приложение на javaee6 и jsf2. Я хочу поле поиска без кнопки (просто введите и нажмите клавишу ввода и дать результат). У меня есть метод поиска в бобе:

public Book searchByTitle(String title) {
    this.book = bookFacade.searchByTitle(title);
    return book;
}

Я хочу вызвать этот метод через страницу jsf (с параметром? Возможно ли это?), Поэтому я пытаюсь сделать это:

    <h:form>
        <h:inputText id="search" value="#{bookBean.searchString}"></h:inputText>
        <h:commandButton value="Search by title" action="#{bookBean.searchByTitle}">
            <f:ajax execute="search" render="output"></f:ajax>
        </h:commandButton>
        <h2><h:outputText id="output" value="#{bookBean.book.title}"></h:outputText>
        </h2>
    </h:form>

Но это не работа. Как правильно сделать поле поиска на странице jsf2 xhtml?

Редактировать: я пытался вызвать функцию searchByTitle с / без параметра.

Заранее спасибо!

Ответы [ 2 ]

6 голосов
/ 25 сентября 2011

Первый шаг, если вы используете контейнер, совместимый с Java EE 6 (например, GlassFish V3, Resin 4, JBoss AS 6 или 7 и т. Д.), И вы добавили что-то вроде commons-el.jar в свой WEB-INF, удалить .Это не нужно и только навредит.

Я хочу поле поиска без кнопки (просто введите и нажмите ввод и выдайте результат)

В этомна случай, если вам также не нужна командная кнопка, но вы можете использовать что-то вроде этого:

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

    <h:body>        

        <h:form>
            <h:inputText id="search" value="#{bookBean.searchString}" 
                onkeypress="if (event.keyCode == 13) {onchange(event); return false;}"
                onchange="return event.keyCode !== undefined" 
            >
                <f:ajax listener="#{bookBean.updateBook}" render="output" />
            </h:inputText>

            <h2>
                <h:outputText id="output" value="#{bookBean.book}"/>
            </h2>
        </h:form>

    </h:body>
</html>

с bookBean, определенным как:

@ViewScoped
@ManagedBean
public class BookBean {

    private Map<String, String> exampleData = new HashMap<String, String>() {{ 
        put("dune", "The Dune Book"); 
        put("lotr", "The Lord of the Rings Book");
    }};

    private String searchString; 
    private String book;

    public void updateBook(AjaxBehaviorEvent event) {
        book = exampleData.get(searchString);
    }

    public String getSearchString() {
        return searchString;
    }

    public void setSearchString(String searchString) {
        this.searchString = searchString;
    }

    public String getBook() {
        return book;
    }

}

В Facelet обратите вниманиеважность элемента h:head.Без этого JSF не знает, куда вставить в ваш ответ необходимый сценарий для поддержки AJAX.

В этом примере метод onchange по умолчанию, который генерирует JSF, когда к такому клиенту добавляется поведение клиента f:ajaxПозвонил EditableValueHolder s вызывается всякий раз, когда пользователь нажимает ввод.Атрибут listener вызывает метод для вызова события AJAX.Поскольку searchString уже связан со свойством компонента поддержки, вам не нужно предоставлять его в качестве аргумента метода слушателя.

Небольшой недостаток этого метода заключается в том, что вызов AJAXтакже будет вызываться, когда вы изменяете значение в поле поиска и просто щелкаете за его пределами.

Обновление

Добавление обработчика onchange к h:inputText исправлена ​​вышеупомянутая проблема.JSF автоматически связывает этот код с AJAX-кодом из поведения клиента.Если он возвращает false, цепочка прерывается и, следовательно, вызов AJAX не выполняется.

Обработчик onchange="return event.keyCode !== undefined" вернет false, если обработчик вызван событием реального изменения;тогда объект события не будет иметь свойства keyCode.

1 голос
/ 25 сентября 2011

Используйте следующий код на своей странице jsf:

<h:form>
    <h:inputText id="search" value="#{bookBean.searchString}"></h:inputText>
    <h:commandButton value="Search by title" action="#{bookBean.searchByTitle(bookBean.searchString)}">
        <f:ajax execute="search" render="output"></f:ajax>
    </h:commandButton>
    <h2><h:outputText id="output" value="#{bookBean.book.title}"></h:outputText>
    </h2>
</h:form>

И ваш код Java:

// note the return type is String. return type of methods which are to be called from actions of commandlinks or commandbuttons should be string
public String searchByTitle(String title)
{
    this.book = bookFacade.searchByTitle(title);
    return null;
}

РЕДАКТИРОВАТЬ:

Во-первых, Что касается передачи параметров со страницы jsf, ее следует использовать, только если вы хотите передать свойство одного компонента другому компоненту. В вашем случае это не требуется, поскольку вы устанавливаете свойство (searchString) того же компонента и передаете его тому же компоненту.

Ваш второй вопрос : вы хотите, чтобы поиск работал без кнопки поиска: вы можете сделать это, добавив valueChangeListener к h:inputText. И установите атрибут event для f:ajax в blur

<h:form>
    <h:inputText id="search" value="#{bookBean.searchString}" valueChangeListener="#{bookBean.searchStringChanged}">
        <f:ajax execute="search" render="output" event="blur" />
    </h:inputText>
    <h2><h:outputText id="output" value="#{bookBean.book.title}" />
    </h2>
</h:form>

Также определите метод valueChangeListener для java-кода bookBean:

public void searchStringValueChanged(ValueChangeEvent vce)
{
    searchByTitle((String) vce.getNewValue);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...