Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / h:commandButton + f:ajax JSF / 8 сообщений из 8, страница 1 из 1
04.03.2015, 13:15
    #38894514
Aghial
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
h:commandButton + f:ajax JSF
Уважаемые, почему у меня при загрузке страницы срабатывает метод changeVisible(), хотя по моей задумке он должен срабатывать только по нажатию по кнопке?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
package beans;

import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@Named
@SessionScoped
public class SimpleBean implements Serializable {
    private boolean show=false; // поставил принудительную инициализацию

    public boolean isShow() {
        return show;
    }

    public void setShow(boolean show) {
        this.show = show;
    }
    
    public void changeVisible(){
        show = !show;
    }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:panelGrid>
                <h:outputText value="Данные1"/>
            </h:panelGrid>  
            <h:commandButton value="Показать/Скрыть">
                <f:ajax onevent="click" execute="#{simpleBean.changeVisible()}" render="out"/>
            </h:commandButton>

            <h:panelGrid id="out" rendered="#{simpleBean.show}">
                <h:outputText value="Скрытые первоначально данные"/>
            </h:panelGrid>
        </h:form>
    </h:body>
</html>



В результате при открытии страницы показывается блок "out"

Вопрос 2: как можно это сделать по-другому (пользователь вводит какие-то данные, нажимает "Вычислить" - в бине вычисляется необходимое и показывается panelGrid с помощью ajax на этой же странице)
...
Рейтинг: 0 / 0
04.03.2015, 13:51
    #38894562
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
h:commandButton + f:ajax JSF
1) возможно, из-за того, что jsf2.2 не поддерживается сервером (xmlns:h=" http://xmlns.jcp.org/jsf/html" поменять на старый)
2) аякс перерисовывает только то, что уже есть на форме. Допустим, h:panelGrid изначально не видна - тогда после нажатия на кнопку перерисовывать будет нечего. Надо примерно так:
Код: html
1.
2.
3.
            <h:panelGrid id="out" >
                <h:outputText rendered="#{simpleBean.show}" value="#{simpleBean.calculatedData}"/>
            </h:panelGrid>

- на форме всегда будет присутствовать элемент "out", перерисовываться будет его содержимое
...
Рейтинг: 0 / 0
04.03.2015, 13:54
    #38894569
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
h:commandButton + f:ajax JSF
3) ну и в самом f:ajax ошибка, надо вместо onevent="click" поставить event="onclick"
...
Рейтинг: 0 / 0
04.03.2015, 14:02
    #38894586
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
h:commandButton + f:ajax JSF
4) и еще одна ошибка в f:ajax: вместо execute="#{simpleBean.changeVisible()}" должно быть listener="#{simpleBean.changeVisible()}"

Рекомендую хотя бы иногда заглядывать в интерактивную справку :)
...
Рейтинг: 0 / 0
04.03.2015, 14:22
    #38894614
Aghial
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
h:commandButton + f:ajax JSF
ivanra,

Спасибо за ответ! Сервер использую glassfish4, проект из netbeans 7.3 - все по умолчанию

Вообще то что я написал - у меня работает) Только с точностью до наоборот - сначала все покажет, потом по нажатию кнопки адекватно скрывает - можно сделать грязный хак - при инициализации переменной установить ее в true и тогда все тип-топ.

Я взял буквально первый пример из JSF Core Хорстманна и начал его творчески перерабатывать. И справку и примеры искал и читал - но либо лыжи у меня не едут, либо нужно сначала набить все шишки

Вообще читаешь теорию, все кажется понятным - переходишь к самостоятельной практике - спотыкаешься на каждом шагу...
...
Рейтинг: 0 / 0
04.03.2015, 15:04
    #38894702
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
h:commandButton + f:ajax JSF
Aghial,
правильней сказать, что работает не сточностью до наоборот, а случайным образом.
1) атрибут onevent - вызывает js функцию под названием "click". Скорее всего, такой функции нет, и просто ничего не происходит. Допустим, такая функция была бы. Тогда она вызывалась до 3 раз, со статусами "begin", "complete" и "success"
2) атрибут event не указан. Точно не могу сказать, что в этом случае происходит, но, вероятно, аякс вызывается на все возможные UI события. Например, на событие onload - сразу, как только загрузилась страница. Отсюда и срабатывание при показе страницы.
3) не указан обработчик события на стороне сервера (actionlistener). В этом случае ничего не должно вызываться, происходит просто перерисовка области, указанная в атрибуте render
4) зато указан атрибут execute, в котором задается выражение для вычисления элементов, значения которых дролжны быть обработаны на севере. Сервер пытается вычислить это выражение, поэтому changeVisible все-таки срабатывает. Очевидно, вызов changeVisible осуществляется нечетное число раз, иначе мы бы даже не заметили его работы

В общем, при работе с аяксом надо четко понимать, что тут идет серверная и клиентская обработка. И хотя f:ajax позволяет писать программы без яваскрипта, но знать его тем не менее, надо, и как сама технология аякс работает - тоже
...
Рейтинг: 0 / 0
04.03.2015, 16:01
    #38894774
Aghial
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
h:commandButton + f:ajax JSF
ivanra,

Спасибо за подробный разбор.
Из Хорстманна - event для ajax для кнопок и ссылок по умолчанию - "action"

Итого код получился таким:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        <h:form>
            <h:panelGrid>
                <h:outputText value="Данные1"/>
            </h:panelGrid>  

            <h:panelGrid id="out">
                <h:outputText value="Скрытые первоначально данные" rendered="#{simpleBean.show}"/>
            </h:panelGrid>
            
            <h:commandButton value="Показать/Скрыть">
                <f:ajax listener="#{simpleBean.changeVisible()}" render="out"/>
            </h:commandButton>
        </h:form>



А все грабли - да, были именно такие
...
Рейтинг: 0 / 0
04.03.2015, 18:38
    #38895012
Aghial
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
h:commandButton + f:ajax JSF
Aghial,

Тут новый вопрос появился

Есть simpleBean с
Код: java
1.
private double doubleValue


Есть <
Код: java
1.
h:inputText value="#{simpleBean.doubleValue}"  id="lat">


который отображается при первом показе как "0.0"

Как сделать, чтобы первоначально это был пустой inputText, чтобы не маячили нули? Дальше будет ожидаться значение double обрабатываемое при помощи Converter и Validator.
"<c:if>"? - не пойму как.
Через JS? Как правильно?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / h:commandButton + f:ajax JSF / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]