Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

40
<Insert Picture Here> Hyperproductive JSF 2.0 Arun Gupta, Java EE & GlassFish Guy blogs.sun.com/arungupta, @arungupta

description

Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

Transcript of Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

Page 1: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

<Insert Picture Here>

Hyperproductive JSF 2.0Arun Gupta, Java EE & GlassFish Guyblogs.sun.com/arungupta, @arungupta

Page 2: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

2

Beijing 2010

December 13–16, 2010

Page 3: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

3

The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions.The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.

Page 4: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

4

Features, features, features, ...

Page 5: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

5

Facelets

Page 6: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

6

Facelets

• Designed for JSF from beginning• XHTML + CSS

– Document validation

• Better error handling, including line numbers • Library prefixes as namespaces• EL directly in page:

– #{bean.propertyname}

• Templating made easy– ui:composition, ui:define, ui:insert– ui:include, ui:repeat

Page 7: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

7

Facelets – Sample Code

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <title>Enter Name &amp; Password</title> </h:head> <h:body> <h1>Enter Name &amp; Password</h1> <h:form> <h:panelGrid columns="2"> <h:outputText value="Name:"/> <h:inputText value="#{simplebean.name}" title="name" id="name" required="true"/> <h:outputText value="Password:"/> <h:inputText value="#{simplebean.password}" title="password" id="password" required="true"/> </h:panelGrid> <h:commandButton action="show" value="submit"/> </h:form> </h:body></html>

Page 8: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

8

Composite Components

Page 9: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

9

This...

Page 10: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

10

Becomes this...

Page 11: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

11

Or maybe this:

Page 12: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

12

Composite Components

• Enable True Abstraction– Create a true, reusable, component from an

arbitrary region of a page– Built by composing other components

• “Using” and “Defining” page• Full support for using attached objects in the

using page– Action methods– Validators, etc

Page 13: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

13

Composite Components – Sample Code

Page 14: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

14

Composite Component – Sample Code

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <title>Enter Name &amp; Password</title> </h:head> <h:body> <h1>Enter Name &amp; Password</h1> <h:form> <h:panelGrid columns="2"> <h:outputText value="Name:"/> <h:inputText value="#{simplebean.name}" title="name" id="name" required="true"/> <h:outputText value="Password:"/> <h:inputText value="#{simplebean.password}" title="password" id="password" required="true"/> </h:panelGrid> <h:commandButton action="show" value="submit"/> </h:form> </h:body></html>

Page 15: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

15

Composite Components - Mapping<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:ez="http://java.sun.com/jsf/composite/ezcomp"> <h:head> <title>Enter Name &amp; Password</title> </h:head> <h:body> <h1>Enter Name &amp; Password</h1> <h:form> <ez:username-password/> <h:commandButton action="show" value="submit"/> </h:form> </h:body></html>

http://blogs.sun.com/arungupta/entry/totd_147_java_server_faces

. . .WEB-INFindex.xhtmlresources/ ezcomp/ username-password.xhtml

Page 16: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

16

Integrated Ajax

Page 17: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

17

Integrated Ajax

• Inspiration – ADF, RichFaces, IceFaces, DynamicFaces

• Two entry points:– Declarative: <f:ajax> tag, uses AjaxBehavior– Programmatic ajax

• resource library javax.faces• resource name jsf.js• JavaScript namespace jsf.ajax.

–jsf.ajax.request function

Page 18: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

18

Integrated Ajax – Sample Code

<h:commandButton actionListener="#{sakilabean.findActors}" value="submit"> <f:ajax execute="length" render="actorTable totalActors"/></h:commandButton>

http://blogs.sun.com/arungupta/entry/totd_123_f_ajax_bean

Page 19: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

19

Partial State Saving

Page 20: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

20

Partial State Saving

• Inspired by Trinidad state saving• Save only the state that's changed since creation

of the component tree• Per-view state size up to 4X smaller• Default for pages written with Facelets• All standard components implement this feature

– Default for composite components

Page 21: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

21

View Parameters

Page 22: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

22

View Parameters

