Skip Headers
Oracle® Fusion Middleware Web User Interface Developer's Guide for Oracle Application Development Framework
11g Release 1 (11.1.1)

Part Number B31973-02
Go to Documentation Home
Home
Go to Book List
Book List
Go to Table of Contents
Contents
Go to Feedback page
Contact Us

Go to previous page
Previous
Go to next page
Next
View PDF

2 Getting Started with ADF Faces

This chapter describes how to use JDeveloper to declaratively create ADF Faces applications.

This chapter includes the following sections:

2.1 Developing Declaratively in JDeveloper

Using JDeveloper 11g with Oracle ADF and JSF provides a number of areas where page and managed bean code is generated for you declaratively, including creating EL expressions and automatic component binding. Additionally, there are a number of areas where XML metadata is generated for you declaratively, including metadata that controls navigation and configuration.

At a high level, the development process for an ADF Faces view usually involves the following:

Ongoing processes throughout the development cycle will probably include the following:

JDeveloper also includes debugging and testing capabilities. For more information, see the "Testing and Debugging ADF Components" chapter of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

2.2 Creating an Application Workspace

The first steps in building a new application are to assign it a name and to specify the directory where its source files will be saved. By creating an application using application templates provided by JDeveloper, you automatically get the organization of your workspace into projects, along with many of the configuration files required by the type of application you are creating.

2.2.1 How to Create an Application Workspace

You create an application workspace using the Create Application wizard.

To create an application:

  1. In the JDeveloper menu, choose File > New.

    The New Gallery opens, where you can select different application components to create.

  2. In the Categories tree, under the General node, select Applications. In the Items pane, select Java EE Web Application and click OK.

    This template provides the building blocks you need to create a web application that uses JSF for the view and Enterprise JavaBean (EJB) session beans and Java Persistence API (JPA) entities for business services. All the files and directories for the business layer of your application will be stored in a project that by default is named Model. All the files and directories for your view layer will be stored in a project that by default is named ViewController.

    Note:

    This document covers only how to create the ADF Faces project in an application, without regard to the business services used or the binding to those services. For information about how to use ADF Faces with the ADF Model layer, the ADF Controller, and ADF Business Components, see Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.
  3. In the Create Java EE Web Application dialog, set a name, location, and package prefix of your choice and click Next.

  4. In the Name your View and Controller project page, you can optionally change the name and location for your web project. On the Project Technologies tab, double-click ADF Faces to move that technology to the Selected pane. This automatically adds the necessary libraries and metadata files to your web project. Click Next.

  5. In the Configure Java settings page, optionally change the package name, Java source path, and output directory for your view layer. Click Next.

  6. In the Name your Model project page, you can optionally change the name and location for your Java project. By default, the necessary libraries and metadata files for Java EE are already added to your model project. Click Next.

  7. In the Configure Java settings for the project page, optionally change the package name, Java source path, and output directory for your model layer. Click Next.

  8. Configure the EJB settings as needed. For help on this page, click Help or press F1. Click Finish.

2.2.2 What Happens When You Create an Application Workspace

When you create an application workspace using the Java EE Web Application template, JDeveloper creates a project named Model that will contain all the source files related to the business services in your application. JDeveloper automatically adds the libraries needed for your EJB project. For example, if you kept the default EJB settings, JDeveloper adds the following libraries:

  • Toplink

  • Oracle XML Parser v2

  • EJB 3.0

  • AQIMS

JDeveloper also creates a project named ViewController that will contain all the source files for your ADF Faces view layer. JDeveloper automatically creates the JSF and ADF configuration files needed for the application. Additionally, JDeveloper adds the following libraries to your view project:

  • JSF 1.2

  • JSTL 1.2

  • JSP Runtime

The ADF Faces and other runtime libraries are added when you create a JSF page in your project.

Once the projects are created for you, you can rename them. Figure 2-1 shows the workspace for a new Java EE Web application.

Figure 2-1 New Workspace for an ADF Application.

JDeveloper workspace contains projects and files

JDeveloper also sets configuration parameters in the configuration files based on the options chosen when creating the application. In the web.xml file, these are configurations needed to run a JSF application (settings specific to ADF Faces are added when you create a JSF page with ADF Faces components). Example 2-1 shows the web.xml file generated by JDeveloper when you create a new Java EE application.

