SlideShare uma empresa Scribd logo
1 de 25
Go Fullstack: JSF for public sites
Michael Kurz | IRIAN
Agenda

• Motivation
• Architecture with/without EE 6 container
• Putting the pieces together (CDI and CODI)
• JSF and GET-Requests
• RESTful URLs with JSF and PrettyFaces
• Demonstrations and examples
Motivation

• http://scientific-consensus.com
• From GWT to JavaServer Faces
• Lightweight Java EE 6 architecture
• Does JSF really support HTTP GET?
Architecture and Technology Stack

   Architecture   With EE 6 container   No EE 6 container


   Presentation    JSF, CDI, CODI       JSF, CDI, CODI



     Service          EJB, CDI             CDI, CODI



   Data access        EJB, JPA          CDI, CODI, JPA
MyFaces Extensions CDI

• Portable extension of CDI
• Simplifies development with CDI and JSF
• Several modules:
 • JSF 1.2 and 2.0
 • JPA, bean validation...
• Works with:
 • CDI: OpenWebBeans, Weld
 • JSF: MyFaces, Mojarra (1.2 und 2.0)
• Watch out Apache DeltaSpike
Management of Persistence Context

• With Java EE container (EJB)

 @javax.ejb.Stateless
 public class CustomerRepository {
   @PersistenceContext private EntityManager em;
 }


• Without Java EE container (CDI + CODI)

 @ApplicationScoped
 public class CustomerRepository {
   @Inject private EntityManager em;
 }
Transaction Management

• With Java EE container
 • Transactions managed by container (@TransactionAttribute)
• Without Java EE container (CDI only)
 • Transactions managed by CODI

 @ApplicationScoped
 public class CustomerService {
   @Inject
   private CustomerRepository customerRepository;

     @Transactional
     public void saveUser(User user) {...}
 }
Demonstration




• Architecture with CDI and CODI




Beispiel: https://github.com/jsflive/mymail-get
The Web versus JSF




                 vs.
      HTTP GET         HTTP POST
JSF requests

• HTTP requests in classic JSF

            page1.xhtml               page2.xhtml               page3.xhtml
    GET                      POST                      POST

          /faces/page1.jsf          /faces/page1.jsf          /faces/page2.jsf


• Problems with HTTP POST:
 • Page reload problematic
 • URL in browser one step behind
 • Lack of bookmarkability/direct linking
• JSF 2: h:link, h:button and view parameters
JSF 2: Navigation with h:link and h:button

• Navigation target in attribut outcome
 <h:link outcome="/page1.xhtml" value="Page 1"/>
 <h:link outcome="/page2.xhtml" value="Page 2">
   <f:param name="para" value="1"/>
 </h:link>
 <h:button outcome="/page3.xhtml" value="Page 3"/>

• Renders link oder button (h:form not necessary)
 <a href="/page1.jsf">Page 1</a>
 <a href="/page2.jsf?para=1">Page 2</a>
 <input type="button" value="Page 3"
     onclick="window.location.href = '/pag3.jsf'"/>
JSF 2: View Parameters

• Bind request parameters to bean properties
• Tag f:viewParam in f:metadata

 <f:metadata>
   <f:viewParam name="id" value="#{myBean.id}"/>
 </f:metadata>

                                                   Converted and
 @Named @RequestScoped                               validated
 public class MyBean {
   private long id;
   public long getId() {return id;}
   public void setId(long id) {this.id = id;}
 }
What about view actions?

• JSF 2.0 "forgot" about them
• Alternative: PreRenderViewEvent
 <f:event type="preRenderView" listener="#{bean.preRender}"/>


• Alternative: CODI @PreRenderView
• Real view actions part of JSF 2.2

 <f:metadata>
   <f:viewParam name="id" value="#{bean.id}"/>
   <f:viewAction action="#{bean.load}"/>
 </f:metadata>
Post-Redirect-Get with JSF 2

