Vaadin
+
XTEND
BRUNO DEVIĆ

Vaadin is a framework for desktop-like Web Apps
SERVER BASED RIA FRAMEWORK
USES GWT AS RENDERING ENGINE
PURE JAVA, NO JAVASCRIPT, NO CONFIGURATION
RICH WIDGETSET
HELLO WORLD
import com.vaadin.server.VaadinRequest;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
public class HelloWorld extends UI {
@Override
protected void init(VaadinRequest request) {
VerticalLayout content = new VerticalLayout();
content.addComponent(new Label("Hello World!")); setContent(content);
}
}
}

Thin CLIENT
MVC + JSP
CLIENT SIDE RIA
MVC + EXTJS

SERVER SIDE RIA
VAADIN

EXPERIENCE
-
NOT AS SCALABLE - SESSION SIZE, REQUESTS
-
NO OFFLINE MODE
-
LOOK & FEEL - WIDGETS, LAYOUT OPTIONS, DOM SIZE
- NEW CODE STRUCTURE - MVP, EVENT BUS
SIMPLER
- 100% JAVA
-
Strongly typed - LESS BUGS, DEBUGGING
-
Object oriented - COMPONENTS
OPEN SOURCE
-
FREE APACHE LICENSE
-
OK DOCUMENTATION - BOOK OF VAADIN, SAMPLER, TRAC
LESS OVERHEAD
-
code stays on server
-
no UI SERVICES LAYER
-
FAST DEVELOPMENT - JREBEL
-
code stays on server
-
no UI SERVICES LAYER
-
FAST DEVELOPMENT - JREBEL
SERVER SIDE
- ANY JVM LANGUAGE - GROOVY, SCALADIN
-
ALL JAVA TOOLS AND LIBRARIES - ADDON FOR SPRING, ACTIVITI DEMO
-
SERVLET, PORTLET :) (LIFERAY), OSGi
VAADIN
PRO / CONS
XTEND IS A FLEXIBLE AND EXPRESSIVE DIALECT OF JAVA, WHICH COMPILES INTO READABLE JAVA 5 COMPATIBLE SOURCE CODE
YOU CAN USE ANY EXISTING JAVA LIBRARY SEAMLESSLY
THE COMPILED OUTPUT IS READABLE AND TENDS TO RUN AS FAST AS THE EQUIVALENT HANDWRITTEN JAVA CODE
COFFEESCRIPT FOR JAVA
JAVA'S TYPE SYSTEM AND LIBRARY
JAVA'S IDE SUPPORT
Xtend and Java are
100% interoperable
ANDROID AND GWT SUPPORT
JAVA
clearBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
List<Todo> result = new ArrayList<Todo>();
for(Todo t : getTodos()) {
if(!t.isDone()) {
result.add(t);
}
}
setTodos(result);
}
}
XTEND
clearBtn.addClickHandler [ todos = todos.filter[!done].toList ]
EXTENSION METHODS ENHANCE CLOSED TYPES WITH NEW FUNCTIONALITY
"hello".toFirstUpper() // calls StringExtensions.toFirstUpper("hello")
LAMBDA EXPRESSIONS CONCISE SYNTAX FOR ANONYMOUS FUNCTION LITERALS
Collections::sort(someStrings) [ a, b | a.length - b.length ]
ACTIVE ANNOTATIONS ANNOTATION PROCESSING ON STEROIDS
class MyClass {
@Lazy String myField = expensiveComputation()
}
TYPE INFERENCE YOU RARELY NEED TO WRITE DOWN TYPE SIGNATURES ANYMORE
def getResult() {
val results = #{"a" -> 1 ,"b" -> 2}
results.get("a")
}
PROPERTIES SHORTHANDS FOR ACCESSING AND DENING GETTERS AND SETTER
myObj.myProperty // myObj.getMyProperty() (when myObj.myProperty is not visible)
NO STATEMENTS EVERYTHING IS AN EXPRESSION
val data = try {
fileContentsToString(’data.txt’)
} catch (IOException e) {
"dummy data"
}
TEMPLATE EXPRESSIONS WITH INTELLIGENT WHITE SPACE HANDLING
def someHTML(List<Paragraph> paragraphs) ’’’
<html>
<body>
«FOR p : paragraphs»
«IF p.headLine != null»
<h1>«p.headline»</h1>
«ENDIF»
<p>
«p.text»
</p>
«ENDFOR»
</body>
</html>
DEMO
DECLARATIVE UI / DSL / BUILDER API
CODE GENERATION
Q & A

Vaadin +XTEND
By Bruno Dević
Vaadin +XTEND
- 707