Example 2-1 Generated web.xml File

<?xml version = '1.0' encoding = 'windows-1252'?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"
         xmlns="http://java.sun.com/xml/ns/javaee">
  <description>Empty web.xml file for Web Application</description>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
  </servlet-mapping>
  <session-config>
    <session-timeout>35</session-timeout>
  </session-config>
  <mime-mapping>
    <extension>html</extension>
    <mime-type>text/html</mime-type>
  </mime-mapping>
  <mime-mapping>
    <extension>txt</extension>
    <mime-type>text/plain</mime-type>
  </mime-mapping>
</web-app>

In the faces-config.xml file, when you create a JSF page with ADF Faces components, JDeveloper creates an entry that defines the default render kit (used to display the components in an HTML client) for ADF Faces, as shown in Example 2-2.

Example 2-2 Generated faces-config.xml File

<?xml version="1.0" encoding="windows-1252"?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee">
  <application>
    <default-render-kit-id>oracle.adf.rich</default-render-kit-id>
  </application>
</faces-config>

An entry in the trinidad-config.xml file defines the default skin used by the user interface (UI) components in the application, as shown in Example 2-3.

Example 2-3 Generated trinidad-config.xml File

<?xml version="1.0" encoding="windows-1252"?>
<trinidad-config xmlns="http://myfaces.apache.org/trinidad/config">
  <skin-family>blafplus-rich</skin-family>
</trinidad-config>

Configuration required for specific ADF Faces features are covered in the respective sections of this guide. For example, any configuration needed in order to use the Change Persistence framework is covered in Chapter 28, "Persisting Component Changes". For comprehensive information about configuring an ADF Faces application, see Appendix A, "ADF Faces Configuration".

2.3 Defining Page Flows

Once you create your application workspace, often the next step is to design the flow of your UI. As with standard JSF applications, ADF Faces applications use navigation cases and rules to define the page flow. These definitions are stored in the faces-config.xml file. JDeveloper provides a diagrammer through which you can declaratively define your page flow using icons.

Figure 2-2 shows the navigation diagram created for a simple page flow that contains two pages: a DisplayCustomer page that shows data for a specific customer, and an EditCustomer page that allows a user to edit the customer information. There is one navigation rule that goes from the display page to the edit page and one navigation rule that returns to the display page from the edit page.

Figure 2-2 Navigation Diagram in JDeveloper

Setting navigation in JDeveloper

Note:

If you plan on using Oracle ADF Model data binding and the ADF Controller, then instead of using standard JSF navigation rules, you use task flows. For more information, see the "Getting Started With ADF Task Flows" chapter of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

Best Practice Tip:

The ADF Controller extends the JSF default controller. While you can technically use the JSF controller and the ADF Controller in your application, you should use only one or the other.

For more information on how navigation works in a JSF application, see the Java EE 5 tutorial on Sun's web site (http://java.sun.com).

2.3.1 How to Define a Page Flow

In JDeveloper, you use the navigation diagrammer to declaratively create a page flow. When you use the diagrammer, JDeveloper creates the XML metadata needed for navigation to work in your application in the faces-config.xml file.

To create a page flow:

  1. Open the faces-config.xml file for your application. By default, this is in the Web Content/WEB-INF node.

  2. Click the Diagram tab to open the navigation diagrammer.

  3. If the Component Palette is not displayed in JDeveloper, from the main menu choose View > Component Palette. By default, the Component Palette is displayed in the upper right-hand corner of JDeveloper.

  4. In the Component Palette, use the dropdown menu to choose JSF Diagram Objects.

    The components are contained in two accordion panels: Components and Diagram Annotations. Figure 2-3 shows the Component Palette displaying JSF navigation components.

    Figure 2-3 Component Palette in JDeveloper

    Component Palette contains navigation items
  5. Select the component you wish to use and drag it onto the diagram.

    JDeveloper redraws the diagram with the newly added component.

Tip:

You can also use the overview editor to create navigation rules and navigation cases by clicking the Overview tab. Press F1 for details on using the overview editor to create navigation.

Additionally, you can manually add elements to the faces-config.xml file by directly editing the page in the source editor. To view the file in the source editor, click the Source tab.