• Request /faces/myPage.xhtml?id=1
 <h:form>
   <h:commandButton action="#{myBean.save}" value="Save"/>
   <h:commandButton value="Cancel" immediate="true"
       action="myPage?faces-redirect=true&amp;
                      faces-include-view-params=true"/>
 </h:form>

 @Named @RequestScoped
 public class MyBean {
   public String save() {
     return "myPage?faces-redirect=true"
            + "&faces-include-view-params=true";
   }
 }
Demonstration




• GET requests with h:link and h:button
• View Parameters
• Post-Redirect-Get with JSF

Beispiel: https://github.com/jsflive/jsf-get02
RESTful URLs



   http://myshop.at/node.html?mode=list&cat=1234




         http://myshop.at/products/books
Why RESTful URLs?

• Readability
• Search Engine Optimization (SEO)
• Confidence
• Looks prettier
RESTful URLs for JSF

• PrettyFaces: RESTful URLS for JSF
 • By OCPsoft, Open Source
• Features:
 • URL Rewriting
 • Enhanced navigation
 • Page actions
 • Seamless integration into JSF
 • Easy configuration
PrettyFaces: Example 1 (1)

• Remove "JSF parts" of URL



          http://myshop.at/faces/account.xhtml




               http://myshop.at/account
PrettyFaces: Example 1 (2)

• Configuration in pretty-config.xml
 <url-mapping id="account">
   <pattern value="/account"/>
   <view-id value="/faces/account.xhtml"/>
 </url-mapping>


• Annotation based configuration

 @Named @RequestScoped
 @URLMapping(id="account", pattern="/account",
     viewId="/faces/account.xhtml")
 public class AccountPage {}
PrettyFaces: Example 2 (1)

• Map part of URL to parameter



  http://myshop.at/faces/products/details.xhtml?id=123




              http://myshop.at/product/123
PrettyFaces: Example 2 (2)

• Configuration in pretty-config.xml
 <url-mapping id="productDetails">
   <pattern value="/product/#{id}"/>
   <view-id value="/faces/products/details.xhtml"/>
 </url-mapping>


• Path parameter used in view parameter

 <f:metadata>
   <f:viewParam name="id" value="#{bean.id}"/>
 </f:metadata>
 <f:event type="preRenderView" listener="#{bean.preRender}"/>
Demonstration




• PrettyFaces




Beispiel: https://github.com/jsflive/jsf-get03
Conclusion

• Lightweight Architecture with Java EE 6
• JSF 2 simplifies GET support
• PrettyFaces
• Necessary for the intranet?
Curious?




• Kurz, Marinschek, Müllan:
  JavaServer Faces 2.0, dpunkt.Verlag
• IRIAN JSF@Work Online-Tutorial
  http://jsfatwork.irian.at
• JSFlive Weblog
  http://jsflive.wordpress.com

Mais conteúdo relacionado

Mais procurados

Templates
TemplatesTemplates
Templates
soon
 
Rest with Java EE 6 , Security , Backbone.js
Rest with Java EE 6 , Security , Backbone.jsRest with Java EE 6 , Security , Backbone.js
Rest with Java EE 6 , Security , Backbone.js
Carol McDonald
 
Integration of Backbone.js with Spring 3.1
Integration of Backbone.js with Spring 3.1Integration of Backbone.js with Spring 3.1
Integration of Backbone.js with Spring 3.1
Michał Orman
 
Introduction to Backbone.js for Rails developers
Introduction to Backbone.js for Rails developersIntroduction to Backbone.js for Rails developers
Introduction to Backbone.js for Rails developers
AoteaStudios
 

Mais procurados (20)

Backbone js-slides
Backbone js-slidesBackbone js-slides
Backbone js-slides
 
CUST-1 Share Document Library Extension Points
CUST-1 Share Document Library Extension PointsCUST-1 Share Document Library Extension Points
CUST-1 Share Document Library Extension Points
 
Two scoops of django 1.6 - Ch7, Ch8
Two scoops of django 1.6  - Ch7, Ch8Two scoops of django 1.6  - Ch7, Ch8
Two scoops of django 1.6 - Ch7, Ch8
 
Suportando Aplicações Multi-tenancy com Java EE
Suportando Aplicações Multi-tenancy com Java EESuportando Aplicações Multi-tenancy com Java EE
Suportando Aplicações Multi-tenancy com Java EE
 
