Understanding the disadvantages of using AJAX

Friday, April 25, 2008

Though Ajax delivers more responsive user interface and uses less band width over internet, understanding the disadvantages of using AJAX will help us to design better web applications.

The dynamically created page does not register itself with the browser history engine, so triggering the "Back" function of the users' browser might not bring the desired result.

Possible Solution
Using invisible IFRAMEs to invoke changes that populate the history used by a browser's back button.
Example: Google Maps - performs searches in an invisible IFRAME and then pulls results back into an element on the visible web page.

Dynamic web page updates make it difficult for a user to bookmark a particular state of the application.

Possible Solution
Use the URL fragment identifier to keep track of, and allow users to return to, the application in a given state. This is possible because many browsers allow JavaScript to update the fragment identifier of the URL dynamically, so that Ajax applications can maintain it as the user changes the application's state.

This solution also improves back-button support. It is not, however, a complete solution.


Response-time concerns

Network latency — or the interval between user request and server response — needs to be considered carefully during Ajax development. Without clear feedback to the user, preloading of data and proper handling of the XMLHttpRequest object, users might experience delays in the interface of the web application, something which they might not expect or understand. Additionally, when an entire page is rendered there is a brief moment of re-adjustment for the eye when the content changes. The lack of this re-adjustment with smaller portions of the screen changing makes the latency more apparent.

Possible Solution
Use of visual feedback (such as throbbers) to alert the user of background activity and/or preloading of content and data are often suggested solutions to these latency issues.


Search engine optimization
Websites that use Ajax to load data which should be indexed by search engines must be careful to provide equivalent Sitemaps data at a public, linked URL that the search engine can read, as search engines do not generally execute the JavaScript code required for Ajax functionality.


Reliance on JavaScript and the DOM
Ajax relies on JavaScript and the browser's Document Object Model (DOM), which are often implemented differently by different browsers or versions of a particular browser. Because of this, sites that use JavaScript may need to be tested in multiple browsers to check for compatibility issues. It's common to see JavaScript code written twice, one part for IE, another part for Mozilla compatibles, although this is less true with the release of IE7 and with the now-common use of JavaScript abstraction libraries like the Prototype JavaScript Framework or Jquery. Such libraries abstract browser-specific differences from the web developer.

Web analytics
Many web analytics solutions are based on the paradigm of a new page being loaded whenever new or updated content is displayed to the user, or to track a series of steps in a process such as a check-out. Since Ajax alters this process, care must be taken to account for how to instrument a page or a portion of a page so that it can be accurately tracked.

Possible Solution
Analytics systems which allow for the tracking of events other than a simple page view, such as the click of a button or link, are the ones most likely to be able to accommodate a site which heavily utilizes Ajax.

Read more...

Google Web Toolkit (GWT) with Jdeveloper.

Google Web Toolkit (GWT) helps Java developers create Ajax applications more productively. GWT proposes a different way to create Ajax applications. It uses Java as a single programming language for both the client and server sides. GWT provides a compiler that translates the Java code on the client side into JavaScript and DTHML. This solution greatly simplifies the technology stack from the programmer’s point of view.

Jdeveloper has provided extension (gwtDeveloper) for Google Web Toolkit (GWT). You can get it using JDeveloper's Check for Updates mechanism.

What can you do with gwtDeveloper?

  • Visually design your panels, composites, menus and other widget types
  • View, change your widget's properties using Property Inspector
  • Add event handlers to your widgets


You can find more about GWT Jdeveloper extensions at following link.http://www.gdevelop.com/


Also you can integrate GWT to Jdeveloper manually by following http://www.oracle.com/technology/pub/articles/dubois-gwt.html

Read more...

ADF online Demos

For ADF online demos refer
http://radio.weblogs.com/0118231/stories/2005/06/24/jdeveloperAdfScreencasts.html

Read more...

Configuring JDeveloper with SQL Server

For configuring jdeveloper with MS SQL Server refer http://www.devx.com/dbzone/Article/33681/0/page/2

Read more...

