summaryrefslogtreecommitdiffstats
path: root/documentation/articles/EnablingServerPush.asciidoc
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/articles/EnablingServerPush.asciidoc')
-rw-r--r--documentation/articles/EnablingServerPush.asciidoc136
1 files changed, 136 insertions, 0 deletions
diff --git a/documentation/articles/EnablingServerPush.asciidoc b/documentation/articles/EnablingServerPush.asciidoc
new file mode 100644
index 0000000000..37bd197cbb
--- /dev/null
+++ b/documentation/articles/EnablingServerPush.asciidoc
@@ -0,0 +1,136 @@
+[[enabling-server-push]]
+Enabling server push
+--------------------
+
+The traditional way of communication between client and server in Vaadin
+has been through XHR, i.e. AJAX requests. The client does a request to
+the server with information about RPC method invocations, which are
+executed on the server. As a result the state of one or several
+components is updated and the changes are sent back as a response to the
+client. Vaadin 7.1 introduces a new way of doing communications using
+server push, which enables the server to push state changes to the
+client without a request initiated by the client.
+
+To create a push enabled application you start by creating a normal
+Vaadin 7 project using Eclipse or Maven. First you need to add the
+vaadin-push package to your project, so open pom.xml or ivy.xml and add
+a vaadin-push dependency, e.g. in Ivy
+
+[source,xml]
+....
+<dependency org="com.vaadin" name="vaadin-push" rev="&vaadin.version;" conf="default->default" />
+....
+
+and in Maven
+
+[source,xml]
+....
+<dependency>
+ <groupId>com.vaadin</groupId>
+ <artifactId>vaadin-push</artifactId>
+ <version>${vaadin.version}</version>
+</dependency>
+....
+
+Open your UI class and add a @Push annotation to enable push for the ui
+
+[source,java]
+....
+@Push
+public class PushTestUI extends UI {
+...
+}
+....
+
+If you are using a servlet 3.0 compatible server, open *web.xml* and
+enable asynchronous processing by adding a
+`<async-supported>true</async-supported>` tag.
+
+Your servlet definition should look something like this:
+
+[source,xml]
+....
+<servlet>
+ <servlet-name>MyServlet</servlet-name>
+ <servlet-class>com.vaadin.server.VaadinServlet</servlet-class>
+ <init-param>
+ <param-name>ui</param-name>
+ <param-value>org.vaadin.example.MyUI</param-value>
+ </init-param>
+ <async-supported>true</async-supported>
+</servlet>
+....
+
+Your application is now setup for push and will automatically push
+changes to the browser when needed. You can test it out using e.g. the
+following UI which only adds a Label and starts a thread which does the
+real initialization:
+
+[source,java]
+....
+@Push
+public class PushTestUI extends UI {
+
+ private VerticalLayout mainLayout;
+
+ @Override
+ protected void init(VaadinRequest request) {
+ mainLayout = new VerticalLayout();
+ mainLayout.setSizeFull();
+ mainLayout.setMargin(true);
+ setContent(mainLayout);
+
+ mainLayout.setDefaultComponentAlignment(Alignment.MIDDLE_CENTER);
+ Label loadingText = new Label("Loading UI, please wait...");
+ loadingText.setSizeUndefined();
+ mainLayout.addComponent(loadingText);
+ new InitializerThread().start();
+ }
+
+ class InitializerThread extends Thread {
+ @Override
+ public void run() {
+ // Do initialization which takes some time.
+ // Here represented by a 1s sleep
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ }
+
+ // Init done, update the UI after doing locking
+ access(new Runnable() {
+ @Override
+ public void run() {
+ // Here the UI is locked and can be updated
+ mainLayout.removeAllComponents();
+ mainLayout
+ .addComponent(new TextArea("This is the real UI"));
+ }
+ });
+ }
+ }
+}
+....
+
+`InitializerThread` is a `Thread` which simulates some work using a
+sleep and then updates the UI with the real content. The UI update takes
+place inside an _access_ call, which ensures the UI (actually the
+`VaadinSession`) is locked to prevent synchronizations problems.
+
+Now deploy the application to your server and open the UI in a browser.
+You will see the "Loading..." text for roughly a second and when
+the initialization is complete, the Label will be replaced by a
+`TextArea`.
+
+The changes were automatically pushed to the browser when the
+_access_-block was done running. If you want full control on when
+changes are pushed to the client, add `@Push(PushMode.MANUAL)` instead and
+call `UI.push()` to push the changes (`UI.push()` needs to be called when
+the session is locked, so run that inside the _access_ block too).
+
+You can also configure push mode for the whole application using the
+`pushmode` servlet init parameter. Possible values are `automatic`, `manual`
+and `disabled`.
+
+It is also possible to switch the push mode on the fly using
+`UI.getPushConfiguration().setPushMode()`.