Templates
TemplatesTemplates
Templates
 
MongoDB & NoSQL 101
 MongoDB & NoSQL 101 MongoDB & NoSQL 101
MongoDB & NoSQL 101
 
Staying Sane with Drupal NEPHP
Staying Sane with Drupal NEPHPStaying Sane with Drupal NEPHP
Staying Sane with Drupal NEPHP
 
Rest with Java EE 6 , Security , Backbone.js
Rest with Java EE 6 , Security , Backbone.jsRest with Java EE 6 , Security , Backbone.js
Rest with Java EE 6 , Security , Backbone.js
 
Session 35 - Design Patterns
Session 35 - Design PatternsSession 35 - Design Patterns
Session 35 - Design Patterns
 
Alfresco tech talk live share extensibility metadata and actions for 4.1
Alfresco tech talk live share extensibility metadata and actions for 4.1Alfresco tech talk live share extensibility metadata and actions for 4.1
Alfresco tech talk live share extensibility metadata and actions for 4.1
 
Integration of Backbone.js with Spring 3.1
Integration of Backbone.js with Spring 3.1Integration of Backbone.js with Spring 3.1
Integration of Backbone.js with Spring 3.1
 
Introduction to Backbone.js for Rails developers
Introduction to Backbone.js for Rails developersIntroduction to Backbone.js for Rails developers
Introduction to Backbone.js for Rails developers
 
e-suap - client technologies- english version
e-suap - client technologies- english versione-suap - client technologies- english version
e-suap - client technologies- english version
 
netbeans
netbeansnetbeans
netbeans
 
Customizing the Document Library
Customizing the Document LibraryCustomizing the Document Library
Customizing the Document Library
 
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
 
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
Hyperproductive JSF 2.0 @ JavaOne Brazil 2010
 
Intorduction of Playframework
Intorduction of PlayframeworkIntorduction of Playframework
Intorduction of Playframework
 
Tikal's Backbone_js introduction workshop
Tikal's Backbone_js introduction workshopTikal's Backbone_js introduction workshop
Tikal's Backbone_js introduction workshop
 
Spring java config
Spring java configSpring java config
Spring java config
 

Semelhante a Go Fullstack: JSF for Public Sites (CONFESS 2012)

Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...
Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...
Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...
Lucidworks
 
Going Above JSF 2.0 with RichFaces and Seam
Going Above JSF 2.0 with RichFaces and SeamGoing Above JSF 2.0 with RichFaces and Seam
Going Above JSF 2.0 with RichFaces and Seam
Lincoln III
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
Fabio Franzini
 

Semelhante a Go Fullstack: JSF for Public Sites (CONFESS 2012) (20)

The Future of Plugin Dev
The Future of Plugin DevThe Future of Plugin Dev
The Future of Plugin Dev
 
RichFaces 4 Component Deep Dive - JAX/JSFSummit
RichFaces 4 Component Deep Dive - JAX/JSFSummitRichFaces 4 Component Deep Dive - JAX/JSFSummit
RichFaces 4 Component Deep Dive - JAX/JSFSummit
 
Java EE 8 Web Frameworks: A Look at JSF vs MVC
Java EE 8 Web Frameworks: A Look at JSF vs MVCJava EE 8 Web Frameworks: A Look at JSF vs MVC
Java EE 8 Web Frameworks: A Look at JSF vs MVC
 
Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...
Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...
Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...
 
London React August - GraphQL at The Financial Times - Viktor Charypar
London React August - GraphQL at The Financial Times - Viktor CharyparLondon React August - GraphQL at The Financial Times - Viktor Charypar
London React August - GraphQL at The Financial Times - Viktor Charypar
 
JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011JavaServer Faces 2.0 - JavaOne India 2011
JavaServer Faces 2.0 - JavaOne India 2011
 
Hypermedia: The Missing Element to Building Adaptable Web APIs in Rails
Hypermedia: The Missing Element to Building Adaptable Web APIs in RailsHypermedia: The Missing Element to Building Adaptable Web APIs in Rails
Hypermedia: The Missing Element to Building Adaptable Web APIs in Rails
 