How to forward to a page dynamically in ADF?

Monday, April 21, 2008

Sometimes you want to perofrm some validations and based on the result, forward to other ADF pages.

You can follow one of these following approches.

Approach I
/* Forward to page "myPage.jspx" */
FacesContext fc = FacesContext.getCurrentInstance();
UIViewRoot viewRoot = fc.getApplication().getViewHandler().createView(fc, "/myPage.jspx");
fc.setViewRoot(viewRoot);
fc.renderResponse();

Approach II
/* Forward to the navigation rule "mypage" */
FacesContext fc = FacesContext.getCurrentInstance();
fc.getApplication().getNavigationHandler().handleNavigation(fc, null, "mypage");

Approach III
/* Redirect to page myPage.jspx */
FacesContext.getCurrentInstance().getExternalContext().redirect(/myPage.jspx);

Approach I and II preserve the processScope

Read more...

Database native Web services - A Cool feature in Oracle 11g

Tuesday, April 15, 2008

Web services have become a popular way of developing applications. Until now, creating a Web service has required hand-coding or generating the programs necessary to expose a SOAP end-point, and then deploying this code using an application server. These programs need to address all aspects of a Web service’s usage, including generating the WSDL document, parsing and processing the SOAP request, and marshaling the required data into the correct XML format to provide the SOAP response.

Database native Web services, delivered as part of Oracle Database 11g, eliminates all of this complexity for Web services that provide access to data stored in an Oracle Database. Database native Web services let you expose PL/SQL stored procedures, functions, and packages as Web services with zero coding and zero deployment effort. The database native Web services feature also includes a Web service that supports execution of dynamic SQL queries and XQuery expressions. The database HTTP server, provided as part of Oracle XML DB Repository, allows these Web services to be accessed using HTTP and HTTPS, without any additional application server infrastructure. Database native Web services leverage the powerful XML capabilities of Oracle XML DB to automatically generate the WDSL, parse and process the SOAP request, and generate the SOAP response.

A nice step-by-step artcile for using Database native Web services can be found here.

Read more...

Separating Rules from Business Processes.

Service-oriented architecture (SOA) facilitates the development of enterprise applications as modular business services that can be easily integrated and be reused. Business Process Execution Language (BPEL) enable services to be orchestrated into business processes, which can be changed easily in response to business requirements. SOA promises simplified integration and increases service reuse.

Change in Business Requirements does not always mean change in Business Process but often mean changes to the rules that drive the process.

A typical business process often includes a number of decision points. These decision points generally have an effect on the process flow; for example, someone's credit rating may determine whether he or she is approved for a low-cost loan. These decisions are evaluated based on certain conditions and facts, which may be internal or external to the business process, and predefined company policies or rules. Business rules engines (BREs) allow architects to easily define, manage, and update the decision logic that directs enterprise applications from a single location without needing to write code or change the business processes calling them.

Embeding the business rules inside the business process has savaral drawbacks.

  • Business rules change more often than the processes themselves, but changing and managing embedded business rules is a complex task beyond the abilities of most business analysts. Thus, as business rules change, programmers often have commit expensive time to this task.
  • Most organizations lack a central rules repository. Consequently, any organization-wide change in policy cannot be applied across all business processes.
  • Business processes cannot reuse rules. Hence, IT personnel end up designing rules for each and every process, often leading to inconsistency or redundancy.


The best way to avoid these problems is to separate business processes from business rules. Rules can be exposed as services and BPEL processes can leverage these services by querying the rules engine when they reach decision points.


Following Steps can be followed to use Rules along with BPEL.

  • Create rules in a ruleset.
  • Expose the ruleset as a Web service.
  • Invoke the ruleset Web service from BPEL.

Read more...

Generating XML data from database table and views

Monday, April 14, 2008

Oracle provides functions and packages for generating XML data from database table and views.

Following options can be used to generate XML from Oracle content.

  • Using SQLX Functions
  • Using Oracle Extensions to SQLX
  • Using DBMS_XMLGEN
  • Using SQL Functions
  • Using XSQL Pages Publishing Framework
  • Using XML SQL Utility (XSU)