Once the navigation for your application is defined, you can create the pages and add the components that will execute the navigation. For more information about using navigation components on a page, see Chapter 17, "Working with Navigation Components".

2.3.2 What Happens When You Use the Diagrammer to Create a Page Flow

When you use the diagrammer to create a page flow, JDeveloper creates the associated XML entries in the faces-config.xml file. Example 2-4 shows the XML generated for the navigation rules displayed in Figure 2-2.

Example 2-4 Navigation Rules in faces-config.xml

<navigation-rule>
  <from-view-id>/DisplayCustomer</from-view-id>
  <navigation-case>
    <from-outcome>edit</from-outcome>
    <to-view-id>/EditCustomer</to-view-id>
  </navigation-case>
</navigation-rule>
<navigation-rule>
  <from-view-id>/EditCustomer</from-view-id>
    <navigation-case>
      <from-outcome>back</from-outcome>
      <to-view-id>/DisplayCustomer</to-view-id>
    </navigation-case>
</navigation-rule>

2.4 Creating a JSF Page

From the page flows you created during the planning stages, you can double-click the page icons to create the actual JSP files. Oracle recommends that when creating an ADF application, you create an XML-based JSP document (which uses the extension *.jspx) rather than a *.jsp file. Using an XML-based document:

ADF Faces allows you to create and use predefined page templates. When creating templates, the template developer can determine the layout of the page, provide static content that must appear on all pages, and create placeholder attributes that can be replaced with valid values for each page. For example, ADF Faces ships with the Oracle Three Column Layout template. This template provides areas for specific content, such as branding, a header, and copyright information, as shown in Figure 2-4.

Figure 2-4 Oracle Three Column Layout Template

Oracle Three Column Layout template

Whenever a template is changed, for example if the layout changes, any page that uses the template will also be automatically updated. For more information about creating and using templates, see Section 18.3, "Using Page Templates".

At the time you create a JSF page, you can choose to also create an associated backing bean for the page. Backing beans allow you to access the components on the page programmatically. For more information, see Section 2.4.3, "What You May Need to Know About Automatic Component Binding".

Best Practice Tip:

Create backing beans only for pages that contain components that must be accessed and manipulated programmatically. Use managed beans instead if you need to only provide additional functionality accessed through EL expressions on component attributes (such as listeners).

Once your page files are created, you can add UI components and work with the page source.

2.4.1 How to Create JSF Pages

You create JSF pages using the Create JSF Page dialog.

To create a JSF page:

  1. In the Application Navigator, right-click the directory where you would like the page to be saved, and choose New to open the New Gallery. In the Categories tree, under the Web Tier node, select JSF. In the Items panel, select JSF Page.

    OR

    From a navigation diagram, double-click a page icon for a page that has not yet been created.

  2. Complete the Create JSF Page dialog. For help, click Help in the dialog. For more information about the Page Implementation option, which can be used to automatically create a backing bean and associated bindings, see Section 2.4.3, "What You May Need to Know About Automatic Component Binding".

2.4.2 What Happens When You Create a JSF Page

When you use the Create JSF Page dialog to create a JSF page, JDeveloper creates the physical file and adds the code necessary to import the component libraries and display a page. The code created depends on whether or not you chose to create a .jspx document. Example 2-5 shows a .jspx page when it is first created by JDeveloper.

Example 2-5 Declarative Page Source Created by JDeveloper

<?xml version='1.0' encoding='windows-1252'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich">
  <jsp:directive.page contentType="text/html;charset=windows-1252"/>
  <f:view>
    <af:document>
      <af:form></af:form>
    </af:document>
  </f:view>
</jsp:root>

If you chose to automatically create a backing bean using the Page Implementation section of the dialog, JDeveloper also creates and registers a backing bean for the page, and binds any existing components to the bean. Example 2-6 shows the code created for a backing bean for a page.

Example 2-6 Declarative Backing Bean Source Created by JDeveloper

package view.backing;
 
import oracle.adf.view.rich.component.rich.RichDocument;
import oracle.adf.view.rich.component.rich.RichForm;
 
public class MyFile {
    private RichForm form1;
    private RichDocument document1;
 
    public void setForm1(RichForm form1) {
        this.form1 = form1;
    }
 
    public RichForm getForm1() {
        return form1;
    }
 
    public void setDocument1(RichDocument document1) {
        this.document1 = document1;
    }
 
