<Insert Picture Here>
Hyperproductive JSF 2.0Arun Gupta, Java EE & GlassFish Guyblogs.sun.com/arungupta, @arungupta
2
Beijing 2010
December 13–16, 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.
4
Features, features, features, ...
5
Facelets
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
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 & Password</title> </h:head> <h:body> <h1>Enter Name & 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>
8
Composite Components
9
This...
10
Becomes this...
11
Or maybe this:
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
13
Composite Components – Sample Code
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 & Password</title> </h:head> <h:body> <h1>Enter Name & 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>
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 & Password</title> </h:head> <h:body> <h1>Enter Name & 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
16
Integrated Ajax
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
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
19
Partial State Saving
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
21
View Parameters
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”
23
System Events
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
25
System Event Types
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>
27
Resources
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
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']}" />
30
Behaviors
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>
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"/>
33
Lot more features ...
• Annotations• Navigation• Exceptions• Validation• EL• Scopes• Project Stage
34
Annotations
• @ManagedBean• @*Scoped (Session, Request, etc)• @ManagedProperty• @FacesComponent• @FacesConverter• etc.• With implicit Navigation, may eliminate need
for faces-config.xml in many cases
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>
36
EL (Expression Langauge)
• #{component}, #{cc} (composite component): get the “currently” processed component / composite component
• #{component.clientId}• #{component.messageList}
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>
38
Project Stage
• Inspired by Rails• Development
– Better error reporting, debugging
• Production– Better performance
39
References
• glassfish.org• blogs.sun.com/theaquarium• youtube.com/user/GlassFishVideos• facebook.com/glassfish• Follow @glassfish
<Insert Picture Here>
Hyperproductive JSF 2.0Arun Gupta, Java EE & GlassFish Guyblogs.sun.com/arungupta, @arungupta