This document explains the process in detail.

Read more...

Creating skin for ADF Application

Friday, April 11, 2008

A skin is a global style sheet that affects the entire application. You can create one skin for the entire application . Every component will automatically use the styling as described by the skin. Any changes to the skin will be picked up at runtime, no change to code is needed. Skins are based on the Cascading Style Sheet (CSS) specification. You can also dynamically switch skins during runtime.

In JDeveloper 11 you don't need to write a complete skin just to change a single component. You can extend an existing skin.

To create a skin, you can refer this document.

Read more...

ADF Business Components Validation Flow Chart

This flow chart illustrates the validation processing flow for
insert, update and delete.



Read more...

Using BPEL in ADF

The common way of using web services in Oracle ADF is to create a data control for an external web service. JDeveloper allows you to create a data control for an existing web service using just the WSDL for the service.

Here you can watch a nice demo to use BPEL with ADF.

Read more...

Order of method calls in Entity Object

Thursday, April 10, 2008

Though I found a lot of reference about Entity Object methods and thier usage, I never found a document describing order of method calls in Entity Object. Here I am trying to put the method call order in place.

Entity Create flow.

Loop for each created entity Object
{
validateEntity();
prepareForDML();
doDML();
}
Loop for each created entity Object
{
beforeCommit();
}

Read more...

Enabling Partial Page Rendering(PPR) in ADF.

For a component to trigger another component to refresh, the trigger component must cause a submit when an appropriate action takes place.On the trigger command component set the id attribute to a unique value. If it is an input component in a form, set the autoSubmit attribute of thecomponent to true. Otherwise, set the partialSubmit attribute of the component to true.

For a component is to be refreshed triggered by another component, it must declare which other components are the triggers.On the target component that you want to partially refresh when the trigger command component is activated, set the partialTriggers attribute to the id of the trigger command component. If the component refresh is to be triggered by more than one other component, list their IDs separated by spaces.

Following three main component attributes are used to enable partial page rendering.

autoSubmit: When the autoSubmit attribute of an input or select component is set to true, and an appropriate action takes place (such as a value change), the component automatically submits the form it is enclosed in.

partialSubmit: When the partialSubmit attribute of a command component is set to true, clicking the button or link causes the page to be partially submitted.

partialTriggers: All rendered components support the partialTriggers attribute. Use this attribute to list the IDs of components whose change events are to trigger this component to be refreshed.

Read more...

What is Trinidad?

Trinidad is Oracle's JSF component library which Oracle has donated to Apache MyFaces.

Trinidad is a JSF framework including a large, enterprise quality component library, supporting critical features such as accessibility (e.g. Section 508), right-to-left languages, etc. It also includes a set of framework features, including :

  • Partial-page rendering support for the entire component set
  • Integrated client-side validation
  • A dialog framework
  • pageFlowScope, for communicating between pages

Oracle's ADF Faces Rich Client components are based on these Trinidad components.

Read more...

How to display the content of a BLOB column(e.g. Image) in a ADF/BC pages ?

Wednesday, April 09, 2008

If you have some image in the database table BLOB column and you want to display the image on the screen, you can follow the following approach.

1: Write a simple servlet that streams the blob back to the client as an image.
2: Add an image to the page from the component pallete.

3: Change the source attribute of image to /yourServletname?thumbnail=#{bindings.yourbindingvalue}
e.g./imageservlet?thumbnail=#{bindings.ProductId}

I have taken the servlet code from the FOD (Fusion Order Demo). Modify the following code according to your application specific object usage.

package oracle.fodemo.storefront.servlet;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.OutputStream;

import java.sql.Blob;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import javax.sql.DataSource;


public class ImageServlet extends HttpServlet {
   private static final String CONTENT_TYPE =

       "image/jpg; charset=utf-8";

   public void init(ServletConfig config) throws ServletException {
       super.init(config);

   }

   public void doGet(HttpServletRequest request,
                     HttpServletResponse response) throws ServletException,