Going Above JSF 2.0 with RichFaces and Seam
Going Above JSF 2.0 with RichFaces and SeamGoing Above JSF 2.0 with RichFaces and Seam
Going Above JSF 2.0 with RichFaces and Seam
 
SPTechCon Boston 2015 - Utilizing jQuery in SharePoint
SPTechCon Boston 2015 - Utilizing jQuery in SharePointSPTechCon Boston 2015 - Utilizing jQuery in SharePoint
SPTechCon Boston 2015 - Utilizing jQuery in SharePoint
 
Jsf2.0 -4
Jsf2.0 -4Jsf2.0 -4
Jsf2.0 -4
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
SPTechCon DevDays - SharePoint & jQuery
SPTechCon DevDays - SharePoint & jQuerySPTechCon DevDays - SharePoint & jQuery
SPTechCon DevDays - SharePoint & jQuery
 
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
Oracle Application Express & jQuery Mobile - OGh Apex Dag 2012
 
Code First with Serverless Azure Functions
Code First with Serverless Azure FunctionsCode First with Serverless Azure Functions
Code First with Serverless Azure Functions
 
DirectToWeb 2.0
DirectToWeb 2.0DirectToWeb 2.0
DirectToWeb 2.0
 
Going Serverless with Azure Functions in .NET
Going Serverless with Azure Functions in .NETGoing Serverless with Azure Functions in .NET
Going Serverless with Azure Functions in .NET
 
web2py:Web development like a boss
web2py:Web development like a bossweb2py:Web development like a boss
web2py:Web development like a boss
 
Introducing jee7 – jsf 2
Introducing jee7 – jsf 2Introducing jee7 – jsf 2
Introducing jee7 – jsf 2
 
From Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) AgainFrom Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) Again
 
JavaScript front end performance optimizations
JavaScript front end performance optimizationsJavaScript front end performance optimizations
JavaScript front end performance optimizations
 

Último

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Último (20)