    public RichDocument getDocument1() {
        return document1;
    }
}

Tip:

You can access the backing bean source from the JSF page by right-clicking the page in the editor, and choosing Go to and then selecting the bean from the list.

Additionally, JDeveloper adds the following libraries to the view project:

  • ADF Faces Runtime 11

  • ADF Common Runtime

  • DVT Faces Runtime

  • Oracle JEWT

  • Trinidad Runtime 11

When the page is first displayed in JDeveloper, it is displayed in the visual editor (accessed by clicking the Design tab), which allows you to view the page in a WYSIWYG environment. You can also view the source for the page in the source editor by clicking the Source tab. The Structure window located in the lower left-hand corner of JDeveloper, provides a hierarchical view of the page.

2.4.3 What You May Need to Know About Automatic Component Binding

Backing beans are managed beans that contain logic and properties for UI components on a JSP page (for more information about managed beans, see Section 2.6, "Creating and Using Managed Beans"). If when you create your JSF page you choose to automatically expose UI components by selecting one of the choices in the Page Implementation of the Create JSF Page dialog, JDeveloper automatically creates a backing bean (or uses a managed bean of your choice) for the page. For each component you add to the page, JDeveloper then inserts a bean property for that component, and uses the binding attribute to bind component instances to those properties, allowing the bean to accept and return component instances.

Specifically, JDeveloper does the following when you use automatic component binding:

  • Creates a Java bean using the same name as the JSP or JSPX file, and places it in the view.backing package (if you elect to have JDeveloper create a backing bean).

  • Creates a managed bean entry in the faces-config.xml file for the backing bean. By default, the managed bean name is backing_<page_name> and the bean uses the request scope.

    Note:

    JDeveloper does not create managed bean property entries in the faces-config.xml file. If you wish the bean to be instantiated with certain property values, you must perform this configuration in the faces-config.xml file manually. For more information, see Section A.3.1, "How to Configure for ADF Faces in faces-config.xml".
  • On the newly created or selected bean, adds a property and accessor methods for each component tag you place on the JSP. JDeveloper binds the component tag to that property using an EL expression as the value for its binding attribute.

  • Deletes properties and methods for any components deleted from the page.

Once the page is created and components added, you can then declaratively add method binding expressions to components that use them by double-clicking the component in the visual editor. Doing so launches an editor through which you can select the managed bean and method to which you want to bind the attribute. When automatic component binding is used on a JSF page and you double-click the component, skeleton methods to which the component may be bound are automatically created for you in the page's backing bean. For example, if you add a command button component and then double-click it in the visual editor, the Bind Action Property dialog displays the page's backing bean along with a new skeleton action method, as shown in Figure 2-5.

Figure 2-5 Bind Action Property Dialog in JDeveloper

Bind action property dialog to bind to method.

You can select from one these methods, or if you enter a new method name, JDeveloper automatically creates the new skeleton method in the page's backing bean. You must then add the logic to the method.

Note:

When automatic component binding is not used on a JSF page, you must select an existing managed bean or create a new backing bean to create the binding.

For example, suppose you created a JSF page with the file name myfile.jsp. If you chose to let JDeveloper automatically create a default backing bean, then JDeveloper creates the backing bean as view.backing.MyFile.java, and places it in the \src directory of the ViewController project. The backing bean is configured as a managed bean in the faces-config.xml file, and the default managed bean name is backing_myfile.

Example 2-7 shows the code on a JSF page that uses automatic component binding, and contains form, inputText, and commandButton components.

Example 2-7 JSF Page Code with Automatic Component Binding

<f:view>
  <af:document binding="#{backing_MyFile.document1}" id="document1">
    <af:form binding="#{backing_MyFile.form1}" id="form1">
      <af:inputText label="Label 1" binding="#{backing_MyFile.inputText1}"
                    id="inputText1"/>
      <af:commandButton text="commandButton 1"
                        binding="#{backing_MyFile.commandButton1}"
                        id="commandButton1"/>
    </af:form>
  </af:document>
</f:view>

Example 2-8 shows the corresponding code on the backing bean.

Example 2-8 Backing Bean Code Using Automatic Component Binding

package view.backing;
 