                                                          IOException {

       response.setContentType(CONTENT_TYPE);
       response.setContentType(CONTENT_TYPE);
       String detailProductId = request.getParameter("detail");

       String thumbnailProductId = request.getParameter("thumbnail");
       boolean thumbnail = true;
       String productId = null;

       OutputStream os = response.getOutputStream();
       Connection conn = null;
       

       try {
           Context ctx = new InitialContext();
           DataSource ds = (DataSource)ctx.lookup("jdbc/FODDS");

           conn = ds.getConnection();
           PreparedStatement statement = conn.prepareStatement(
             "SELECT ProductImageEO.PRODUCT_IMAGE_ID, " +

             "       ProductImageEO.PRODUCT_ID, " +
             "       ProductImageEO.DEFAULT_VIEW_FLAG, " +

             "       ProductImageEO.DETAIL_IMAGE_ID, " +
             "       ProductImageEO.IMAGE " +

             "FROM  PRODUCT_IMAGES ProductImageEO " +
             "WHERE ProductImageEO.DEFAULT_VIEW_FLAG = ?" +

             "      AND ProductImageEO.PRODUCT_ID = ?");

           if (detailProductId != null) {

               productId = detailProductId;
               thumbnail = false;

           } else {
               productId = thumbnailProductId;

   
           }
   
           statement.setString(1,(thumbnail ? "Y" : "N"));            

           statement.setInt(2, new Integer(productId));
           ResultSet rs = statement.executeQuery();
           

           if (rs.next()) {
               Blob blob = rs.getBlob("IMAGE");

               BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream());
               int b; byte[] buffer = new byte[10240];

               while ((b = in.read(buffer, 0, 10240)) != -1) { os.write(buffer, 0, b); }
               os.close();

           }
       } catch (Exception e){
           e.printStackTrace();

       } finally {
           try{
               if (conn != null){

                    conn.close();
               }

            } catch (SQLException sqle){
                sqle.printStackTrace();

            }  
       }

}

Read more...

ADF EO - Assigning Database Sequence value to an Attribute at time of row creation.

Sometimes you need to assign a database sequence value to an attribute at entity row creation time. Override the create() method and use SequenceImpl helper class in the oracle.jbo.server package to get the sequence value.

Example:

import oracle.jbo.server.SequenceImpl;

protected void create(AttributeList nameValuePair) {
super.create(nameValuePair);
SequenceImpl sequence =
new SequenceImpl("EMPLOYEE_SEQ",getDBTransaction());
setEmpId(sequence.getSequenceNumber());
}

Read more...

ADF - validate the username and password against a database table

Container-managed security allows web applications to delegate authentication and authorization decisions to the executing web container.In Oracle Containers for J2EE (OC4J) the authentication and authorization decision is handled by the OracleAS JAAS Provider.Web applications running in OC4J can be configured to authenticate users against Oracle Internet Directory (OID), third-party LDAP, CoreId, jazn-data.xml or a custom JAAS LoginModule.The benefit of container-managed security in contrast to a pure JAAS approach (Java Authentication and Authorization Service) approach is that the application logic is not mixed with authentication and authorization code, which ensures portability.

This article explains how to leverage database tables for storing account information for user authentication and authorization of Java EE applications in JDeveloper 10.1.3.2 and OC4J 10.1.3.2.

Find the article here.

Read more...

Most Commonly Used Methods in ADF Business Components

Tuesday, April 08, 2008

Steve Muench has compiled a list of Most Commonly Used Methods in ADF Business Components. It includes the methods that ADF developers write, call, and override most frequently.

The list can be found here.

Read more...

Life Cycle of an Entity Object.

When a new row is created on entity-based view object, the entity status is set as New. Transaction's list of pending changes is updated with the new row. When the transaction is committed, the row will be saved to the data base. But when a blank row is created, the user may not have entered any data. So by setting the row status to 'initialized', the new row can be forced to remove from the Transaction's list of pending changes. This prevents the system from posting the row into database, if the user never enters any data into any attribute of that initialized row. When the user enters data into any attribute of the initialized row, the row status changed to New.