[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptx
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Introduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDMIntroduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDM
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by Anitaraj
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 

Go Fullstack: JSF for Public Sites (CONFESS 2012)

  • 1. Go Fullstack: JSF for public sites Michael Kurz | IRIAN
  • 2. Agenda • Motivation • Architecture with/without EE 6 container • Putting the pieces together (CDI and CODI) • JSF and GET-Requests • RESTful URLs with JSF and PrettyFaces • Demonstrations and examples
  • 3. Motivation • http://scientific-consensus.com • From GWT to JavaServer Faces • Lightweight Java EE 6 architecture • Does JSF really support HTTP GET?
  • 4. Architecture and Technology Stack Architecture With EE 6 container No EE 6 container Presentation JSF, CDI, CODI JSF, CDI, CODI Service EJB, CDI CDI, CODI Data access EJB, JPA CDI, CODI, JPA
  • 5. MyFaces Extensions CDI • Portable extension of CDI • Simplifies development with CDI and JSF • Several modules: • JSF 1.2 and 2.0 • JPA, bean validation... • Works with: • CDI: OpenWebBeans, Weld • JSF: MyFaces, Mojarra (1.2 und 2.0) • Watch out Apache DeltaSpike
  • 6. Management of Persistence Context • With Java EE container (EJB) @javax.ejb.Stateless public class CustomerRepository { @PersistenceContext private EntityManager em; } • Without Java EE container (CDI + CODI) @ApplicationScoped public class CustomerRepository { @Inject private EntityManager em; }
  • 7. Transaction Management • With Java EE container • Transactions managed by container (@TransactionAttribute) • Without Java EE container (CDI only) • Transactions managed by CODI @ApplicationScoped public class CustomerService { @Inject private CustomerRepository customerRepository; @Transactional public void saveUser(User user) {...} }
  • 8. Demonstration • Architecture with CDI and CODI Beispiel: https://github.com/jsflive/mymail-get
  • 9. The Web versus JSF vs. HTTP GET HTTP POST
  • 10. JSF requests • HTTP requests in classic JSF page1.xhtml page2.xhtml page3.xhtml GET POST POST /faces/page1.jsf /faces/page1.jsf /faces/page2.jsf • Problems with HTTP POST: • Page reload problematic • URL in browser one step behind • Lack of bookmarkability/direct linking • JSF 2: h:link, h:button and view parameters
  • 11. JSF 2: Navigation with h:link and h:button • Navigation target in attribut outcome <h:link outcome="/page1.xhtml" value="Page 1"/> <h:link outcome="/page2.xhtml" value="Page 2"> <f:param name="para" value="1"/> </h:link> <h:button outcome="/page3.xhtml" value="Page 3"/> • Renders link oder button (h:form not necessary) <a href="/page1.jsf">Page 1</a> <a href="/page2.jsf?para=1">Page 2</a> <input type="button" value="Page 3" onclick="window.location.href = '/pag3.jsf'"/>
  • 12. JSF 2: View Parameters • Bind request parameters to bean properties • Tag f:viewParam in f:metadata <f:metadata> <f:viewParam name="id" value="#{myBean.id}"/> </f:metadata> Converted and @Named @RequestScoped validated public class MyBean { private long id; public long getId() {return id;} public void setId(long id) {this.id = id;} }
  • 13. What about view actions? • JSF 2.0 "forgot" about them • Alternative: PreRenderViewEvent <f:event type="preRenderView" listener="#{bean.preRender}"/> • Alternative: CODI @PreRenderView • Real view actions part of JSF 2.2 <f:metadata> <f:viewParam name="id" value="#{bean.id}"/> <f:viewAction action="#{bean.load}"/> </f:metadata>
  • 14. Post-Redirect-Get with JSF 2 • Request /faces/myPage.xhtml?id=1 <h:form> <h:commandButton action="#{myBean.save}" value="Save"/> <h:commandButton value="Cancel" immediate="true" action="myPage?faces-redirect=true&amp; faces-include-view-params=true"/> </h:form> @Named @RequestScoped public class MyBean { public String save() { return "myPage?faces-redirect=true" + "&faces-include-view-params=true"; } }
  • 15. Demonstration • GET requests with h:link and h:button • View Parameters • Post-Redirect-Get with JSF Beispiel: https://github.com/jsflive/jsf-get02
  • 16. RESTful URLs http://myshop.at/node.html?mode=list&cat=1234 http://myshop.at/products/books
  • 17. Why RESTful URLs? • Readability • Search Engine Optimization (SEO) • Confidence • Looks prettier
  • 18. RESTful URLs for JSF • PrettyFaces: RESTful URLS for JSF • By OCPsoft, Open Source • Features: • URL Rewriting • Enhanced navigation • Page actions • Seamless integration into JSF • Easy configuration
  • 19. PrettyFaces: Example 1 (1) • Remove "JSF parts" of URL http://myshop.at/faces/account.xhtml http://myshop.at/account
  • 20. PrettyFaces: Example 1 (2) • Configuration in pretty-config.xml <url-mapping id="account"> <pattern value="/account"/> <view-id value="/faces/account.xhtml"/> </url-mapping> • Annotation based configuration @Named @RequestScoped @URLMapping(id="account", pattern="/account", viewId="/faces/account.xhtml") public class AccountPage {}
  • 21. PrettyFaces: Example 2 (1) • Map part of URL to parameter http://myshop.at/faces/products/details.xhtml?id=123 http://myshop.at/product/123
  • 22. PrettyFaces: Example 2 (2) • Configuration in pretty-config.xml <url-mapping id="productDetails"> <pattern value="/product/#{id}"/> <view-id value="/faces/products/details.xhtml"/> </url-mapping> • Path parameter used in view parameter <f:metadata> <f:viewParam name="id" value="#{bean.id}"/> </f:metadata> <f:event type="preRenderView" listener="#{bean.preRender}"/>
  • 24. Conclusion • Lightweight Architecture with Java EE 6 • JSF 2 simplifies GET support • PrettyFaces • Necessary for the intranet?
  • 25. Curious? • Kurz, Marinschek, Müllan: JavaServer Faces 2.0, dpunkt.Verlag • IRIAN JSF@Work Online-Tutorial http://jsfatwork.irian.at • JSFlive Weblog http://jsflive.wordpress.com