import oracle.adf.view.rich.component.rich.RichDocument;
import oracle.adf.view.rich.component.rich.RichForm;
import oracle.adf.view.rich.component.rich.input.RichInputText;
import oracle.adf.view.rich.component.rich.nav.RichCommandButton;
 
public class MyFile {
    private RichForm form1;
    private RichDocument document1;
    private RichInputText inputText1;
    private RichCommandButton commandButton1;
 
    public void setForm1(RichForm form1) {
        this.form1 = form1;
    }
 
    public RichForm getForm1() {
        return form1;
    }
 
    public void setDocument1(RichDocument document1) {
        this.document1 = document1;
    }
 
    public RichDocument getDocument1() {
        return document1;
    }
 
    public void setInputText1(RichInputText inputText1) {
        this.inputText1 = inputText1;
    }
 
    public RichInputText getInputText1() {
        return inputText1;
    }
 
    public void setCommandButton1(RichCommandButton commandButton1) {
        this.commandButton1 = commandButton1;
    }
 
    public RichCommandButton getCommandButton1() {
        return commandButton1;
    }
 
    public String commandButton1_action() {
        // Add event code here...
        return null;
    }
}

Example 2-9 shows the code added to the faces-config.xml file to register the page's backing bean as a managed bean.

Example 2-9 Registration for a Backing Bean

<managed-bean>
  <managed-bean-name>backing_MyFile</managed-bean-name>
  <managed-bean-class>view.backing.MyFile</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

In addition, when you edit a Java file that is a backing bean for a JSF page, a method binding toolbar appears in the Java Source Editor for you to bind appropriate methods quickly and easily to selected components in the page. When you select an event, JDeveloper creates the skeleton method for the event, as shown in Figure 2-6.

Figure 2-6 You Can Declaratively Create Skeleton Methods in the Java Source Editor

JDeveloper Source editor

Once you create a page, you can turn automatic component binding off or on, and you can also change the backing bean to a different Java class. Open the page in the visual Editor and from the JDeveloper menu, choose Design > Page Properties. Here you can select or deselect the Auto Bind option, and change the managed bean class. Click Help for more information about using the dialog.

Note:

If you turn automatic bind off, nothing changes in the binding attributes of existing bound components in the page. If you turn automatic bind on, all existing bound components and any new components that you insert are bound to the selected managed bean. If automatic bind is on and you change the managed bean selection, all existing bindings and new bindings are switched to the new bean.

You can always access the backing bean for a page from the page editor by right-clicking the page and choosing Go to and then choosing the bean from the list of beans associated with the page.

2.4.4 How to Add ADF Faces Components to JSF Pages

Once you have created a page, you can use the Component Palette to drag and drop components onto the page. JDeveloper then declaratively adds the necessary page code and sets certain values for component attributes.

Tip:

The chapters in Part III, "Using ADF Faces Components" provide information for adding and using specific ADF Faces components.

Note:

ADF Faces and MyFaces Trinidad components (or other AJAX-enabled library components) cannot be used on the same page. However, your application may contain a mix of pages built using either ADF Faces or other components.

To add ADF Faces components to a page:

  1. Open a JSF page in the visual editor.

  2. If the Component Palette is not displayed in JDeveloper, from the menu choose View > Component Palette. By default, the Component Palette is displayed in the upper right-hand corner of JDeveloper.

  3. In the Component Palette, use the dropdown menu to choose ADF Faces.

    The components are contained in three accordion panels: Common Components, Layout, and Operations. Figure 2-7 shows the Component Palette displaying the Common Components for ADF Faces.

    Figure 2-7 Component Palette in JDeveloper

    You can drop ADF Faces components from palette
  4. Select the component you wish to use and drag it onto the page.

    JDeveloper redraws the page in the visual editor with the newly added component. In the visual editor, you can directly select components on the page and use the resulting context menu to add more components. Figure 2-8 shows a page in the visual editor.

    Figure 2-8 Page Displayed in the Design Tab

    JSF page displayed in Design editor

Tip:

You can also drag and drop components from the palette into the Structure window or directly into the code in the source editor.

You can always add components by directly editing the page in the source editor. To view the page in the source editor, click the Source tab at the bottom of the page.

2.4.5 What Happens When You Add Components to a Page