• Inspired by Page Parameters from Seam• Provides a declarative way to map request

parameters to EL-reachable location–<f:viewParam>, <f:metadata>

<f:metadata> <f:viewParam name="foo" value="#{bean.foo}"/></f:metadata>

page1.xhtml?foo=bar

bean.foo will equal “bar”

Page 23: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

23

System Events

Page 24: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

24

System Events

• Inspired by Solaris Dtrace, Linux strace, etc.• Publish/Subscribe event bus for things that

happen during the JSF Lifecycle• Adds to event listening abilities

– FacesEvent/FacesListener– PhaseEvent/PhaseListener– SystemEvent/SystemEventListener

Page 25: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

25

System Event Types

Page 26: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

26

System Events – Sample Code

<h:inputText> <f:event type="preValidate"

listener="#{bean.doSomePreValidation}"/> </h:inputText>

<h:inputText value="#{myBean.text}"> <f:event type="beforeRender" listener="#{myBean.beforeTextRender}"/></h:inputText>

Page 27: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

27

Resources

Page 28: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

28

Resources

• Standard way to serve image, JavaScripts, CSS, …– No need for separate Servlet or Filter– Logically related to components, treat them that way

• @ResourceDependency or @ResourceDependencies on custom components

• Built in support for CSS, Image, JavaScript resources

• /resources or /META-INF/resources

Page 29: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

29

Resource EL – Sample Code

• #{resource['<resource>']}• #{resource['<library>:<resource>']}• Examples of use

– <a href="#{resource['header.jpg']}" />– <h:graphicImage value="#{resource['corp:header.jpg']}" />

Page 30: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

30

Behaviors

Page 31: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

31

Behaviors

• A Behavior is an interface and invents a new type of “attached object” which takes part in decode/encode of a component

• 3 new behaviors – ClientBehavior, ClientBehaviorHolder, AjaxBehavior

<h:commandLink onclick="return confirm('Really???')"/>

<h:commandLink> <foo:confirm message="Really???"/></h:commandLink>

Page 32: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

32

Optional “faces-config.xml”

• <managed-bean> → @ManagedBean or @Named– Validator, Renderer, Listener, ...

• Default navigation rules – match a view on the disk– Conditional navigation

@Named(“simplebean”)public class SimpleBean {. . .}

<h:commandButton action="show" value="submit"/>

Page 33: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

33

Lot more features ...

• Annotations• Navigation• Exceptions• Validation• EL• Scopes• Project Stage

Page 34: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

34

Annotations

• @ManagedBean• @*Scoped (Session, Request, etc)• @ManagedProperty• @FacesComponent• @FacesConverter• etc.• With implicit Navigation, may eliminate need

for faces-config.xml in many cases

Page 35: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

35

Bookmarkable URLs

<h:link outcome="viewEntry" value="Link">

<f:param name="entry" value="#{aBean.entry}"/>

</h:link>

<a href="http://localhost:8080/myapp/viewEntry.xhtml?entry=entry1">Link</a>

Page 36: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

36

EL (Expression Langauge)

• #{component}, #{cc} (composite component): get the “currently” processed component / composite component

• #{component.clientId}• #{component.messageList}

Page 37: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

37

Validation

• Integration with JSR 303: Bean Validation–@NotEmpty String name;–default validator: javax.faces.Bean –

automatically applied to all input fields• Default-validator: hook up a validator for all

instances of EditableValueHolder• <f:validateBean>, <f:validateRequired>, <f:validateRegexp>

Page 38: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

38

Project Stage

• Inspired by Rails• Development

– Better error reporting, debugging

• Production– Better performance

Page 39: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

39

References

• glassfish.org• blogs.sun.com/theaquarium• youtube.com/user/GlassFishVideos• facebook.com/glassfish• Follow @glassfish

Page 40: Hyperproductive JSF 2.0 @ JavaOne Brazil 2010

<Insert Picture Here>

Hyperproductive JSF 2.0Arun Gupta, Java EE & GlassFish Guyblogs.sun.com/arungupta, @arungupta