Блок a4j: вызов поддержки, когда входное значение пусто - PullRequest
0 голосов
/ 23 марта 2012

Вот мой код:

<h:inputText size="22" 
    value="#{bean.searchString}"
    id="drugName">

    <a4j:support
        actionListener="#{bean.searchMedication}"
        ajaxSingle="true" reRender="contentListGrid"
        event="onkeyup" id="searchAjax" 
        requestDelay="200" 
        rendered="#{bean.searchString.length() > 0}">
    </a4j:support>
</h:inputText> 

Я бы хотел запретить вызов a4j:support всякий раз, когда поле ввода не заполнено.Я попробовал это, определив длину входного значения в атрибуте rendered.Однако это приводит к следующему исключению:

org.apache.jasper.JasperException: /pages/medication/MedicationList.jsp(147,9) The function length must be used with a prefix when a default namespace is not specified
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
    at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
    at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148)
    at org.apache.jasper.compiler.Validator$ValidateVisitor$1FVVisitor.visit(Validator.java:1478)

Что означает это сообщение?

Длина функции должна использоваться с префиксом, если пространство имен по умолчанию не указано

Разве мы не можем вызвать метод в EL?

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Что касается конкретного исключения, то вызов методов, не относящихся к свойствам (т. Е. Методов, отличных от методов получения / установки), поддерживается только с EL 2.2, который является частью Servlet 3.0 / JSP 2.2. Кажется, вы используете старый JSF 1.x и, следовательно, старый Servlet 2.5 / JSP 2.1. В основном вы получаете синтаксическую ошибку EL.

На самом деле, вам не нужен EL 2.2 для этого. Просто используйте ключевое слово empty.

rendered="#{not empty bean.searchString}"

Однако этот подход также не сработает. Атрибут rendered будет проверяться на стороне сервера, когда HTML-код должен быть сгенерирован и отправлен в браузер, а не во время событий на стороне клиента, как вы, вероятно, ожидаете (щелчок правой кнопкой мыши в браузере, Просмотр источника , вы видите какой-нибудь код JSF?). Вам необходимо использовать JavaScript, чтобы проверить длину входного значения в onkeyup поля или onsubmit вызова Ajax и вернуть false соответственно.

<h:inputText ... onkeyup="return (!!value)">

или (не гарантируется, что это работает, я не знаю, с какой стороны, какую разметку он генерирует)

<h:inputText ...>
    <a4j:support ... onsubmit="return (!!value)" />
</h:inputText>

Первый ! преобразует его в инвертированный boolean, а второй ! реверсирует его. Таким образом, вы получите полноценный результат возврата boolean в зависимости от наличия какого-либо значения. Если это false, то остальные функции onkeyup (такие как вы указали с помощью <a4j:support>) будут заблокированы.

1 голос
/ 23 марта 2012

Прочитайте ответ BalusC.

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

<h:inputText value="#{bean.searchString}" id="drugName">
    <a4j:support onsubmit="if ($F('theFormID:drugName') == '') { return false; }"
    .../>
</h:inputText>

($F('someId') эквивалентно document.getElementById('someId').value, с библиотекой JavaScript прототипа, который входит в Richfaces).

...