When you drag and drop components from the Component Palette onto a JSF page, JDeveloper adds the corresponding code to the JSF page. This code includes the tag necessary to render the component, as well as values for some of the component attributes. Example 2-10 shows the code when you drop an Input Text and a Button component from the palette.

Example 2-10 JDeveloper Declaratively Adds Tags to a JSF Page

<af:inputText label="Label 1"/>
<af:commandButton text="commandButton 1"/>

Note:

If you chose to use automatic component binding, then JDeveloper also adds the binding attribute with its value bound to the corresponding property on the page's backing bean. For more information, see Section 2.4.3, "What You May Need to Know About Automatic Component Binding".

When you drop a component that contains mandatory child components (for example a table or a list), JDeveloper launches a wizard where you define the parent and also each of the child components. For example, Figure 2-9 shows the Table wizard used to create a table component and the table's child column components.

Figure 2-9 Table Wizard in JDeveloper

Table wizard used to create ADF Faces tables

Example 2-11 shows the code created when you use the wizard to create a table with three columns, each of which uses an outputText component to display data.

Example 2-11 Declarative Code for a Table Component

<af:table var="row">
  <af:column sortable="false" headerText="col1">
    <af:outputText value="#{row.col1}"/>
  </af:column>
  <af:column sortable="false" headerText="col2">
    <af:outputText value="#{row.col2}"/>
  </af:column>
  <af:column sortable="false" headerText="col3">
    <af:outputText value="#{row.col3}"/>
  </af:column>
</af:table>

2.4.6 How to Set Component Attributes

Once you drop components onto a page you can use the Property Inspector (displayed by default at the bottom right of JDeveloper) to set attribute values for each component.

Tip:

If the Property Inspector is not displayed, choose View > Property Inspector from the main menu.

Figure 2-10 shows the Property Inspector displaying the attributes for an inputText component.

Figure 2-10 JDeveloper Property Inspector

You can set property values in the Property Inspector

The Property Inspector has sections that group similar properties together. For example, the Property Inspector groups commonly used attributes for the inputText component in the Common section, while properties that affect how the component behaves are grouped together in the Behavior section. Figure 2-11 shows the Behavior section of the Property Inspector for an inputText component.

Figure 2-11 Behavior Section of the Property Inspector

Properties that affect component behavior

To set component attributes:

  1. Select the component, either in the visual editor, the Structure window, or by selecting the tag directly in the source editor.

  2. In the Property Inspector, expand the section that contains the attribute you wish to set.

    Tip:

    Some attributes are displayed in more than one section. Entering or changing the value in one section will also change it in any other sections. You can search for an attribute by entering the attribute name in the search field at the top of the inspector.
  3. Either enter values directly into the fields, or if the field contains a dropdown list, use that list to select a value. You can also use the dropdown menu to the right of the field to use tools to set the value. These tools are either specific property editors (opened by choosing Edit from the menu) or the Expression Builder, which you can use to create EL expressions for the value (opened by choosing Expression Builder). For more information about using the Expression Builder, see Section 2.5, "Creating EL Expressions".

2.4.7 What Happens When You Use the Property Inspector

When you use the Property Inspector to set or change attribute values, JDeveloper automatically changes the page source for the attribute to match the entered value.

Tip:

You can always change attribute values by directly editing the page in the source editor. To view the page in the source editor, click the Source tab at the bottom of the page.

2.5 Creating EL Expressions

You use EL expressions throughout an ADF Faces application to bind attributes to object values determined at runtime. Example expressions look like #{UserList.selectedUsers} to reference a set of selected users, #{user.name} to reference a particular user's name, or #{user.role == 'manager'} to evaluate whether a user is a manager or not. At runtime, a generic expression evaluator returns the List, String, and boolean values of these respective expressions, automating access to the individual objects and their properties without requiring code.

At runtime, the value of certain JSF UI components (such as an inputText component or a outputText component) is determined by its value attribute. While a component can have static text as its value, typically the value attribute will contain an EL expression that the runtime infrastructure evaluates to determine what data to display. For example, an outputText component that displays the name of the currently logged-in user might have its value attribute set to the expression #{UserInfo.name}. Since any attribute of a component (and not just the value attribute) can be assigned a value using an EL expression, it's easy to build dynamic, data-driven user interfaces. For example, you could hide a component when a set of objects you need to display is empty by using a boolean-valued expression like #{not empty UserList.selectedUsers} in the UI component's rendered attribute. If the list of selected users in the object named UserList is empty, the rendered attribute evaluates to false and the component disappears from the page.

