Mastering JavaServer Faces 2.2
()
About this ebook
If you are a web developer who uses JSF, this is the book for you. Catering to an intermediate-advanced audience, the book assumes you have fundamental knowledge of JSF. It is intended for the developer who wants to improve their skills with the combined power of JSF 2.0, 2.1, and 2.2.
Read more from Anghel Leonard
Java Coding Problems: Become an expert Java programmer by solving over 200 brand-new, modern, real-world problems Rating: 0 out of 5 stars0 ratingsJSF 2.0 Cookbook: LITE Rating: 0 out of 5 stars0 ratingsjOOQ Masterclass: A practical guide for Java developers to write SQL queries for complex database interactions Rating: 0 out of 5 stars0 ratingsJava Coding Problems: Improve your Java Programming skills by solving real-world coding challenges Rating: 0 out of 5 stars0 ratingsJSF 2.0 Cookbook Rating: 0 out of 5 stars0 ratings
Related to Mastering JavaServer Faces 2.2
Related ebooks
Mastering Jenkins Rating: 3 out of 5 stars3/5Learn JSP in 24 Hours Rating: 0 out of 5 stars0 ratingsJavaScript : Object-Oriented Programming Rating: 0 out of 5 stars0 ratingsExt.NET Web Application Development Rating: 0 out of 5 stars0 ratingsMastering Akka Rating: 0 out of 5 stars0 ratingsNext.js: Navigating the Future of Web Development Rating: 0 out of 5 stars0 ratingsJavaScript for .NET Developers Rating: 0 out of 5 stars0 ratingsRapid Java Web Development Rating: 0 out of 5 stars0 ratingsSpring MVC Blueprints Rating: 0 out of 5 stars0 ratingsSpring MVC Cookbook Rating: 0 out of 5 stars0 ratingsJava SE 21 Developer Study Guide Rating: 5 out of 5 stars5/5Spring Essentials Rating: 0 out of 5 stars0 ratingsMastering Java: A Comprehensive Guide to Programming Excellence Category Rating: 0 out of 5 stars0 ratingsSpring MVC: Designing Real-World Web Applications Rating: 0 out of 5 stars0 ratingsPrimeFaces Beginner's Guide Rating: 0 out of 5 stars0 ratingsJava EE 7 Development with NetBeans 8 Rating: 5 out of 5 stars5/5Professional Java EE Design Patterns Rating: 0 out of 5 stars0 ratingsPro Angular 16 Rating: 0 out of 5 stars0 ratingsJava 8 to 21: Explore and work with the cutting-edge features of Java 21 (English Edition) Rating: 0 out of 5 stars0 ratingsOCA Java SE 7 Programmer I Certification Guide: Prepare for the 1Z0-803 exam Rating: 0 out of 5 stars0 ratingsLearning Django 5: Program web apps with complete django capabilities, ORM, Template, MongoDB and Docker containerization Rating: 0 out of 5 stars0 ratingsSpring Boot and Single-Page Applications: Securing Your API with a Single-Page Application Frontend - Second Edition Rating: 0 out of 5 stars0 ratingsIntroduction to JVM Languages Rating: 0 out of 5 stars0 ratingsMastering NetBeans Rating: 0 out of 5 stars0 ratingsJava: Best Practices to Programming Code with Java: Java Computer Programming, #3 Rating: 0 out of 5 stars0 ratingsJava Testing with Spock Rating: 0 out of 5 stars0 ratingsMockito Essentials Rating: 3 out of 5 stars3/5OCP Java SE 7 Programmer II Certification Guide: Prepare for the 1ZO-804 exam Rating: 0 out of 5 stars0 ratingsCode with Java 21: A practical approach for building robust and efficient applications (English Edition) Rating: 0 out of 5 stars0 ratings
Enterprise Applications For You
Creating Online Courses with ChatGPT | A Step-by-Step Guide with Prompt Templates Rating: 4 out of 5 stars4/5Notion for Beginners: Notion for Work, Play, and Productivity Rating: 4 out of 5 stars4/5Blockchain Data Analytics For Dummies Rating: 0 out of 5 stars0 ratingsLearn SAP Basis in 24 Hours Rating: 5 out of 5 stars5/5React Projects: Build 12 real-world applications from scratch using React, React Native, and React 360 Rating: 0 out of 5 stars0 ratingsAgile Project Management: Scrum for Beginners Rating: 4 out of 5 stars4/5Learn PMP in 24 Hours Rating: 0 out of 5 stars0 ratingsEvernote: How to Use Evernote to Organize Your Day, Supercharge Your Life and Get More Done Rating: 0 out of 5 stars0 ratingsFinancial Modelling in Power BI: Forecasting Business Intelligently Rating: 5 out of 5 stars5/5M Is for (Data) Monkey: A Guide to the M Language in Excel Power Query Rating: 4 out of 5 stars4/5Mastering the Microsoft Deployment Toolkit Rating: 0 out of 5 stars0 ratingsLearn SAP MM in 24 Hours Rating: 0 out of 5 stars0 ratingsPower BI for the Excel Analyst: Your Essential Guide to Power BI Rating: 0 out of 5 stars0 ratingsMicrosoft Excel Formulas: Master Microsoft Excel 2016 Formulas in 30 days Rating: 4 out of 5 stars4/5Excel 2021 Rating: 4 out of 5 stars4/5Change Management for Beginners: Understanding Change Processes and Actively Shaping Them Rating: 5 out of 5 stars5/5Enterprise AI For Dummies Rating: 3 out of 5 stars3/5Microsoft Power Platform A Deep Dive: Dig into Power Apps, Power Automate, Power BI, and Power Virtual Agents (English Edition) Rating: 0 out of 5 stars0 ratingsExcel VBA 24-Hour Trainer Rating: 3 out of 5 stars3/5Excel Formulas That Automate Tasks You No Longer Have Time For Rating: 5 out of 5 stars5/5Microsoft Power BI Cookbook: Convert raw data into business insights with updated techniques, use cases, and best practices Rating: 0 out of 5 stars0 ratingsTrend Following: Learn to Make a Fortune in Both Bull and Bear Markets Rating: 5 out of 5 stars5/5Blockchain Technology Revolution: The Next Big Thing to Change Everything for Everyone Rating: 0 out of 5 stars0 ratings
Reviews for Mastering JavaServer Faces 2.2
0 ratings0 reviews
Book preview
Mastering JavaServer Faces 2.2 - Anghel Leonard
Table of Contents
Mastering JavaServer Faces 2.2
Credits
About the Author
About the Reviewers
www.PacktPub.com
Support files, eBooks, discount offers, and more
Why subscribe?
Free access for Packt account holders
Instant updates on new Packt books
Preface
What this book covers
What you need for this book
Who this book is for
Conventions
Reader feedback
Customer support
Downloading the example code
Errata
Piracy
Questions
1. Dynamic Access to JSF Application Data through Expression Language (EL 3.0)
EL syntax
EL operators
EL precedence of operators
EL reserved words
EL immediate and deferred evaluation
EL value expressions
Referencing a managed bean
Referencing a managed bean's properties
Referencing a managed bean's nested properties
Referencing Java SE enumerated types
Referencing collections
EL implicit objects
EL method expressions
The conditional text in JSF
Writing a custom EL resolver
EL 3.0 overview
Working with the assignment operator
Working with the string concatenation operator
Working with the semicolon operator
Exploring lambda expressions
Working with collection objects
Summary
2. Communication in JSF
Passing and getting parameters
Using context parameters
Passing request parameters with the
Working with view parameters
Calling actions on GET requests
Passing attributes with the
Setting property values via action listeners
Passing parameters using the Flash scope
Replacing the
Sending data through cookies
Working with hidden fields
Sending passwords
Accessing UI component attributes programmatically
Passing parameters via method expressions
Communicating via the binding attribute
Managed bean communication
Injecting a managed bean into another bean
Communication between managed beans using the application/session map
Accessing other managed beans programmatically
Summary
3. JSF Scopes – Lifespan and Use in Managed Beans Communication
JSF scopes versus CDI scopes
The request scope
The session scope
The view scope
The application scope
The conversation scope
The flow scope
The simple flow
Flows with beans
Nested flows
Configuring flows programmatically
Flows and navigation cases
Inspecting flow navigation cases
Using the initializer and finalizer
Using the flow switch
Packaging flows
Programmatic flow scope
Dependent pseudo-scope
The none scope
The custom scope
Writing the custom scope class
Resolving a custom scope EL expression
Controlling the custom scope lifespan with action listeners
Controlling the custom scope lifespan with the navigation handler
Managed bean instantiation
Beans injection
Summary
4. JSF Configurations Using XML Files and Annotations – Part 1
JSF 2.2 new namespaces
JSF 2.2 programmatic configuration
Configuring managed beans in XML
Working with multiple configuration files
Configuring locales and resource bundles
Configuring validators and converters
Configuring navigation
Implicit navigation
Conditional navigation
Preemptive navigation
Programmatic Navigation
Configuring action listeners
Application action listeners
Configuring system event listeners
Using
Implementing SystemEventListener
Configuring phase listeners
Working with @ListenerFor and @ListenersFor
Summary
5. JSF Configurations Using XML Files and Annotations – Part 2
Configuring resource handlers
Adding CSS and JS resources programmatically
Configuring the view handler
Overriding JSF renders
Working with client behavior functionality
JSF factories
Configuring the global exception handler
Configuring RenderKit factory
Configuring PartialViewContext
Configuring visitContext
Configuring ExternalContext
Configuring Flash
JSF 2.2 Window ID API
Configuring lifecycle
Configuring the application
Configuring VDL
Combined power of multiple factories
Summary
6. Working with Tabular Data
Creating a simple JSF table
The CollectionDataModel class of JSF 2.2
Sorting tables
Sorting and DataModel – CollectionDataModel
Deleting a table row
Editing/updating a table row
Adding a new row
Displaying row numbers
Selecting a single row
Selecting multiple rows
Nesting tables
Paginating tables
Generating tables with the JSF API
Filtering tables
Styling tables
Alternate row colors with the rowclasses attribute
Highlighting rows on mouse hover
Highlighting rows on mouse click
Summary
7. JSF and AJAX
A brief overview of the JSF-AJAX lifecycle
A simple JSF-AJAX example to get started
The JSF-AJAX attributes
The execute and render attributes
The listener attribute
The event attribute
The onevent attribute – monitoring AJAX state on client
The onerror attribute – monitoring AJAX errors on client
Grouping components under
Updating input fields with AJAX after validation error
The Cancel and Clear buttons
Value submitted to a view scoped managed bean
Value submitted to a request scoped managed bean
Mixing AJAX and flow scope
Postback and AJAX
Postback request's conditional rendering/executing
Is it a non-AJAX request?
AJAX and
Queue control for AJAX requests
Explicit loading of jsf.js
Depicting the params value
Non-UICommand components and jsf.ajax.request
Customizing jsf.js
AJAX and the progress bar/indicator
Summary
8. JSF 2.2 – HTML5 and Upload
Working with HTML5 and JSF 2.2
Pass-through attributes
Pass-through elements
JSF 2.2 – HTML5 and Bean Validation 1.1 (Java EE 7)
JSF 2.2 upload feature
A simple JSF 2.2 upload example
Using multiple
Extracting info about a file to be uploaded
Writing uploaded data to a disk
Upload validator
Ajaxify the upload
Uploading images with preview
Uploading multiple files
Upload and the indeterminate progress bar
Upload and the determinate progress bar
Summary
9. JSF State Management
JSF saving the view state
JSF partial saving view state
Partial state saving and tree visiting
JSF saving view state on the server or client
JSF logical and physical views
Saving the state in a database – an experimental application
Writing the custom ResponseStateManager class
Adding MongoDB in equation
Handling ViewExpiredException
Server-state serialization in a session
JSF 2.2 is stateless
The view scoped beans and the stateless feature
Detecting stateless views programmatically
JSF security notes
Cross-site request forgery (CSRF)
Cross-site scripting (XSS)
SQL injection
Summary
10. JSF Custom Components
Building noncomposite custom components
Writing a custom tag handler
Dissecting a custom component
Custom component implementation
Building composite components
Developing the Temperature composite component
Transforming a jQuery component into composite component
Writing the HTML5 date picker as a composite component
Decorating an image with actions
Working with composite facets
Validating/converting inputs inside composite components
Checking the presence of an attribute
Composite components' pitfalls
Null values within a composite component's attributes
Hiding pass-through attributes in composite components
Counting the children of a composite component
Top-level component's pitfall
Distributing composite components as JARs in JSF 2.2
Adding composite components programmatically
Summary
11. JSF 2.2 Resource Library Contracts – Themes
Working with contracts
Styling tables with contracts
Styling UI components with contracts
Styling contracts across different devices
Writing contracts for composite components
Writing a theme switcher
Configuring contracts in XML
Packaging contracts in JARs
Summary
12. Facelets Templating
A brief overview of the Facelets tags
Creating a simple template – PageLayout
Passing parameters via
Passing bean properties and action methods via
Exploiting the
Iterating with
Working with
Working with
Debugging with
Removing the content with
Using the jsfc attribute
Extending the PageLayout template
Facelets' programmatic aspects
FaceletFactory considerations
Working with FaceletCache
ResourceResolver swallowed by ResourceHandler
Include Facelets programmatically
Creating a TagHandler class
Writing custom Facelets taglib functions
Facelets pitfalls
AJAX and
Exemplifying
Exemplifying
Summary
A. The JSF Life Cycle
Index
Mastering JavaServer Faces 2.2
Mastering JavaServer Faces 2.2
Copyright © 2014 Packt Publishing
All rights reserved. No part of this book may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, without the prior written permission of the publisher, except in the case of brief quotations embedded in critical articles or reviews.
Every effort has been made in the preparation of this book to ensure the accuracy of the information presented. However, the information contained in this book is sold without warranty, either expressed or implied. Neither the author, nor Packt Publishing, and its dealers and distributors will be held liable for any damages caused or alleged to be caused directly or indirectly by this book.
Packt Publishing has endeavored to provide trademark information about all of the companies and products mentioned in this book by the appropriate use of capitals. However, Packt Publishing cannot guarantee the accuracy of this information.
First published: June 2014
Production reference: 1190614
Published by Packt Publishing Ltd.
Livery Place
35 Livery Street
Birmingham B3 2PB, UK.
ISBN 978-1-78217-646-6
www.packtpub.com
Cover image by Pratyush Mohanta (<tysoncinematics@gmail.com>)
Credits
Author
Anghel Leonard
Reviewers
Mert Çalışkan
Michael Kurz
Thierry Leriche-Dessirier
Michael Müller
Luca Preziati
Commissioning Editor
Owen Roberts
Acquisition Editor
Owen Roberts
Content Development Editor
Sriram Neelakantan
Technical Editors
Krishnaveni Haridas
Taabish Khan
Pramod Kumavat
Mukul Pawar
Siddhi Rane
Copy Editors
Laxmi Subramanian
Project Coordinator
Akash Poojary
Proofreaders
Simran Bhogal
Ameesha Green
Paul Hindle
Samantha Lyon
Lucy Rowland
Indexers
Hemangini Bari
Mehreen Deshmukh
Tejal Soni
Graphics
Valentina Dsilva
Production Coordinator
Arvindkumar Gupta
Cover Work
Arvindkumar Gupta
About the Author
Anghel Leonard is a senior Java developer with more than 13 years of experience in Java SE, Java EE, and related frameworks. He has written and published more than 50 articles about Java technologies and more than 500 tips and tricks for many websites that are dedicated to programming. In addition, he has written the following books:
Tehnologii XML XML în Java, Albastra
Jboss Tools 3 Developer's Guide, Packt Publishing
JSF 2.0 Cookbook, Packt Publishing
JSF 2.0 Cookbook: LITE, Packt Publishing
Pro Java 7 NIO.2, Apress
Pro Hibernate and MongoDB, Apress
Currently, Anghel is developing web applications using the latest Java technologies on the market (EJB 3.0, CDI, Spring, JSF, Struts, Hibernate, and so on). Over the past two years, he's focused on developing rich Internet applications for geographic information systems.
About the Reviewers
Mert Çalışkan is a principal software architect living in Ankara, Turkey. He has over 10 years of expertise in software development with the architectural design of Enterprise Java web applications. He is an open source advocate for software projects such as PrimeFaces, and has also been a committer and founder to various others. He is the co-author of PrimeFaces Cookbook, Packt Publishing, which is the first book to be written on PrimeFaces. He is the co-author of Beginning Spring, Wiley Publications. He is also working as an author for RebelLabs. He shares his knowledge and ideas at local and international conferences such as JavaOne2014, JavaOne2013, JDC2010, and JSFDays2008. He is also a member of the OpenLogic Expert Community and the Apache Software Foundation.
I would like to thank my family, my beloved angel Funda, our advisers at Packt Publishing, and Anghel Leonard, the author of this great book.
Michael Kurz studied computer science at the Technical University of Vienna. Since then, his main professional focus has been on web development, especially in the Java EE domain. In 2007, he started working as a senior software developer for Irian Solutions in Vienna, Austria. His main focus there is to develop JSF and Java EE applications for various customers in Austria, Germany, and Switzerland. Additionally, he also does JSF trainings, talks at international conferences, and is an Apache MyFaces committer.
Besides his work as a software developer, he also likes to write about JSF-related techniques. In November 2009, his first book JavaServer Faces 2.0, dpunkt.verlag was published, followed by the updated edition JavaServer Faces 2.2 in November 2013 by the same publisher.
Furthermore, he is responsible for the contents of the German online JSF tutorial at http://jsfatwork.irian.at provided by Irian, and he also writes about JSF-related techniques in his blog at http://jsflive.wordpress.com.
Thierry Leriche-Dessirier works as a freelance JEE consultant in Paris. He has 20 years of experience in web and Agile development domains. He teaches software engineering at ESIEA, and in between two baby bottles, he also writes for blogs and magazines.
Michael Müller is an IT professional with more than 30 years of experience including about 25 years in the healthcare sector. During this time, he has worked in different areas, especially project and product management, consulting, and software development. He gained international knowledge not only by targeting international markets, but also by leading external teams (from Eastern Europe and India).
Currently, he is the head of software development at the German DRG institute (http://inek.org). In this role, he is responsible for web, Java, and .NET projects. Web projects are preferably built with Java technologies such as JSF and JavaScript. He is a JSF professional user and a member of the JSR 344 (JSF) expert group.
He frequently reads books and writes reviews as well as technical papers, which are mostly published in German-printed magazines and on his website at http://it-rezension.de. Besides that, he regularly blogs about software development at http://blog.mueller-bruehl.de.
Michael has done technical reviewing for Java 8 in Action, Manning Publications Co.
To my wife Claudia and my children: thank you for your patience during night reading and other long sessions. I love you!
Luca Preziati lives in Milan and has worked for six years as a Java consultant, focusing the past five years on document management systems handling massive volumes of data. In 2014, he joined GFT Italia full time. He has considerable experience with both Alfresco and Documentum, as well as Liferay and Kettle. In his free time, he enjoys swimming, biking, playing the guitar, and wine tasting with his girlfriend.
I would like to thank all of my mentors: my parents, Ernesto and Clelia, who taught me much about work while running their own business (www.mintel.it); my brothers, Alessio and Stefano; and my girlfriend, Arianna.
www.PacktPub.com
Support files, eBooks, discount offers, and more
You might want to visit www.PacktPub.com for support files and downloads related to your book.
Did you know that Packt offers eBook versions of every book published, with PDF and ePub files available? You can upgrade to the eBook version at www.PacktPub.com and as a print book customer, you are entitled to a discount on the eBook copy. Get in touch with us at
At www.PacktPub.com, you can also read a collection of free technical articles, sign up for a range of free newsletters, and receive exclusive discounts and offers on Packt books and eBooks.
http://PacktLib.PacktPub.com
Do you need instant solutions to your IT questions? PacktLib is Packt's online digital book library. Here, you can access, read, and search across Packt's entire library of books.
Why subscribe?
Fully searchable across every book published by Packt
Copy and paste, print, and bookmark content
On demand and accessible via web browser
Free access for Packt account holders
If you have an account with Packt at www.PacktPub.com, you can use this to access PacktLib today and view nine entirely free books. Simply use your login credentials for immediate access.
Instant updates on new Packt books
Get notified! Find out when new books are published by following @PacktEnterprise on Twitter, or the Packt Enterprise Facebook page.
Preface
This book will cover all the important aspects (Big Ticket features) involved in developing JSF 2.2 applications. It provides clear instructions for getting the most out of JSF 2.2 and offers many exercises (more than 300 complete applications) to build impressive JSF-based web applications.
We start off with a chapter about Expression Language (EL) and cover the most important aspects of EL 2.2 and EL 3.0. We continue with a comprehensive dissertation about communication in JSF, followed by an exciting chapter about JSF 2.2 scopes. At this point, we bring into discussion most of the JSF artifacts and configurations. Further, we start a suite of very interesting topics, such as HTML5 and AJAX. After that we dissect the JSF view state concept and learn how to deal with this delicate JSF topic. Furthermore, we will discuss in detail about custom components and composite components. After this, we will talk about library contracts (themes) of JSF 2.2 resources. Finally, the last chapter will fortify your knowledge about JSF 2.2 Facelets.
What this book covers
Chapter 1, Dynamic Access to JSF Application Data through Expression Language (EL 3.0), covers the main aspects of Expression Language (EL). We will cover EL 2.2 and EL 3.0, including new operators, lambda expressions, and collection object support.
Chapter 2, Communication in JSF, represents a dissection of JSF mechanisms used for ensuring communication between JSF artifacts. Therefore, we will cover context parameters, request parameters, JSF 2.2 actions on GET requests (view actions), and more.
Chapter 3, JSF Scopes – Lifespan and Use in Managed Beans Communication, teaches you to distinguish between the bad and good practices of using JSF and CDI scopes. We will discuss JSF scopes versus CDI scopes, request, session, view scope (including the new JSF 2.2 view scope), application, conversation scope, JSF 2.2 flow scope in detail (Big Ticket feature), and more.
Chapter 4, JSF Configurations Using XML Files and Annotations – Part 1, depicts the JSF artifact's configuration aspects in a learning-by-example fashion. Configuring JSF artifacts in the faces-config.xml file is pretty straightforward and boring, but if we take each artifact and exploit its potential in several use cases, then things become much more interesting.
Chapter 5, JSF Configurations Using XML Files and Annotations – Part 2, acts as a continuation of the previous chapter. Here, we will discuss configuring resource handlers (JSF 2.2's new javax.faces.WEBAPP_RESOURCES_DIRECTORY context parameter), configuring flash (JSF 2.2 FlashFactory, FlashWrapper, and flash system events), JSF 2.2 Window ID API, the injection mechanism (which, starting with JSF 2.2, is possible in most JSF artifacts), and more.
Chapter 6, Working with Tabular Data, pays tribute to the
Chapter 7, JSF and AJAX, exploits the JSF 2.2 delay attribute for queue control of AJAX requests. It discusses how to reset value attributes using JSF 2.2 (input fields can be updated with AJAX after a validation error), AJAX and JSF 2.2 flow scope, how to customize AJAX script, and more. This is a classic chapter in almost any JSF book.
Chapter 8, JSF 2.2 – HTML5 and Upload, divides the topic into two parts. The first part is entirely dedicated to the Big Ticket feature, HTML5, and JSF 2.2 (pass-through attributes and elements). The second part is dedicated to JSF 2.2's new upload component,
Chapter 9, JSF State Management, provides a detailed dissertation about the JSF view state. The headings of this chapter will refer to JSF's saving view state (including JSF 2.2 case insensitivity for state saving method and standardized server state serialization) and JSF 2.2 stateless view (Big Ticket feature).
Chapter 10, JSF Custom Components, is another example of a classic chapter in any JSF book. Obviously, the main topics are meant to shape the custom and composite components creation. We will focus on developing several kinds of components based on the new JSF 2.2 approach (Facelet's component tag can be declared via annotation).
Chapter 11, JSF 2.2 Resource Library Contracts – Themes, dedicates itself to the new JSF 2.2 Resource Library Contracts feature (Big Ticket feature). You will learn how to work with contracts, style JSF tables and UI components using contracts, style contracts across different kind of devices, and more.
Chapter 12, Facelets Templating, depicts the viral aspects of Facelets templating. We will focus on the declarative and programmatical aspects of Facelets.
Appendix, The JSF Life Cycle, covers a diagram of the different JSF phases.
What you need for this book
In order to run the applications in this book, you will need the following software applications:
NetBeans IDE (preferred version is 8.0, or later)
GlassFish 4.0
JSF Mojarra 2.2.6 (preferred) / MyFaces 2.2.2
Who this book is for
This book is a perfect symbiosis between JSF 2.0 and 2.2. It is dedicated to JSF developers who have previous experience and want to upgrade their knowledge to the new JSF 2.2. By fortifying your knowledge on JSF 2.0 and adding the power of JSF 2.2, you will soon become a JSF expert.
Conventions
In this book, you will find a number of styles of text that distinguish between different kinds of information. Here are some examples of these styles, and an explanation of their meaning.
Code words in text, database table names, folder names, filenames, file extensions, pathnames, dummy URLs, user input, and Twitter handles are shown as follows: For example, in the following example, you call a method named firstLambdaAction—the lambda expression is invoked from this method.
A block of code is set as follows:
t
>
#{t}
When we wish to draw your attention to a particular part of a code block, the relevant lines or items are set in bold:
#{table}
var=t
>
New terms and important words are shown in bold. Words that you see on the screen, in menus or dialog boxes for example, appear in the text like this: When the Login button is clicked, JSF will call the playerLogin method.
Note
Warnings or important notes appear in a box like this.
Tip
Tips and tricks appear like this.
Reader feedback
Feedback from our readers is always welcome. Let us know what you think about this book—what you liked or may have disliked. Reader feedback is important for us to develop titles that you really get the most out of.
To send us general feedback, simply send an e-mail to <feedback@packtpub.com>, and mention the book title via the subject of your message.
If there is a topic that you have expertise in and you are interested in either writing or contributing to a book, see our author guide on www.packtpub.com/authors.
Customer support
Now that you are the proud owner of a Packt book, we have a number of things to help you to get the most from your purchase.
Downloading the example code
You can download the example code files for all Packt books you have purchased from your account at http://www.packtpub.com. If you purchased this book elsewhere, you can visit http://www.packtpub.com/support and register to have the files e-mailed directly to you.
Errata
Although we have taken every care to ensure the accuracy of our content, mistakes do happen. If you find a mistake in one of our books—maybe a mistake in the text or the code—we would be grateful if you would report this to us. By doing so, you can save other readers from frustration and help us improve subsequent versions of this book. If you find any errata, please report them by visiting http://www.packtpub.com/submit-errata, selecting your book, clicking on the errata submission form link, and entering the details of your errata. Once your errata are verified, your submission will be accepted and the errata will be uploaded on our website, or added to any list of existing errata, under the Errata section of that title. Any existing errata can be viewed by selecting your title from http://www.packtpub.com/support.
Piracy
Piracy of copyright material on the Internet is an ongoing problem across all media. At Packt, we take the protection of our copyright and licenses very seriously. If you come across any illegal copies of our works, in any form, on the Internet, please provide us with the location address or website name immediately so that we can pursue a remedy.
Please contact us at <copyright@packtpub.com> with a link to the suspected pirated material.
We appreciate your help in protecting our authors, and our ability to bring you valuable content.
Questions
You can contact us at <questions@packtpub.com> if you are having a problem with any aspect of the book, and we will do our best to address it.
Chapter 1. Dynamic Access to JSF Application Data through Expression Language (EL 3.0)
Java Expression Language (EL) is a compact and powerful mechanism that enables dynamic communication in JSP and JSF-based applications (including development frameworks based on JSF such as PrimeFaces, ICEfaces, and RichFaces); we embed expressions in the presentation layer to communicate with the application logic layer. EL provides bidirectional communication, which means that we can expose application logic data to the user, but we also can submit user data to be processes. Generically speaking, EL can be used to populate HTTP requests with user data, to extract and expose data from HTTP responses, to update HTML DOM, to conditionally process data, and much more.
Note
Commonly, EL expressions will be present in JSP and JSF pages, but they can also appear outside, in faces-config.xml, for example.
In this chapter, you will see how to use EL in web pages to communicate with managed beans, which is the most common case in JSF applications. We will cover the following topics:
EL syntax, operators, and reserved words
EL immediate and deferred evaluation
EL value and method expressions
The conditional text in JSF
Write a custom EL resolver
EL syntax
In this section, you can see an overview of the main aspects of EL 2.2 and 3.0 syntax. EL supports a handful of operators and reserved words. Each of these are quickly described in the following section (more details are in the EL specification document (http://download.oracle.com/otndocs/jcp/el-3_0-fr-eval-spec/index.html)).
EL operators
EL supports the following categories of operators—arithmetic, relational, logical, conditional, empty and added starting with EL 3.0, string concatenation, assignment and semicolon operators:
EL precedence of operators
Conforming to EL specification, the precedence of operators from the highest to lowest, left to right is as follows:
[].
() (used to change the precedence of operators)
- (unary) not ! empty
* / div % mod
+- (binary)
+=
< > <= >= lt gt le ge
== != eq ne
&& and
|| or
?:
-> (lambda expression)
=
;
EL reserved words
EL defines the following reserved words:
and, or, not, eq, ne, lt, gt, le, ge, true (Boolean literal), false (Boolean literal), null, instanceof (a Java keyword to do a class comparison between objects), empty, div, and mod
EL immediate and deferred evaluation
EL evaluates expressions as immediate or deferred.
Immediate evaluation returns the result as soon as the page is first rendered. These kinds of expressions are read-only value expressions and they can be present only in tags that accept runtime expressions. They are easy to recognize after the ${} notation. Usually, they are used for arithmetic and logical operations in JSP pages.
Deferred evaluation can return the result at different phases of a page's life cycle depending on the technology that is using the expression. JSF can evaluate the expression at different phases of the life cycle (for example, during the rendering and postback phase), depending on how the expression is being used in the page. These kind of expressions can be value and method expressions, and they are marked by the #{} notation.
Note
In Facelets, ${} and #{} act the same.
EL value expressions
Value expressions are probably used the most, and they refer to objects and their properties and attributes. Such expressions are dynamically used to evaluate results or set bean properties at runtime. Through value expressions, you can easily access JavaBeans components, collections, and Java SE enumerated types. Moreover, EL provides a set of implicit objects that can be used to get attributes from different scopes and parameter values. Furthermore, you will see how EL deals with each of these objects.
Note
Value expressions that can read data, but cannot write it are known as rvalue (${} expressions are always rvalue), while those that can read and write data are known as lvalue (#{} expressions can be rvalue and/or lvalue).
Referencing a managed bean
Referencing a managed bean is not exactly a useful example, but it is a good point to start. Most commonly, your managed bean will look like the following code (in this case, the bean's class name is PlayersBean):
@ManagedBean
//some scope
public class PlayersBean{
...
}
Or, in the CDI version, your managed bean will be as follows:
@Named
//some scope
public class PlayersBean{
...
}
Or, with an explicit name, your managed bean will be as follows:
@ManagedBean(name = myPlayersBean
)
//some scope
public class PlayersBean{
...
}
@Named(value = myPlayersBean
)
//some scope
public class PlayersBean{
...
}
Now, for the first two examples, EL refers to the PlayersBean managed bean, like this—the name is obtained from taking the unqualified class name portion of the fully qualified class name and converting the first character to lowercase as follows:
#{playersBean}
In addition, for the next two examples, EL uses the explicit name as follows:
#{myPlayersBean}
Note
You should use CDI beans whenever possible since they are more flexible than JSF managed beans, and because annotations from javax.faces.bean will be deprecated in a future JSF version. Therefore, the CDI ones are recommended.
When the referenced managed bean cannot be found in any scope, a null value will be returned.
Tip
Downloading the example code
You can download the example code files for all Packt books you have purchased from your account at http://www.packtpub.com. If you purchased this book elsewhere, you can visit http://www.packtpub.com/support and register to have the files e-mailed directly to you.
Referencing a managed bean's properties
As is commonly known, managed beans usually contain private fields, which are accessible through getter and setter methods as bean properties, and some public methods that exploits these properties to serve different logic tasks.
EL expressions that can access these properties contain the dot or square brackets notation, []. For example, let's suppose that the PlayersBean managed bean contains two fields defined like the following lines:
private String playerName = Rafael
;
private String playerSurname = Nadal
;
EL can access these fields through their getter methods; therefore, you need to define them as shown in the following code:
public String getPlayerName() {
return playerName;
}
public String getPlayerSurname() {
return playerSurname;
}
Now, an expression that accesses the playerName property can use the dot notation (.) to refer it, as shown in the following line of code:
#{playersBean.playerName}
Alternatively, this expression can use the square brackets notation, [], as shown in the following line of code:
#{playersBean['playerName']}
Note
JSF evaluates this expression from left to right. First, it searches for playersBean in all available scopes (such as request, session, and application). Then, the bean is instantiated and the getPlayerName/getPlayerSurname getter methods are called (in the case of Boolean properties, the getter method will be named as isXXX).When you are using the [] notation, you can use simple or double quotes. Just remember to alternate them correctly in cases like the following quotations.
An incorrect quotation (you cannot use double quotes inside double quotes) is:
]}
/>
An incorrect quotation (you cannot use simple quotes inside simple quotes) is:
A correct quotation (you can use simple quotes in double quotes) is:
A correct quotation (you can use double quotes in simple quotes) is:
Referencing a managed bean's nested properties
Usually, managed beans use nested properties. Such properties can be accessed by EL using the . and [] notations multiple times in the same expression.
For example, the PlayersBean managed bean may represent general data about tennis players, such as name, surname, titles, and finals. More detailed information, such as birthday, birthplace, height, and weight can be represented through a different class named PlayersDetails. Now, the PlayersBean managed bean contains a field of type PlayersDetails, which means that birthday, birthplace, and so on become nested properties of PlayersBean. Speaking in code lines, the relevant part of the PlayersDetails class is as follows:
public class PlayerDetails {
private Date birthday;
private String birthplace;
...
public Date getBirthday() {
return birthday;
}
public String getBirthplace() {
return birthplace;
}
...
}
The managed bean of the PlayersBean class is as follows:
@Named
public class PlayersBean{
private String playerName = Rafael
;
private String playerSurname = Nadal
;
private PlayerDetails playerDetails;
public String getPlayerName() {
return playerName;
}
public String getPlayerSurname() {
return playerSurname;
}
public PlayerDetails getPlayerDetails() {
return playerDetails;
}
...
}
You already know how to call the playerName and playerSurname properties using the . and [] notations. Next, you can use the same notations to access the birthday and birthplace nested properties, as shown in the following code:
#{playersBean.playerDetails.birthday}
#{playersBean.playerDetails.birthplace}
#{playersBean['playerDetails']['birthday']}
#{playersBean['playerDetails']['birthplace']}
Or, you can use both notations in the same expressions, as shown in the following code:
#{playersBean.playerDetails['birthday']}
#{playersBean.playerDetails['birthplace']}
#{playersBean['playerDetails'].birthday}
#{playersBean['playerDetails'].birthplace}
Of course, the PlayerDetails class can contain its own nested properties and so. In this case, just use the . and [] notations to get deeper in the hierarchy of objects until you reach the desired property.
In the preceding expressions, JSF search for playersBean in all the available scopes (request, session, application, and so on) and obtain an instance of it. Afterwards, it calls the getPlayerDetails method and the getBirthday method on result of the getPlayerDetails method (and the same for the birthplace property).
Referencing Java SE enumerated types
EL can access Java SE enumerated types using a String literal. For example, let's have an enumerated type defined in PlayersBean, as shown in the following code:
public enum Plays {
Left, Right
};
private Plays play;
...
play = Plays.Left;//initialization can be done in constructor
...
public Plays getPlay() {
return play;
}
...
You can easily output the play value as shown in the following line of code:
#{playersBean.play}
To refer to the Plays constant, Plays.Left, with an expression, use the String literal Left (or Right for Plays.Right), for example, you can test whether play is Left or Right, as shown in the following code:
#{playersBean.play == 'Left'} //return true
#{playersBean.play == 'Right'}//return false
Referencing collections
Collection items (arrays, lists, maps, sets, and so on) can be accessed from EL expressions by specifying a literal value that can be converted to an integer or the [] notation with an integer and without quotes.
For example, let's suppose that the PlayersBean managed bean contains an array named titles_2013 that keeps the titles won by a player in 2013. The array is defined as shown in the following code:
private String[] titles_2013 = {Sao Paulo
, Acapulco
, ATP World Tour Masters 1000 Indian Wells
, Barcelona
, ...};
...
public String[] getTitles_2013() {
return titles_2013;
}
Now, you can access the first title from the array by specifying its position in array, which is 0:
#{playersBean.titles_2013[0]}
This is equivalent in Java to getting or setting the value for titles_2013[0].
However, sometimes you need to iterate over the array instead of accessing a specific item. This can be easily accomplished with the c:forEach JSTL tag (http://www.oracle.com/technetwork/java/index-jsp-135995.html). The following code snippet iterates over the titles_2013 array and outputs each item (this is a pretty uncommon usage, so do not try it in production):
end=${fn:length(playersBean.titles_2013)-1}
var=i
>
#{playersBean.titles_2013[i]},
You can simplify it as shown in the following code:
#{playersBean.titles_2013}
>
#{title},
You can also use the
#{playersBean.titles_2013}
>
#{title},
This tag is detailed in Chapter 12, Facelets Templating, in the Iterating with
You can use the same approach for every List. For example, in the case of List, the expression #{playersBean.titles_2013[0]} is equivalent in Java to titles_2013.get(0) and titles_2013.set(0, some_value).
In the case of collections of type key-value (for example, Map), the EL expressions obtain items by key. For example, let's add a Map in PlayersBean that stores some match facts of a player. It can be defined as shown in the following code:
private Map
...
matchfacts.put(Aces
, 12
);
matchfacts.put(Double Faults
, 2
);
matchfacts.put(1st Serve
, 70%
);
...
public Map
return matchfacts;
}
Now, an EL expression that accesses the item with the key Aces can be written like the following line of code:
#{playersBean.matchfacts.Aces}
Note
Notice that this approach is not supported on arrays or lists. For example, #{playersBean.titles_2013.0} is not correct.
When the key is not an acceptable variable name (for example, Double Faults), you need to use brackets and quotes, as shown in the following code:
#{playersBean.matchfacts[Double Faults
]}
EL implicit objects
JSF provides several objects related to the current request and environment. EL exposes these objects (known as implicit objects) that can be accessed at runtime in a Facelet, servlets, or backing bean—these objects are accessible through value expressions and are managed by the container. For each expression, EL first checks if the value of the base is one of these implicit objects, and, if it is not, then it will check beans in progressively wider scopes (from request to view, and finally to application scope).
Note
In EL, the part of the expression before the dot or the square bracket is named base and it usually indicates where the bean instances should be located. The part after the first dot, or the square bracket, is called a property and is recursively cracked in smaller parts, which represents the bean's properties to get from the base.
You can see a short overview of these objects in the following table: