Отправка Ajax-запроса с использованием JavaScript в JSF - PullRequest
3 голосов
/ 31 мая 2011

В настоящее время я работаю над веб-приложением, которое использует библиотеку draw2d для рисования фигур и диаграмм. На стороне сервера я использую Java (JSF).

Я могу сказать, что 95% этого приложения - просто чистый JavaScript. Мне нравится иметь возможность отправлять запросы Ajax из моего JavaScript без необходимости использования скрытых полей, таких как <f:inputText> (возможно, с использованием компонентов jQuery Ajax?).

Я пытался обойти это, добавив другой скрытый компонент JFS и jsf.ajax.request, но по какой-то причине они не очень надежны, а иногда они не отправляют запрос ajax.

Есть предложения? Кроме того, насчет jQuery, я не уверен, как обработать запрос на стороне сервера.

Ответ: В итоге я воспользовался тем, что предложил Дейв. Ранее я пытался использовать jsFunction по этой ссылке , но я получил ошибку. По-видимому, проблема в том, что еще не реализовано в Richfaces 4. Однако, если вы используете, как упоминал Дэйв, это прекрасно работает.

Еще один момент, бобы не работали на меня, когда Дэйв потоптался. Я должен был изменить это следующим образом: @ManagedBean (name = "jsFunctionBean") @SessionScoped открытый класс JsFunctionBean {

/**
 * Test String name
 */
private String name;

public String getName() { return this.name; }
public void setName(String name) { this.name = name; }

/**
 * Test boolean
 */
private boolean test;
public boolean getTest() { return this.test; }
public void setTest(boolean test) { this.test = test; }    

/**
 * Action Method 
 * 
 * @return
 */
public String getActionMethod() {
    return null;
}

public String actionMethod(){
    this.test = true;
    this.name = "Dave";
    return null;
}
}

Я не уверен, почему это так, но если я удалю getActionMethod или actionMenthod, я получу ошибку!

Ответы [ 3 ]

5 голосов
/ 31 мая 2011

Если вы ищете стороннюю библиотеку Richfaces a4j: jsFunction предлагает возможность вызова метода на стороне сервера с функцией javascript, а также возможность передать объект, сериализованный как json, обратно в функцию обратного вызова:

<h:form id="form1" prependId="false">

    <a4j:jsFunction 
        name="submitApplication"
        action="#{jsFunctionBean.actionMethod}"
        data="#{jsFunctionBean}"
        oncomplete="processData(event.data)" 
        immediate="true">
    </a4j:jsFunction>

    <script type="text/javascript">
        //example callback function
        function processData(data) {
            alert(data.test);
            alert(data.name);
        }

        //call the ajax method from javascript
        submitApplication();
    </script>

</h:form>

И ваш Боб:

@ManagedBean(name = "jsFunctionBean")
@SessionScoped
public class JsFunctionBean {

    /**
     * Test String name
     */
    private String name;

    public String getName() { return this.name; }
    public void setName(String name) { this.name = name; }

    /**
     * Test boolean
     */
    private boolean test;
    public boolean getTest() { return this.test; }
    public void setTest(boolean test) { this.test = test; }    

    /**
     * Action Method 
     * 
     * @return
     */
    public String getActionMethod() {
        this.test = true;
        this.name = "Dave";
        return null;
    }


}
3 голосов
/ 31 мая 2011

К сожалению, JSF JSF API не поддерживает это. Это усовершенствование, однако, запрашивается как JSF spec проблема 613 . Не стесняйтесь голосовать за это.

На данный момент, ваша лучшая ставка на самом деле - иметь невидимую форму с <f:ajax>, которая запускается программной отправкой.

Например, этот Facelet

<h:form id="form" style="display:none;">
    <h:inputText id="input1" value="#{bean.input1}" />
    <h:inputText id="input2" value="#{bean.input2}" />
    <h:inputText id="input3" value="#{bean.input3}" />
    <h:commandButton value="submit" action="#{bean.submit}">
        <f:ajax execute="@form" />
    </h:commandButton>
</h:form>

с этим jQuery

<script>
    $('#form\\:input1').val('value1');
    $('#form\\:input2').val('value2');
    $('#form\\:input3').val('value3');
    $('#form').submit();
</script>

и этот управляемый компонент

private String input1;
private String input2;
private String input3;

public void submit() {
    // ...
}

// ...

Смотри также:


Обновление : теперь, 5 лет спустя, я лично реализовал выпуск 613 спецификации с новым компонентом JSF, <h:commandScript>. Это в значительной степени основано на OmniFaces <o:commandScript>. Это будет доступно в следующей версии JSF 2.3, которая в настоящее время уже доступна в качестве вехи. <h:commandScript> доступен с 2.3.0-m06 .

0 голосов
/ 14 июня 2016

Я понимаю, что это старый, но он все еще появляется в поисках Google по теме.

Здесь был дан отличный ответ (который описывает наиболее грубое использование пространства имен JS на стороне клиента jsf.ajax): Как использовать jsf.ajax.request для ручной отправки запроса ajax в JSF .

Кроме того, документацию Oracle по этому вопросу можно найти по адресу: http://docs.oracle.com/javaee/6/tutorial/doc/gkiow.html,, в которой подробно описывается использование AJAX с JSF с использованием предоставленного JSF тега f: ajax.

...