In a typical JSF application, you would create objects like the UserList as a managed bean. The JSF runtime manages instantiating these beans on demand when any EL expression references them for the first time. When displaying a value, the runtime evaluates the EL expression and pulls the value from the managed bean to populate the component with data when the page is displayed. If the user updates data in the UI component, the JSF runtime pushes the value back into the corresponding managed bean based on the same EL expression. For more information about creating an using managed beans, see Section 2.6, "Creating and Using Managed Beans". For more information about EL expressions, see the Java EE 5 tutorial at http://java.sun.com.

2.5.1 How to Create an EL Expression

You can create EL expressions declaratively using the JDeveloper Expression Builder. You can access the builder from the Property Inspector.

To use the Expression Builder:

  1. In the Property Inspector, locate the attribute you wish to modify and use the right-most dropdown menu to choose Expression Builder.

  2. Create expressions using the following features:

    • Use the Variables tree to select items that you want to include in the expression. The tree contains a hierarchical representation of the binding objects. Each icon in the tree represents various types of binding objects that you can use in an expression.

      To narrow down the tree, you can either use the dropdown filter or enter search criteria in the search field. The EL accessible objects exposed by ADF Faces are located under the adfFacesContext node, which is under the JSF Managed Bean node, as shown in Figure 2-12.

      Figure 2-12 adfFacesContext Objects in the Expression Builder

      adfFacesContext properties

      Tip:

      Refer to the ADF Faces Javadoc for more information about these objects.

      Selecting an item in the tree causes it to be moved to the Expression box within an EL expression.

    • You can also type the expression directly in the Expression box. JDeveloper provides Code Insight in the Expression Builder. To invoke Code Insight, type the leading characters of an EL expression (for example, #{ ) or a period separator. Code Insight displays a list of valid items for each segment of the expression.

    • Use the operator buttons to add logical or mathematical operators to the expression.

    Figure 2-13 shows the Expression Builder dialog being used to create an expression that binds to the value of a label for a component to the label property of the explorer managed bean.

    Figure 2-13 The Expression Builder Dialog

    Expression Builder Dialog

2.5.2 How to Use EL Expressions Within Managed Beans

While JDeveloper creates many needed EL expressions for you, and you can use the Expression Builder to create those not built for you, there may be times when you need to access, set, or invoke EL expressions within a managed bean.

Example 2-12 shows how you can get a reference to an EL expression and return (or create) the matching object.

Example 2-12 Resolving an EL Expression from a Managed Bean

public static Object resolveExpression(String expression) {
  FacesContext facesContext = getFacesContext();
  Application app = facesContext.getApplication();
  ExpressionFactory elFactory = app.getExpressionFactory();
  ELContext elContext = facesContext.getELContext();
  ValueExpression valueExp = 
     elFactory.createValueExpression(elContext, expression, 
                                            Object.class);
     return valueExp.getValue(elContext);
 }

Example 2-13 shows how you can resolve a method expression.

Example 2-13 Resolving a Method Expression from a Managed Bean

public static Object resloveMethodExpression(String expression, 
                                             Class returnType, 
                                             Class[] argTypes, 
                                             Object[] argValues) {
  FacesContext facesContext = getFacesContext();
  Application app = facesContext.getApplication();
  ExpressionFactory elFactory = app.getExpressionFactory();
  ELContext elContext = facesContext.getELContext();
  MethodExpression methodExpression = 
            elFactory.createMethodExpression(elContext, expression, returnType, 
                                             argTypes);
    return methodExpression.invoke(elContext, argValues);
  }

Example 2-14 shows how you can set a new object on managed bean.

Example 2-14 Setting a New Object on a Managed Bean

public static void      (String expression, Object newValue) {
  FacesContext facesContext = getFacesContext();
  Application app = facesContext.getApplication();
  ExpressionFactory elFactory = app.getExpressionFactory();
  ELContext elContext = facesContext.getELContext();
  ValueExpression valueExp = 
     elFactory.createValueExpression(elContext, expression, 
                                     Object.class);

  //Check that the input newValue can be cast to the property type
  //expected by the managed bean.
  //Rely on Auto-Unboxing if the managed Bean expects a primitive
  Class bindClass = valueExp.getType(elContext);
 if (bindClass.isPrimitive() || bindClass.isInstance(newValue)) {
      valueExp.setValue(elContext, newValue);
  }
}

2.6 Creating and Using Managed Beans

Managed beans are Java classes that you register with the application using various configuration files. When the JSF application starts up, it parses these configuration files and the beans are made available and can be referenced in an EL expression, allowing access to the beans' properties and methods. Whenever a managed bean is referenced for the first time and it does not already exist, the Managed Bean Creation Facility instantiates the bean by calling the default constructor method on the bean. If any properties are also declared, they are populated with the declared default values.

Often, managed beans handle events or some manipulation of data that is best handled at the front end rather than placing the logic in the business layer. For a more complete description of how managed beans are used in a standard JSF application, see the Java EE 5 tutorial on Sun's web site (http://java.sun.com).

Best Practice Tip:

Use managed beans to store only bookkeeping information. All application data and processing should be handled by logic in the business layer of the application.

In a standard JSF application, managed beans are registered in the faces-config.xml configuration file.

Note:

If you plan on using Oracle ADF Model data binding and the ADF Controller, then instead of registering managed beans in the faces-config.xml file, you may need to register them within ADF task flows. For more information, refer to the "Using a Managed Bean in a Fusion Web Application" section of the Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework.

2.6.1 How to Create a Managed Bean in JDeveloper

You can create a managed bean and register it with the JSF application at the same time using the overview editor for the faces-config.xml file.

To create and register a managed bean:

  1. In the Application Navigator, open the faces-config.xml file.

  2. At the bottom of the window, click the Overview tab.

  3. Click the Managed Beans tab. Figure 2-14 shows the editor for the faces-config.xml file used by the ADF Faces demo that contains the File Explorer application.

    Figure 2-14 Managed Beans in the faces-config.xml File

    The JSF Configuration Editor shows all the managed beans
  4. Click the New icon to add a row to the Managed Bean table.

  5. In the Create Managed Bean dialog, enter values. Click Help for more information about using the dialog. Select the Generate Class If It Does Not Exist option if you want JDeveloper to create the class file for you.

  6. You can optionally add managed properties for the bean. When the bean is instantiated, any managed properties will be set with the provided value. With the bean selected in the Managed Bean table, click the New icon to add a row to the Managed Properties table. In the Property Inspector, enter a property name (other fields are optional).

    Note:

    While you can declare managed properties using this editor, the corresponding code is not generated on the Java class. You must add that code by creating private member fields of the appropriate type, and then by choosing the Generate Accessors... menu item on the context menu of the code editor to generate the corresponding get and set methods for these bean properties.

2.6.2 What Happens When You Use JDeveloper to Create a Managed Bean

When you create a managed bean and elect to generate the Java file, JDeveloper creates a stub class with the given name and a default constructor. Example 2-15 shows the code added to the MyBean class stored in the view package.

Example 2-15 Generated Code for a Managed Bean

package view;
 
public class MyBean {
    public MyBean() {
    }
}

You now must add the logic required by your page. You can then refer to that logic using an EL expression that refers to the managed-bean-name given to the managed bean. For example, to access the myInfo property on the my_bean managed bean, the EL expression would be:

#{my_bean.myInfo}

JDeveloper also adds a managed-bean element to the faces-config.xml file. Example 2-16 shows the managed-bean element created for the MyBean class.

Example 2-16 Managed Bean Configuration on the faces-config.xml File

<managed-bean>
  <managed-bean-name>my_bean</managed-bean-name>
  <managed-bean-class>view.MyBean</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

2.7 Viewing ADF Faces Source Code and Javadoc

You can view the ADF Faces class interfaces and Javadoc directly from JDeveloper.

To view a class or the Javadoc for a class:

  1. From the JDeveloper menu, choose Navigate > Go to Java Class.

  2. In the Go to Java Class dialog, enter the class name you want to view. If you don't know the exact name, you can either begin to type the name and JDeveloper will provide a list of classes that match the name, or you can click Browse to browse for the class. ADF Faces components are in the oracle.adf.view.rich package.

  3. To view the interface, select the Source option. To view the Javadoc, select the Javadoc option.