This tutorial shows you how to build a rich Internet application that interacts with a database. You'll be using Oracle JDeveloper 11g and the ADF framework to build the application, and in the process you'll work with Oracle ADF Business Components, Oracle ADF Faces Rich Client Components and Oracle ADF Task Flows.
Approximately 2 hours
The tutorial covers the following topics:
Place
the cursor over this icon to load and view all the screenshots for this tutorial.
(Caution: This action loads all screenshots simultaneously, so response time
may be slow depending on your Internet connection.)
Note: Alternatively, you can place the cursor over an individual icon in the following steps to load and view only the screenshot associated with that step. You can hide an individual screenshot by clicking it.
This tutorial takes you through a simple scenario of building a rich internet application that provides a user interface to access database tables. You'll be using Oracle JDeveloper 11g and Oracle ADF 11g to create a complete application including business services, user interface and page flows.
The focus of this tutorial is to illustrate the visual and declarative approach that Oracle ADF provides for Java EE application development. While working through the tutorial notice how ADF saves you from writing low level and speeds up your development process.
The application that you create in this tutorial displays information on department and employees. You will create several JSF pages that enable you to query and update the data in the database.
| 1. | This tutorial uses the sample HR schema that comes with the recent versions of the Oracle database.
|
| 2. | Type the following command in the SQL> prompt
|
| 3. | Start JDeveloper using the shortcut your installation provided.
If you are prompted to migrate from an older version
choose No. |
When you work in JDeveloper, you organize your work in projects within an application. JDeveloper provides several templates that you can use to create an Application and projects. The templates are preconfigured with a basic set of technologies that are needed for developing various types of applications, and you create your working environment by selecting the template that fits your needs. You can then configure it to add any other technologies you plan to use.
In the first section you are going to create a new Application
using the Fusion technology and build reusable business components that will
access the database.
You'll be using the Oracle ADF Business Components technology to map Java objects
to existing tables in your database.
1. |
In the Applications Navigator, click New Application. Another option is to use the File->New... menu option to create a new application.
|
2. |
In the Create Application dialog box, specify the Application Name to be HRSystem. Notice that the directory changes to match the new name. You can change the C:\JDeveloper\mywork part of the path if you rather your files will be created in another location. In the Application Package Prefix field set the value to be demo. In the Application Templates choose the Fusion Web Application (ADF) and click Finish.
|
| 3. | In the Application Navigator you'll see two new projects now, one called Model and the other called ViewController. Click the Model project and then right click and choose New... you can also click Ctrl+N.
|
| 4. | In the New Gallery dialog locate the Business Tier node and click the ADF Business Components sub node.
|
| 5. | In the Initialize Business Components Project dialog you'll define
a new connection to your database. Click the Green +
|
||||||
| 6. | specify the following properties for the new connection you are creating
If you are not connecting to a local Oracle XE database you'll need to also change the Oracle JDBC Settings properly to point to the right server, port and SID for your database. Click the Test Connection button and verify that you got success. Once done click the OK button.
|
||||||
| 7. | Click the OK again to dismiss the Initialize Business Components Project dialog.
|
||||||
| 8. | In the Entity Objects page, click the Query button to examine the data dictionary to see available tables.
|
||||||
| 9. | Select the DEPARTMENTS and EMPLOYEES tables in the Available list, and click the right arrow to move your selections to the Selected list. This step creates updateable Entity Objects based on the tables you chose. Click Next to continue.
|
||||||
| 10. | In the Updateable View Objects dialog, move Departments1 (HR.DEPARTMENTS) and Employees1 (HR.EMPLOYEES) to the Selected list. This step creates matching view objects to perform queries on the entity object you created before. Click Next to continue.
|
||||||
| 11. | In the Read Only View Objects dialog, click the Query button and then move JOBS to the Selected list. This step creates a read only view object that queries the Jobs table. Click Next to continue.
|
||||||
| 12. | In the Application Module dialog, click Finish to create the business components in the Model project.
|
||||||
| 13. | In the Application Navigator Right-click AppModel and select Run to invoke the application module tester. This is a small Swing based application that allows you to test the ADF Business Components you have just created.
|
||||||
| 14. | In the Oracle Business Component Browser window, double click the EmpDeptFkLink1 node to show the department and employees details. Navigate between the records using the blue arrow buttons and watch the automatic master details synchronization.
|
||||||
| 15. | Click the Specify View Criteria (binocular icon) button
|
||||||
| 16. | The form would now only show departments from this location.
Click around the Oracle Business Component Browser to see other data and functionality offered for you.
|
||||||
| 17. | Close the Oracle Business Component Browser window, and back in JDeveloper,
click the Save All |
In this topic you refine your business services by adding validation rules, formatting and default values.
To add validation rules, perform the following steps:
| 1. | In the Application Navigator locate the Employees1 entity object and double click it to open it for editing.
|
| 2. | In the Employees1.xml window, click the Attributes
node and locate the Salary attribute, and click it. Scroll down
in the page to the validation section and click the Add icon
|
| 3. | In the Add Validation Rule dialog choose Range from the Rule Type drop down list. Note the various other types of rules you can define here. In the Operator drop down keep the Between value, and type 0 for the minimum value and 99000 for the maximum value fields.
|
| 4. | Click the Failure Handling tab to define an error message that will appear when the validation fails. In the Message Text field type an error message like "Salary out of range 0 to 99,000", and click the OK button.
|
| 5. | Next we'll add a default value to the hired date field - so when
we create a new employee we'll have today's date as the default value. In the Value section locate the Default Value Type property and choose Expression, then set the Default Value property to adf.currentDate. This will make sure the default value for a new record is set to today's date.
|
| 6. | You can also specify UI Hints for attribute to control how they
will display by default in the forms and pages that will use them. In
our case we'll add a default format mask for the Hired date field you
can also specify labels and tooltip helps here.
Locate the Format property and type MM/dd/yyyy - note that upper-case lower case usage matters here.
|
| 7. | You can now run the Application Module Tester again (right click
Run on the AppModule) to check the new validation,
default value for new record and UI hint you added. You can also create
a new record by pressing the insert record button Click the Save All
|
JavaServer Faces or JSF for short is a standard Java EE
technology that simplifies Web development.
In this section you create a JSF page to access the business components that
you created in the previous section. You learn how to create a form that can
be used to displays and modify data. You'll also use a master-detail relationship
to display the information about employees in each department. To build the
page you'll be using the Oracle ADF Faces Rich Client Components - these components
allow you to build Ajax-based rich Web UI without writing low level HTML and
Javascript code.
The Web part of the application is developed in a separate project called the
viewcontroller project. This separation between the Model layer and the user
interface makes the business services more reusable.
| 1. | We'll start by creating a new Web page. Right-click the ViewController project node in the Application Navigator, and select New....
|
| 2. | In the New Gallery window, navigate to the Web Tier and JSF node, and choose the JSF Page option. Click the OK button.
|
| 3. | In the Create JSF Page dialog box, rename the page to DeptEmpPage.jspx,
in the Page Template drop down box select Oracle Three Column
Layout, and make sure the Create as XML Document
is checked.
|
| 4. | Your page will be opened in the visual design view. The template
has three columns in it, since we only need two in our page, we'll
delete the third one.
|
| 5. | Now we are going to add some layout components to our page.
|
| 6. | Click the ShowDetails1 accordion that was created and in the Property Inspector change its Text property to Departments.
|
| 7. | Right click the new Departments accordion and choose Insert After Show Details Item - Departments -> Show Detail Item. This adds one more accordion to your page.
Change its Text property to More Info.
|
| 8. | From the Layout components, click and drag a Panel Splitter component into the Center area of your page.
|
| 9. | In the Property Inspector change the Orientation property of the new splitter to be Vertical.
|
| 10. | From the Layout components, click and drag a Panel Collection component into the first area at the top of your splitter on your page.
|
| 11. | From the Layout components, click and drag a Panel Tab component into the second area at the bottom of your splitter on your page.
|
| 12. | Your page should look like the image below. Click the Save
All |
| 1. | In the Application Navigator expand the Data Controls accordion, and in it expand the AppModuleDataControl to expose the business services you defined in the first part of this lab.
|
| 2. | Drag the Departments1View1 data control into
the Departments accordion in your JSF page.
|
| 3. | In the Edit Form fields dialog, check the Include Navigation Controls check box and click the OK button. Click OK.
|
| 4. | In the Data Controls accordion expand the Departments1View1
control to expose the fields it contains as well as the related Employees1View3
control for the employees in each department.
|
| 5. | Drag the Employees1View3 data control into the
Panel Collection on the top right side of your JSF
page.
|
| 6. | In the Edit Table Columns dialog, check the three check boxes for Row Selection, Sorting and Filtering. and click the OK button.
|
| 7. | Drag the Employees1View3 data control again but
this time into the Tab on the bottom right side of
your JSF page.
|
| 8. | In the Edit Form Fields dialog, check the check boxes for Include Submit Button. Using your mouse and the Shift button select the bottom three fields from the list CommissionPCT, ManagerId, DepartmentID and delete them by pressing the Red X button at the top right. Then click the OK button.
|
| 9. | Your JSP should look like this:
|
| 10. | Click the Save All
|
| 10. | Once your page appears in your browser, using the splitter
resize the page area to display the data of the department. Then use
the Next button to scroll through the departments.
|
| 11. | Try to update the HireDate field for one of the employees with an invalid date such as 11/11/123 and notice the error message when you try to leave the field.
Use the Clock Icon next to the field to bring up a pop-up Calendar and choose a valid date.
|
| 12. | Update the Salary field to a value that will break the validation you created before such as -9 and click the Submit button to get the error message you created.
|
| 13. | Browse to department 50 and notice that you can
now scroll the data in the employees table.
|
| 14. | Click a column heading in the table and drag it to reposition the column in the table.
The new column order looks like the following:
|
| 15. | In the Filter field above the First Name column type B% and hit Enter to filter the table to show only employees whose name begins with B.
|
| 16. | Play with the other menu and buttons of the table to see additional functionality. Once you are done, close the browser and return to JDeveloper.
|
| 17. | Next we'll change the table of employees on our page to add the
ability to do column selection. Back in JDeveloper select the Employees
Table in the JSF page design editor (click the empty space
below the lines) or in the structure pane.
|
| 18. | Next we'll add a graph representation of the data to our page -
this is done using the ADF Data Visualization set of JSF components.
|
| 19. | In the Component Gallery Dialog choose pie from the list of graphs on the left and pie again as a sub type. Then click the OK button.
|
| 20. | In the Create Pie Graph dialog choose Salary for
the pie list and LastName for the slices.
|
| 21. | Click the Save All This time note the additional behaviors for your table that are available once you choose a column - such as freeze and Wrap. Expand the More Info accordion and note the graph and the pop-up it displays when you hover over it with your mouse. When done, close the browser and return to JDeveloper. |
In this section we'll add a new Business Service to our application
that will display a subset of the fields from the Employees table, along with
the department name from the Departments table. We'll also add calculated fields.
Oracle ADF Business Components allows you to create such complex updateable
components in a declarative way.
| 1. | In the Application Navigator right click the demo.model package and choose New View Object.
|
||||||||||
| 2. | In the Name dialog update the Name field to be EmpDetails and keep the default type of Updateable Access Through Entity Objects.
Click the Next button.
|
||||||||||
| 3. | In the Entity Objects dialog first select Employees1
and shuttle it to the right, and then select the Departments1
entity and add it to the right hand selection. Click Next.
|
||||||||||
| 4. | In the Attributes dialog shuttle the following fields to the right:
At this stage you can click the Finish button to complete the view object creation.
|
||||||||||
| 5. | Next we are going to see how to add a calculated attribute to
our object - we'll add an attribute that will show the yearly salary.
|
||||||||||
| 6. | In the New View Object Attribute dialog update the following fields:
|
||||||||||
| 7. | In the next couple of steps we'll show how to add a list of values
to a field based on a set of values stored in another table.
|
||||||||||
| 8. | In the View Accessors dialog shuttle the JobViews1 to the right. Click the OK button.
|
||||||||||
| 9. | In the EmpDetails.xml editor switch to the Attributes
section, select the JobId attribute and in the List
Of Values section click the Green +
|
||||||||||
| 10. | In the List of Values dialog select JobsView1_1 for the List Data Source field, and JobId as the List Attribute.
|
||||||||||
| 11. | Still in the List of Values dialog Click the UI Hints tab and choose Input Text with List of Values as the Default List Type and then shuttle the Job Title attribute to the right. Click the OK button.
|
||||||||||
| 12. | Now we need to add the new object that we created to the data
model we exposed to the user interface developers.
|
||||||||||
| 13. | Click the EmpDetails view object and shuttle it to the right.
|
||||||||||
| 14. | In the Application Navigator Right-click AppModule and select Run to invoke the application module tester. This is a small Swing based application that allows you to test the ADF Business Components you have just created.
|
||||||||||
| 15. | Double click the EmpDetails view object to test the functionality you defined.
|
||||||||||
| 16. | Try setting the Salary to -3 and note the error message once you leave the field. Note the date format for HireDate and the fact that the department name and the yearly salary are displayed. Now invoke the list of values for the JobId to choose a new job.
|
||||||||||
| 17. | Close the Business Components Tester window without committing
the changes and back in JDeveloper, click the Save All |
Web applications usually have more than one page in them. In the next section you are going to add another page to your application and use the ADF Task Flow to define the navigation rules between the two pages.
To add a page flow and navigate between pages, perform the following steps:
| 1. | In the Application Navigator under the ViewController project locate the file adf-config under the page flows node. Double click it to open it in the editor. This is where we'll be defining navigation in our application.
|
| 2. | Drag and drop the DeptEmpPage.jspx file from the application navigator into the empty adf-config diagram.
|
| 3. | From the Component Palette drag and drop a View component into the adf-config diagram, and rename it to query. This is going to be a new JSF page that we'll create in a minute.
|
| 4. | From the Component Palette choose a Control Flow Case
and then click on the DeptEmpPage and drag a line
to the query page.
Name this line goQuery.
|
| 5. | From the Component Palette choose another Control Flow
Case and then create an opposite flow from the query
page to the DeptEmpPage.
|
| 6. | Double click the query view in the diagram to create the new page. Using the Page Template option, select the Oracle Three Column Layout one in the Create JSF page dialog. Click OK.
|
| 7. | Expand the Data Controls accordion in the Application Navigator.
Locate the EmpDetails1 data control expand it and
expand the Named Criteria node under it. Select the
All Queriable Attributes and drag it into the center
area of the new query.jspx page. (If the EmpDetails1 doesn't show up in the data control palette - right click inside the data control palette and choose the refresh option.)
|
| 8. | In the Data Controls accordion select the EmpDetails1
data control and drag it into the center area of the page below the
query component.
In the Edit Forms Details, check both the Include Navigation Controls and the Include Submit Button, then click OK.
|
| 9. | In the structure pane locate the Submit button, right click it and choose Insert after af:command:Button - Submit -> Button.
Using the property inspector change the Text of the new button to be Back and for the Action property select back from the drop down list. (If there is no list available in the action property - code the value back). This will cause the button to perform the navigation you defined in the page flow.
|
| 10. | Next we'll add transaction operations to the page to allow you to commit and rollback changes. In the Data Controls Palette expand the application module level Operations node to locate the commit and rollback operations. Drag the Commit operation into the structure pane before the First Button. When prompted for a drop target choose Operations->ADF Button
|
| 11. | Repeat the same steps for the Rollback operation.
|
| 12. | If you'll maximize the design editor at this stage by double clicking the Query.jspx tab, your page should look like this:
|
| 13. | Switch back to editing the DeptEmpPage.jspx by
clicking on its tab or opening the file from the Application Navigator.
|
| 14. | From the Component Palette, choose a Button component and drag it into the Departments accordion between the First and Previous buttons. Alternatively you can right click the First button and choose insert after->button to add the new button.
Using the property inspector change the Text of the button to be Query and for the Action property select goQuery from the drop down list. This will cause the button to perform the navigation you defined in the page flow.
|
| 15. | Click the Save All
|
| 16. | When the page appears in your browser click the Query button to navigate to your new page.
|
| 17. | In the new Query page, click the magnifying glass next to the JobID field to bring up a search form.
|
| 18. | Search for Jobs whose jobTitle begins with A%.
Choose the Accountant title
and click OK.
|
| 19. | You can continue playing with the form saving
your query criteria, creating more complex queries and updating data
for employees. Note how this form displays a view of the data that
matches the definition in the view object you created - including
information for Department name as well as a list of values for the
Job id.
Close your browser window. |
In the next section we'll enhance our pages with additional Ajax functionality leveraging the declarative development offered by the ADF Faces components.
| Using Partial Page Refresh | ||
| Using Drop Down Menus and Operation Components | ||
First we'll add an automatic update of the yearlySalary field based on changes
in the Salary field. Since we don't want to refresh the whole page, we'll use
the partial page refresh capability offered by ADF Faces
To do this we'll define the Salary field to autosubmit, and the yearlySalary
field to depend on the Salary field.
| 1. | Open the query.jspx file in the design editor and locate the Salary field and click it. In the property inspector window set the value of the id property to sal.
|
| 2. | Still in the Property Inspector under the Behavior section set the AutoSubmit property to True .
|
| 3. | Using the Structure Panel locate the YearlySalary.
Another option to get to this field is to double click the query.jspx
tab to maximize the window and then locate the field in the design
editor.
|
| 4. | In the Edit Property dialog locate the Salary field and shuttle it to the right using the blue arrow. Click the OK button.
|
| 5. | Click the Save All When the page comes up use the query section to locate employees whose name begin with A%, then update the Salary field for one of them.
Notice the immediate change in the YearlySalary field once you leave the Salary field.
Close your browser window. |
In this section we'll add a drop down menu to a page and use a couple of ADF Faces operation components to add Javascript based operations to our page that will export table data into an Excel spreadsheet and to a printable page.
| 1. | Open the DeptEmpPage.jspx file in the design editor and click inside the menus place holder space in the panel collection surrounding the Employees table. Right click to bring up the context menu and choose Insert Inside Facet - menus and then Menu.
|
| 2. | In the Property Inspector set the Text property to My Options.
|
| 3. | In the Property Inspector under the Behavior section set the Detachable property to true.
|
| 4. | Using the Structure Pane right click the menu component and choose
Insert inside af:menu - My Options and then Menu
Item.
Using the property inspector set the Text property of the new menu item to Export to Excel.
|
| 5. | With the new Export to Excel menu item still selected in the structure
pane, expand the Operations section of the the ADF
Faces components in the component Palette.
|
| 6. | In the dialog that pops up click the down arrow next to ExportedId field and choose Edit.
|
| 7. | In the Edit Property dialog navigate the page's structure to locate the table in the PanelCollection and click it. Click OK.
|
| 8. | From the Type drop down list select excelHTML.
Click the OK button.
|
| 9. | Let's add another menu option to our menu. In the structure pane right click the Export to Excel menu component and from the context menu choose Insert After af:commandMenuItem - Export to Excel and then Menu Item.
|
| 10. | Set the Text property of this new menu option to Printable Page.
|
| 11. | From the Operations section of the component palette click the Show
Printable Page Behavior to add it to your new menu item. You
can also drag and drop it onto the new menu option you created.
|
| 12. | Click the Save All
|
| 13. | When the page comes up bring up your menu and detach it.
|
| 14. | Then invoke each one of the menu options you created. For example Export to Excel. You need to accept the download of the file in the browser window to be able to access the Excel file.
|
| 15. | Try the Printable Page option.
The page is ready for printing.
|
| Close the browser window. |
In the next two sections we'll create a reusable page fragment that will allow us to search for employees by their email. We'll then use this page fragment inside another JSF page.
| Query Only Business Service Based on Parameters | ||
| Reusable Task Flows, Page Fragments and Regions | ||
Query Only Business Service Based on Parameters
First we'll create a new ADF Business Components View Object to provide us with the right query based on a parameter.
| 1. | In the Application Navigator locate the demo.model package and right click on it to choose New View Object....
|
| 2. | In the Create View Object dialog set the Name property to EmpByEmail and for view type choose the Read Only Access through SQL Query radio button. Click Next.
|
| 3. | In step 2 of the Create View Object dialog type the following query
Click the Test button to verify your query and then click Next.
|
| 4. | In step 3 of the Create View Object dialog, Click the New
button to define a new bind variable.
In the Control Hints tab set the Label Text to Email.
|
| 5. | Click Next a few more times to accept all the defaults,
until you get to step 8 of the dialog.
|
| 6. | You can now run the Application Module Tester, when you'll double click the new EmpsByEmail1 view you'll be prompted to insert a value for the parameter. You can insert SKING press OK and get the results for this email address.
To try another value click the blue button with the :id icon. Exit the Tester. |
In this section we'll create a reusable page fragment that will allow us to search for employees by their email. We'll then use this page fragment inside another JSF page. The same page fragment can be used in multiple other pages in our application.
| 1. | First we'll create a new task flow specific for this page.
Under the Web Tier -> JSF category choose ADF Task Flow and click OK.
|
| 2. | In the Create Task Flow dialog set the File Name
property to search-email-flow.xml.
|
| 3. | In the diagram editor for the new flow you created, drag a View component from the component palette onto the empty and rename it to searchEmail. While we'll only be using a single page in this flow, you can have bounded task flows with multiple pages and still include them in other JSF pages.
|
| 4. | Double click the new searchEmail view components
to create the page for it.
|
| 5. | An empty design view of the page will appear. Expand the Data
Controls accordion and locate the new view you created. - EmpByEmail1
expand the view and the Operation node underneath it.
We are going to use the ExecuteWithParams operation to execute the query for this view passing to it the needed parameter.
|
| 6. | Drag the ExecuteWithParams operation to your new page,
when prompted to choose to choose a drop option choose Parameters->ADF
Parameter Form....
In the Edit Form Fields dialog click OK to accept default values.
|
| 7. | In the design editor for the page click the ExecuteWithParams button and use the property inspector to change the Text property to Find Details.
|
| 8. | From the Data Controls accordion, drag the EmpByEmails1
view onto the page beneath the button. When prompted to choose a drop
option choose From->ADF Read Only Form....
Accept the defaults presented in the Edit Form Fields dialog and click OK.
|
| 9. | Now that our new bounded task flow includes a page fragment, we'll
include the complete bounded task flow inside another JSF page.
|
| 10. | Now we'll add the new flow we created as a region to the existing page.
Your page should look like the following:
|
| 11. | Save your work by pressing the Save All button and
then Run the updated DeptEmpPage.jspx
page.
The employee details are returned. |
Congratulations you have just finished a complete ADF application. You've used ADF Business Components to create both simple and complex business services that map to the database. You've used ADF Faces components to create a rich user interface with built-in Ajax capabilities. And you used the ADF Task Flows to create page flows and reusable page regions. Notice how little code you had to write while working with JDeveloper and ADF. This is only the first step in your road to mastering Oracle ADF, you can get much more information at http://www.oracle.com/technetwork/developer-tools/jdev/overview/index.html
In this tutorial, you've seen how to create ADF Rich Client JSF Pages and use some advanced features like:
Create a New Fusion Application and Business Component |
|
| Refine your Business Components |
|
| Create JSF Web Pages |
|
| Bind Data Controls to your JSF Page |
|
| Add More Complex Business Services |
|
| Create a Page Flow |
|
| Use ADF Faces Framework Features |
|
| Create Read Only Business Services, Page Fragments and Regions |