Статьи

PrimeFaces Push с атмосферой на GlassFish 3.1.2.2

PrimeFaces 3.4 вышел три дня назад. Помимо обычной удивительности новых и обновленных компонентов, она также включает новую платформу PrimeFaces Push. Основанный на Атмосфере, он предоставляет легкие механизмы толчка для ваших приложений. Вот как настроить и запустить его на последней версии GlassFish 3.1.2.2.

Препараты

Как обычно у вас должны быть установлены Java , Maven и GlassFish . Если вам это нужно из одних рук, попробуйте NetBeans 7.2 . Это новейшая и самая лучшая версия, в которой есть все, что нужно для этого примера. Установите части или целое в выбранное вами место и начните с создания нового домена GlassFish:

1
asadmin create-domain pf_push

принять значения по умолчанию и начать свой домен

1
asadmin start-domain pf_push

Теперь вам нужно включить поддержку Comet для вашего домена. Сделайте это с помощью http: // <host>: 4848 / admin ui или с помощью следующей команды:

1
asadmin set server-config.network-config.protocols.protocol.http-1.http.comet-support-enabled='true'

Это все, что вам нужно сделать, чтобы настроить свой домен.

Настройка проекта Maven

Теперь переключитесь на IDE и создайте новый проект Java EE 6 на основе Maven. Добавьте репозиторий primefaces в раздел <repositories> и добавьте зависимость primefaces в раздел вашего проекта <dependencies> или pom.xml вашего проекта:

01
02
03
04
05
06
07
08
09
10
11
12
<repository>
           <url>http://repository.primefaces.org/</url>
           <id>primefaces</id>
           <layout>default</layout>
           <name>Repository for library PrimeFaces 3.2</name>
       </repository>
 
<dependency>
           <groupId>org.primefaces</groupId>
           <artifactId>primefaces</artifactId>
           <version>3.4</version>
</dependency>

Кроме того, нам нужна последняя зависимость от атмосферы (в этом выпуске есть контракты с JeanFrancois Arcand )

1
2
3
4
5
<dependency>
            <groupId>org.atmosphere</groupId>
            <artifactId>atmosphere-runtime</artifactId>
            <version>1.0.0</version>
</dependency>

Он использует Log4j, и если вам нужно иметь больше выходных данных, было бы неплохо также включить соответствующую конфигурацию или соединить ее с JUL с помощью slf4j. Чтобы сделать позже, просто включите следующее в ваш pom.xml:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>slf4j-api</artifactId>
           <version>1.6.6</version>
       </dependency>
       <dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>slf4j-jdk14</artifactId>
           <version>1.6.6</version>
       </dependency>
       <dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>log4j-over-slf4j</artifactId>
           <version>1.6.6</version>
       </dependency>

Осталось сделать только одно. Компонент PrimePush должен иметь зарегистрированный канал сервлета. Итак, откройте ваш web.xml и добавьте в него следующее:

1
2
3
4
5
6
7
8
<servlet>
        <servlet-name>Push Servlet</servlet-name>
        <servlet-class>org.primefaces.push.PushServlet</servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name>Push Servlet</servlet-name>
        <url-pattern>/primepush/*</url-pattern>
</servlet-mapping>

Вот и все! На коду!

Код

Я собираюсь использовать пример, указанный в руководстве пользователя PrimeFaces . Очень простой пример с глобальным счетчиком, который можно увеличить.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.primefaces.push.PushContext;
import org.primefaces.push.PushContextFactory;
 
/**
 * Counter is a global counter where each button click increments the count
 * value and new value is pushed to all subscribers.
 *
 * @author eiselem
 */
@ManagedBean
@SessionScoped
public class GlobalCounterBean implements Serializable {
 
    private int count;
 
    public int getCount() {
        return count;
    }
 
    public void setCount(int count) {
        this.count = count;
    }
 
    public synchronized void increment() {
        count++;
        PushContext pushContext = PushContextFactory.getDefault().getPushContext(;
        pushContext.push('/counter', String.valueOf(count));
    }
}

PushContext содержит всю магию здесь. Он в основном используется для публикации и планирования сообщений, управления слушателями и многого другого. Это называется с вашего лица. Это выглядит просто и знакомо:

1
2
3
4
<h:form id='counter'>
<h:outputText id='out' value='#{globalCounterBean.count}' styleClass='display' />
<p:commandButton value='Click' actionListener='#{globalCounterBean.increment}' />
</h:form>

Это в основном ничего не делает, кроме увеличения счетчика. Таким образом, вы должны добавить еще немного магии для подключения к каналу push. Добавьте следующее ниже формы:

1
2
3
<p:socket channel='/counter' >
<p:ajax event='message' update='counter:out' />
</p:socket>

<p: socket /> — это компонент PrimeFaces, который обрабатывает соединение между сервером и браузером. Это делается путем определения канала связи и обратного вызова для обработки трансляций. Содержащийся компонент <p: ajax /> прослушивает событие сообщения и обновляет поле счетчика в форме. Однако для этого требуется и дополнительный сервер туда-обратно. Вы также можете сократить это, используя небольшой java-скрипт и привязав к нему атрибут onMessage, чтобы обновить поле вывода:

1
2
3
4
5
<script type='text/javascript'>
function handleMessage(data) {
$('.display').html(data);
}
</script>
1
<p:socket onMessage='handleMessage' channel='/counter' />

Это все. Поздравляем с первым примером PrimeFaces Push.

Приятного кодирования и не забудьте поделиться!

Ссылка: PrimeFaces Push with Atmosphere на GlassFish 3.1.2.2 от нашего партнера по JCG Маркуса Эйзела ( Markus Eisele) из блога « Разработка программного обеспечения для предприятий с использованием Java» .