Introduction

The evolution of web development began with Servlet technology, which was used to directly generate HTML pages for displaying it on a web browser. Next, came JSP, which is a hybrid between an HTML Page and a Servlet. JSP pages enforced separation of the view and application logic. JSF or Java Server Faces is the current technology used for rapid development of web applications. It is designed to build MVC based web applications.
JSF is a component-based framework. The main components of JSF technology include:
An API for User Interface (UI) Components with a provision for:
Standard UI components include:
User input validation through standard and custom build validators:
  • Error Handling
  • Java Bean Management
  • Event Handling
  • Support for Internationalization

JSF in UI Framework

One common method of web application development is to use JSP and Servlets. These technologies do not provide Java Swing-like components to build dynamic Web applications. The developers often created their own customized mechanisms to store the state of web applications and also they had to code methods to implement event handling. Many Java developers wanted a mechanism that will allow them to perform the following:
JSF overcame these deficits and provided a standard set of APIs for satisfying the above-mentioned drawbacks. It provided the new standard that has a powerful mechanism to built interactive web applications. JSF offers pluggable functional components at various UI levels. JSF allows each of its pluggable components a special implementation such that they may provide a connection point between JSF and an external framework on which an earlier application might be based.
JSF Advantages
UI Component Model
The user interface of JavaServer Faces applications uses configurable, reusable elements of JavaServer Faces UI components. The UI Component Model of JSF comprises of UI component classes, rendering model, event model, data conversion model, and data validation model as shown in the figure below:
JSF User Interface Model
Figure 1: JSF User Interface Model

UI Component Classes

The UI Component classes in JSF are used as building blocks to create simple as well as complex user interface for web applications
JSF specification defines a set of standard UI component classes and behavioral interfaces. These classes and interfaces store the state information about the various JSF controls. Further, they enable maintain references to various objects and handling of events fired by these controls. These classes help the component to rendered in different ways and are derived from UIComponentBase class.
UICommand
The UICommand component represents command components such as buttons and links. These controls perform an action when activated which is achieved through an ActionEvent and ActionListener interface. The representation of a UICommand component can be <h:commandButton> or <h:commandLink>.
<h:commandButton> element represent command buttons such as submit or reset . The syntax for using a <h:commandButton> is shown below:
Syntax
  1. <h:commandButton [id=”<ID>”] [binding=”<ComponentBinding>”] [rendered=”<true|false>”]
  2. [immediate=”<true|false>”]
  3. [image=”<PathOfImage>”]
  4. [type=”<submit|reset>”]
  5. [value=”<Value>”] [actionListener=”<ActionListener>”]
  6. />
Where,
  • id: is the component identifier for the current component and it must be unique within the closest parent component.
  • binding: is the value expression for a backing bean property to which the component is bound to.
  • renedered: indicates if the component should be rendered or not during the Render Response phase. Its default value is true.
  • immediate: If this flag is set to true then the moment the component is activated, notifications should be delivered to the listeners and action taken during the same Apply Request Phase rather than in Invoke Application Phase.
  • image: is a path or URL of an image to be displayed for the action.
  • value: is the current value of the component.
  • type: is the type of button to be created. By default, a submit button is created.
  • actionListener: is the method expression that represents an action listener method to be notified on activation of the component.
UIPanel
This component is used as a layout container component for other components. The <h:panelGrid> is the element that represents a container table or <h:panelGroup>element creates a container to a group of components under one parent.
The syntax for <h:panelGrid> element is:
  1. <h:panelGrid [id=”<ID>”] [binding=”<ComponentBinding>”] [rendered=”<true|false>”] [columns=”<NumberOfColumns>”]
  2. [rowClasses=”<StyleSheet>”] [columnClasses=”<StyleSheet>” ]
  3. [headerClass=”<StyleSheet>”] [footerClass=”<StyleSheet>”]
  4. [captionClass=”<StyleSheet>”] [captionStyle=”<StyleSheet>”] />
Where:
  • id: is the component identifier for the current component and it must be unique within the closet parent component.
  • binding: is the value expression for a backing bean property to which the component is bound to.
  • renedered: indicates if the component should be rendered or not during the Render Response phase and its default value is true.
  • columns: represents number of columns to render.
  • rowClasses and columnClasses are comma separated list of CSS classes applied to the rows and columns of the table respectively.
  • headerClass, footerClass , captionClass : space separated list of CSS style classes applied to header, footer, caption respectively generated for the table.
  • CaptionStyle: is the CSS style applied when the caption is rendered.

Component Rendering Model

JSF provides component architecture so that the functionality is defined by one set of classes whereas component rendering is defined by another set of classes. The advantages of having such architecture are:
A rendered kit defines a set of rendered classes for every UI component. Each Rendered class specifies how the component can be rendered to the output.
Data Conversion Model
The data conversion model contains classes and interfaces that enable conversion of text data present in JSF pages to a primitive data type. Sometimes the programmer would like to convert the components data to a type other than the standard data type or the user might want to format the data. In such cases JSF allows the user to register a Converter implementation on UIOutput components, which allows converting the component’s data between two views.
The following code illustrates the use of a converter for a Celsius to Fahrenheit converter example. The converter will look up the value of temperature in degree and uses it to convert the degrees to Fahrenheit from the domain model unit.
The converter class called CelFahConverter implements the Converter interface.
The three things that have to be performed for creating and using customer converter are:
Create a custom converter class by implementing the Converter interface.
  1. public class celFahConverter implements Converter {
  2. public celFahConverter() {}
  3. public Object getAsObject(FacesContext facesContext, UIComponent uicomponent, String param) {
  4. try {
  5. String cel = param;
  6. float fah = Float.parseFloat(cel);
  7. Float aObject = new Float(fah);
  8. return sObject;
  9. } catch (Exception exception) {
  10. throw new ConverterException(exception);
  11. }
  12. }
  13. public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object obj) {
  14. try {
  15. float fahrenheit = (float)((Float) obj).floatValue();
  16. float fahrenheit1 = (fahrenheit * 9 / 5) + 32;
  17. String str_fah = ””+fahrenheit1;
  18. return str_fah;
  19. } catch (Exception exception) {
  20. Throw new ConverterException(exception);
  21. }
  22. }
Register the custom converter class with the application, as shown below:
  1. <faces-config>
  2. <converter>
  3. <converter-id>celFahConverter</converter-id>
  4. <conveter-class>celFahConverter
  5. </converter-class>
  6. </converter>
  7. </faces-config>
Use the custom converter in the JSP page from where it can be accessed using the <f:converter> tag, as shown in the code below:
  1. <%@page ContentType=”text/html”%><%@page pageEncoding=”UTF-8”%><%@ taglib url=”http://java.sun.com/jsf/html” prefix=”f” %><%@ taglib url=”http://java.sun.com/jsf/html” prefix=”h” %>
  2. <f:view>
  3. <html>
  4. <body>
  5. <h:form>
  6. <b>Please Enter the temperature in Celcius below:</b>
  7. <br>
  8. <h:inputText id=”input_text”>
  9. <f:converter converterId=”celFahConverter” />
  10. </h:inputText>
  11. <h:commandButton value=”Submit” />
  12. </h:form>
  13. </body>
  14. </html>
  15. </f:view>

Summary

JSF is a component-based framework designed to build MVC based web applications. JSF specification defines a set of standard UI components that are used as building blocks to create simple as well as complex User Interfaces for web applications. A rendered kit defines a set of rendered classes for every UI component. Each Rendered class specifies how the component can be rendered to the output. JSF allows the user to register a Converter implementation on UIOutput components, which allows converting the component’s data between two views.