When an entity is retrieved from the database, its status is set as Unmodified. When the user enters data into any attribute of the unmodified row, the row status changed to Modified. When user calls remove() on Unmodified row, the row status changes to Deleted. If the row is in New state and the user calls remove() on the row, row status changes to Dead.

When an entity is retrieved from database, the entity is assumed to be valid. When any attribute of the entity is modified or a new entity row is created, the entity is marked as invalid. Before committing the transaction, system validates all invalid entity rows in the Transaction's pending list. Then the changes are posted to database and the row status changes to Unmodified.

Read more...

Difference between setCurrentRowWithKey and setCurrentRowWithKeyValue?

setCurrentRowWithKey takes serialized value of rowKey as parameter e.g. 000200000002C20200000002C102000000010000010A5AB7DAD9
The serialized string representation of a key encodes all of the key attributes that can be conveniently passed as a single
value in a browser URL string or form parameter.

The serialized string key of a row can be accessed by referencing the rowKeyStr property of an ADF control binding (e.g. #{bindings.SomeAttrName.rowKeyStr})

setCurrentRowWithKeyValue takes literal value as parameter e.g "201"

Read more...

How to change the Oracle ADF look and feel?

Friday, April 04, 2008

Oracle supports skinning i.e. changing the look and feel of the application.
You can develop your own skin e.g. CustomSkin.css

Step 1: Put CustomSkin.css and all dependent resources at the root
of your application e.g. /skins/myskin/CustomSkin.css

Step 2: Register the custom skin
In JDeveloper, right click on the WEB-INF folder of the sample project
and create a new XML document and name it - adf-faces-skins.xml
Replace the generated code with the following:

 <skins xmlns="http://xmlns.oracle.com/adf/view/faces/skin">
  <skin>
   <id>mycompany.desktop</id>
   <family>myskin</family>
   <render-kit-id>oracle.adf.desktop</render-kit-id>
   <style-sheet-name>/skins/myskin/CustomSkin.css</style-sheet-name>
  </skin>
 </skins>

Save your work.

Step 3: Modify adf-faces-config.xml file to use the custom skin.
Open the adf-faces-config.xml file.
Replace the <skin-family>value with custom skin family name
e.g. <skin-family>myskin</skin-family>

Save your work.

Step 4: Run your application and test.

Read more...

Useful ADF Blogs

These Blogs made my life easier. Hope these will help you too.

Frank Nimphius Blogbuster

Dive into Oracle ADF

Shay Shmeltzer's Weblog

The Peninsula's Edge

The GroundBlog By Duncan Mills

Matthias Wessendorf's Weblog

Grants Blog

Tug's Blog

Chris Muir

Real World ADF

Gerard Davison's Blog

Andrejus Baranovskis's Blog - JDev/ADF Samples list

Java / Oracle SOA blog

Read more...

How to add one master and many details in Oracle ADF?

Oracle ADF helps you to define master detail regions by drag and drop. But 'drag and drop' is only possible for one master and one detail combination. For one master and many details design follow the following steps.

let us assume, you need one master and two detail.

Region Structure
---------------------------

Master1
|
|________ Detail1
|
|________ Detail2

View Objects
----------------------------
MasterVO
|
| VL1
|___________DetailVO1
|
| VL2
|___________DetailVO2


Step 1: Drag DetailVO1 from Data Control Palette.
Drop on the page design and select 'Master Detail => ADF master table, Detail Table'
This will create Master1 table and Detail1 table

Step 2: Drag DetailVO2 from Data Control Palette.
Drop on the page design and select 'Master Detail => ADF master table, Detail Table'
This will create Master2 table and Detail2 table

Step 3: Delete Master2 table

Step 4: Select Detail2 table. In the property inspector, Behavior tab, put Master1 in the Partial Triggers field. (Note: Master1 is the master table name).

Run the page and test.

Read more...

  © Blogger templates Newspaper by Ourblogtemplates.com 2008

Back to TOP