Arun Gupta, Miles to go ...

Arun Gupta is a technology enthusiast, a passionate runner, and a community guy who works for Sun Microsystems.
Main | Next page »

http://blogs.sun.com/arungupta/date/20080917 Wednesday September 17, 2008

TOTD #45: Ajaxifying Java Server Faces using JSF Extensions


TOTD #42 explained how to create a simple Java Server Faces application using NetBeans 6.1 and deploy on GlassFish. In the process it explained some basic JSF concepts as well. If you remember, it built an application that allows you to create a database of cities/country of your choice. In that application, any city/country combination can be entered twice and no errors are reported.

This blog entry extends TOTD #42 and show the list of cities, that have already been entered, starting with the letters entered in the text box. And instead of refreshing the entire page, it uses JSF Extensions to make an Ajax call to the endpoint and show the list of cities based upon the text entered. This behavior is similar to Autocomplete and shows the suggestions in a separate text box.

Let's get started!

  1. Download latest JSF-Extensions release.
  2. Unzip the bundle as:

    ~/tools >gunzip -c ~/Downloads/jsf-extensions-0.1.tar.gz | tar xvf -
  3. In NetBeans IDE, add the following jars to Project/Libraries

  4. Edit "welcomeJSF.jsp"
    1. Add the following to the required tag libraries

      <%@taglib prefix="jsfExt" uri="http://java.sun.com/jsf/extensions/dynafaces" %>

      The updated page looks like:

    2. Add the following tag as the first tag inside <f:view>

      <jsfExt:scripts />

      The updated page looks like:

    3. Add prependId="false" to "<h:form>" tag. The updated tag looks like:

    4. Add the following fragment as an attribute to <h:inputText> tag with "cityName" id:

      onkeyup="DynaFaces.fireAjaxTransaction(this, { execute: 'cityName', render: 'city_choices', immediate: true});"

      This is the magic fragment that issues an Ajax call to the endpoint. It ensures execute portion of the request lifecycle is executed for "cityName" and "city_choices" (defined later) is rendered.

      The updated page looks like:

    5. Add a new <h:outputText> tag after <h:commandButton> tag (to hold the suggestions output):

      <h:outputText id="city_choices" value="#{dbUtil.cityChoices}"></h:outputText>

      The updated page looks like:

  5. Add the following fragment to web.xml

           <init-param>
              <param-name>javax.faces.LIFECYCLE_ID</param-name>
              <param-value>com.sun.faces.lifecycle.PARTIAL</param-value>
            </init-param>

    The updated file looks like:

  6. Edit "server.Cities" class
    1. Add a new NamedQuery in Cities class (at the mark after yellow-highlighted parentheses):




      The query is:

      @NamedQuery(name = "Cities.findSimilarName", query = "SELECT c FROM Cities c WHERE LOWER(c.cityName) LIKE :searchString"),

      This NamedQuery queries the database and return a list of city names that matches the pattern specified in "searchString" parameter.
    2. Change the toString() method implementation to return "cityName". The updated method looks like:



      This allows the city name to be printed clearly.
  7. Add a new method in "server.DatabaseUtil" as:

        public Collection<Cities> getCityChoices() {
            Collection<Cities> allCities = new ArrayList<Cities>();

            if (cities.getCityName() != null && !cities.getCityName().equals("")) {
                List list = entityManager.createNamedQuery("Cities.findSimilarName").
                        setParameter("searchString", cities.getCityName().toLowerCase() + "%").
                        getResultList();
                for (int i = 0; i < list.size(); i++) {
                    allCities.add((Cities) list.get(i));
                }
               
            }
            return allCities;
        }

    This method uses previously defined NamedQuery and adds a parameter for pattern matching.
Now, play time!

The list of created cities is:



If "S" is entered in the text box (http://localhost:8080/Cities/), then the following output is shown:



Entering "San", shows:



Entering "Sant" shows:



Entering "De" updates the page as:



And finally entering "Ber" shows the output as:



So you built a simple Ajaxified Java Server Faces application using JSF Extensions.

Here are some more references to look at:
  1. JSF Extensions Getting Started Guide
  2. Tech Tip: Adding Ajax to Java Server Faces Technology with Dynamic Faces
  3. JSF Extensions Ajax Reference
Java Server Faces 2.0 has Ajax functionality integrated into the spec and this should be more seamless. I'll try that next!

Please leave suggestions on other TOTD (Tip Of The Day) that you'd like to see. A complete archive of all tips is available here.

Technorati: totd mysql javaserverfaces netbeans glassfish ajax

del.icio.us | furl | simpy | slashdot | technorati | digg |
|

http://blogs.sun.com/arungupta/date/20080316 Sunday March 16, 2008

Travel Schedule - Next 5 weeks

Here is my travel schedule for next 5 weeks:

Mar 17-21 Ajax World, New York Web Application Development using jMaki
Mar 25-26 The Server Side Java Symposium, Las Vegas Rails powered by GlassFish & jMaki
Mar 27 Developer Update, St Louis Westport DoubleTree, FREE event Open Source Web Services stack in GlassFish
Mar 28 Developer Update, Kansas City, FREE event Rich Internet Applications and GlassFish
Apr 16-19 FISL, Brazil Web 2.0 Application Development using jMaki and
Asynchronous Ajax for Revolutionary Web Applications

Stop by and say hello if you are present at any of the events. You'll hear about different GlassFish technologies:
  • How Metro provides enterprise-grade open source Web services stack for meeting all your needs
  • How jMaki allows you to create Rich Internet Applications
  • How Rails applications can be powered by GlassFish & jMaki
  • Asynchronous Ajax that allows you to scale your applications tremendously
  • And any other topic that you are interested in :)
Drop a comment if you are interested in a run or meal together ?

Technorati: conf glassfish metro webservices netbeans jmaki ajax newyork lasvegas stlouis kansascity brazil fisl ajaxworld tssjs

del.icio.us | furl | simpy | slashdot | technorati | digg |
|

http://blogs.sun.com/arungupta/date/20071212 Wednesday December 12, 2007

TOTD #20: How to create a new jMaki widget ?

This TOTD explains how to create a new jMaki widget and make it available in the NetBeans palette.

In order to create a jMaki widget, it's important to understand the jMaki Widget Model.

Basically, "component.htm", "component.js" and an optional "component.css" together make a jMaki widget.

Here are the files for a Hello World widget that takes an argument, concatenates it with the string "Hello" and displays the result on the page.

component.htm

<div id="${uuid}" class="hello"></div>

component.js

jmaki.namespace("jmaki.widgets.hello");

jmaki.widgets.hello.Widget = function(wargs) {
  var hello = document.getElementById(wargs.uuid);
  hello.innerHTML = "Hello " + wargs.args.name;
}

component.css

.hello {
  font-size: 22px;color: red;
}

The following files are required if you like to package your component as a reusable widget library in the NetBeans IDE:

hello.jsp

<a:widget name="hello" args="{name: 'Duke'}" />

Bundle.properties (top-level)

jMaki.Library.Name=jMaki Hello Widget

Bundle.properties (templates)

NAME_templates.hello=Hello
HINT_templates.hello=<html>Hello</html>

widget.json

{
  'name': 'Hello',
  'type': 'custom',
  'version': '1.0',
  'jMakiVersion': '1.0'
}

Package these files together in the following directory structure (choose any zip file name):

Bundle.properties
resources
  hello
    component.htm
    component.js
    component.css
    widget.json (optional)
templates
   hello
     hello.jsp
     Bundle.properties

And then you zip up these files together, that's it! Now this zip file can be added to the jMaki palette in the NetBeans IDE as shown here. Really simple!

After the widget is added to NetBeans palette, it looks like as shown below:

Now, just like any other jMaki widget, you can drag-and-drop "Hello" from the jMaki palette in your JSP page and the following code fragment is generated:

<a:widget name="hello" args="{name: 'Duke'}" />

After the application is deployed, the page is rendered in the browser as shown below:

Couple of points ...

  1. Templates for other languages such as Ruby or PHP can be added in the templates directory. This enables drag-and-drop of your widget in those languages as well.
  2. It's important to maintain the case sensitivity of the property names in Bundle.properties otherwise they will not be recognized.

Please leave suggestions on other TOTD that you'd like to see. A complete archive is available here.

Technorati: totd jmaki web2.0 widgets ajax netbeans

del.icio.us | furl | simpy | slashdot | technorati | digg |
|

http://blogs.sun.com/arungupta/date/20070604 Monday June 04, 2007

http://blogs.sun.com/arungupta/date/20070420 Friday April 20, 2007

AJAX vs Ajax - Ajax ofcourse!

Ajax is a popular term for past few months but is still being written incorrectly as "AJAX" (all capitals) instead of "Ajax" (camel case). I started using AJAX but then corrected myself and have been using Ajax since then. So the correct term is Ajax, not AJAX.

Here is a list of several reasons (some mine and others from my colleague Rick's list):

  1. Jesse James Garrett coined the term as Ajax, not AJAX.
    1. A quote from the source "The name is shorthand for Asynchronous JavaScript + XML". It is intended to be a shorthand, not an acronym. And notice it is "+", not an "and" indicating a collection of technologies.
    2. Another quote from the source "I needed something shorter than “Asynchronous JavaScript+CSS+DOM+XMLHttpRequest” to use when discussing this approach with clients.". Ajax is not just Asynchronous JavaScript and XML, it's CSS and DOM as well. Moreover JSON is becoming a more popular format for data interchange. Should "AJAX" then instead be coined as "AJAJ" ? Or if an application happen to use Text instead, will they call it as "AJAT" ?
    3. In an interview on The story behind Ajax, Jesse said "I thought of Ajax as a convenient [term]. It was never intended as an acronym.".

I think the above three bullets should be sufficient to convince anybody to use "Ajax" instead of "AJAX". But if not, here are some more reasons to switch to the correct usage of term:

  1. Wikipedia entry clarifies that Ajax is not expected to be an acronym.
  2. A Google Fight between AJAX and Ajax shows exactly same numbers and still tries to predict a winner. Is that a bug ?
  3. Another reference to Ajax vs AJAX.
  4. Bye Bye "AJAX", The Age of "Ajax" is Nigh - If AJAX is indeed an acronym (which it's not) then a comment on the article points out some others as:
    AJACX: Asynchronous JavaScript, CSS and XMLHttpRequest
    ADJACS: Asynchronous DOM, JavaScript and CSS
    ADHJACS: Asynchronous DOM, HTML, JavaScript and CSS
    AJACHS: Asynchronous JavaScript, HTML and CSS
    AJACS: Asynchronous JavaScript, HTML and CSS
  5. Dion's (Ajaxian co-founder) first prediction for 2007 is "Ajax beats AJAX in all but bad newspapers."
  6. Here is a Google survey of some publishers of Ajax books. They all seem to be using "Ajax", not "AJAX".
  7. Some of the common vendors use Ajax
    1. IBM
    2. HP
    3. Oracle
    4. BEA
    5. Adobe

Now there should be no reason to use "AJAX". However if you still feel like using this term, please leave a comment on this blog and let's talk. There are some incorrect usages in sun.com and I'll follow up to get them fixed.

Technorati: ajax Ajax AJAX

del.icio.us | furl | simpy | slashdot | technorati | digg |
|

http://blogs.sun.com/arungupta/date/20070323 Friday March 23, 2007

Day 1 @ The Server Side Java Symposium

I've been in Las Vegas for past 2 days attending The Server Side Java Symposium. Sun is the only platinum sponsor.

The conference is at The Venetian, one of the nicest hotels on the strip, but found two irritating issues for working people:

  • Using fitness center facilities require you to pay $35/day charge. That is ridiculous to me. They anyway charge fortune for the room so why this extra fee ? I used the facility yesterday without knowing the charge but found out about the charge as there were folks lined up on the "reservation desk" for the fitness center. I've never seen that for a fitness center in a hotel.
  • There are no power connections on the office table. There is a personalized fax machine but I'd rather have a power connection to make it convenient.

TheServerSide sponsored the travel and lodging and check out the pictures of the suite, it's pretty cool!

 

I missed the opening keynote by Karen Tegan Padir but heard it went well. Later that day, I attended a session by Ben Galbraith and Dion Alamer (co-founders of Ajaxian) on "State of Ajax".

The session started by asking "Does anyone here not know how to do Ajax ?". There were few hands raised and so the session started by creating a simple HTML form that takes a zip code and returns the corresponding city using XMLHttpRequest without any page refresh. Then the talk explained three main Ajaxian architectures:

  • Return data (JSON / XML) - Smart clients, parse XML and JSON and populate the front end.
  • Return HTML (responseText + innerHTML) - Slightly dumb client, just shows the results as is.
  • Return JavaScript (eval) - Really dumb client, invoke the script sent by server.

The talk identified Google Maps, Google Suggest, HousingmapsTaDaList as Ajax innovators. In my opinion, Google Suggest was really the first effort that showed Ajax-like interactions.

Ben and Dion divided JavaScript in two camps: "JavaScript is Good" and "JavaScript is Bad". jMaki was classified in the first camp, Google Web Toolkit in the second camp and Direct Web Remoting in partly both the camps. Project Phobos was also classified in "JavaScript is Good" camp as it enables server-side scripting. Ben will be uploading a new video on jMaki showing Craig's list mashup so stay tuned for that.

Prototype, Scriptaculous and Dojo were rated as the most popular toolkits in a survey conducted last year on Ajaxian. The speakers classified Dojo as "Huge Elephant of JavaScript" with support for offline storage, presentation, remoting, charts and many other features.

IntelliJ IDEA 6.0 and NetBeans 5.5 for development and FireBug for debugging were the recommended tools. Then there were few slides on offline storage, especially the upcoming capabilities in Firefox 3 (off-line cache, off-line events, persistent cache), dojo.storage package and Adobe Apollo with offline flash. There was a brief mention of Project Tamarin that will provide approx 10 times faster JavaScript runtime and this will be integrated in a later version of Firefox. And the talk concluded by giving a future slide including topics such as off-line Ajax, fast JavaScript interpreters, HTML 5 and others.

A complete Day 1 report is available here. Ed Ort also posted notes.

Technorati: theserverside Ajax venetian

del.icio.us | furl | simpy | slashdot | technorati | digg |
|

http://blogs.sun.com/arungupta/date/20070319 Monday March 19, 2007

http://blogs.sun.com/arungupta/date/20070316 Friday March 16, 2007

http://blogs.sun.com/arungupta/date/20070314 Wednesday March 14, 2007

Next Gen Web @ JavaOne

Follow up from my previous entry, here is a complete list of all the next generation Web application, a.k.a "Web 2.0", sessions from Sun.

Session # Title
BOF 6012 JavaScript Programming Language Best Practices for Developers on the Java Platform
TS 6029 Beyond Blogging: Feeds in Action
TS 6375 jMaki: Web 2.0 App Building Made Easy
TS 6381 The Future of the Java Technology Web Tier
TS 6411 JSR 311: The Java API for RESTful Web Services
BOF 6412 Describing RESTful Applications: WADLing with Java
BOF 6424 Accessibility for Ajax and Web 2.0 Applications, from Emerging Concepts to Practical Coding
BOF 6425 Testing Web 2.0 Features, Using Real-World Applications
BOF 6807 Real-World Comet-Based Applications
BOF 6876 Ajax and Web 2.0 Performance Roundtable
TS 6957 Project Phobos: Server-Side Scripting for the Java Platform
TS 8840 Services Interoperability with Java Technology and .NET: Technologies and Tools for Web 2.0
TS 9516 Using jMaki in a Visual Development Environment

There is more content that has not been publicly announced yet. And while we are working on making presentations for this year richer, fuller and more hands-on, get your self familiar with JavaOne 2006 archives on this topic.

Session # Title
TS 1161 Evolving JavaServer Faces Technology: AJAX Done Right
TS 1222 RESTful Web Services With JAX-WS
TS 1615 Java EE 5 BluePrints for AJAX-Enabled Web 2.0 Applications
TS 1756 Java Technology and REST: Implementing the Atom Protocol
TS 3577 Using the Dojo Toolkit to Develop AJAX-Enabled Java EE Web Applications
TS 4372 Java Technology, AJAX, Web 2.0 and SOA
TS 8614 AJAX & Persistence: Emerging Patterns & Pain Points

Technorati: Javaone Web2.0 Ajax jmaki REST JavaScript

del.icio.us | furl | simpy | slashdot | technorati | digg |
|

http://blogs.sun.com/arungupta/date/20070313 Tuesday March 13, 2007

Sun @ The Server Side Java Symposium

Here is the list of Sun Microsystems sessions at The Server Side, Java Symposium, Las Vegas next week:

Stop by and say hello to the folks who bring you this great technology!

Technorati: TheServerSide LasVegas Venetian Web services NetBeans Ajax JRuby Ruby GlassFish Sun presos

del.icio.us | furl | simpy | slashdot | technorati | digg |
|

http://blogs.sun.com/arungupta/date/20070312 Monday March 12, 2007

Introducing Sun Web Developer Pack

Sun Web Developer Pack (SWDP) is a new integrated toolkit from Sun Microsystems that consists of a collection of Web 2.0 technologies that enable next generation Web application development. The toolkit consists of binaries, tutorial, documentation, samples (including source) to build your Web 2.0 applications and deploy them on industry-grade containers. It includes support for building rich user interface using Ajax technologies with Project jMaki & Project Dynamic Faces, light-weight Web services with Atom / REST APIs / WADL and server side scripting with Project Phobos.

Check the system requirements to see the list of supported platforms, JDK versions, browsers, web containers and Ant. These applications can be hosted on Sun Java System Application Server 9.x, Sun Java System Web Server 7.0 U1, GlassFish v1 UR1, GlassFish v2 and Apache Tomcat 6.

SWDP comes with NetBeans plug-ins that simplifies the design and development of Rich Internet Applications. These modules can be downloaded from NetBeans Update Center Beta with the name "Sun Web Developer Pack R1". Check out how to build jMaki and Phobos applications in a screencast.

Get the Sun Web Developer Pack
Simplify development of your Web 2.0 applications with this all-in-one download.

You can download SWDP as a stand-alone bundle and install on a supported Web container.  Alternatively, you can download SWDP bundled with Java Application Platform SDK Update 3 Preview. The SDK bundle can be downloaded in three different flavors:

  • Only SDK - Need to download JDK and NetBeans separately
  • SDK + JDK - Need to download NetBeans separately
  • SDK + NetBeans Enterprise Pack 5.5.1 Beta - Need to download JDK separately

After installing SWDP, it's recommended to view the latest online Release Notes. The binaries are accompanied by a comprehensive tutorial and an SWDP forum to post your questions. You can also view the list of SWDP bloggers or subscribe to the aggregated pipe.

You can view and download demos, samples, widgets and much more using these technologies here. Blueprints provide you guidelines and code for building these applications.

Technorati: swdp web2.0 ajax scripting javaee javaeesdk glassfish jmaki phobos netbeans

del.icio.us | furl | simpy | slashdot | technorati | digg |
|

http://blogs.sun.com/arungupta/date/20070302 Friday March 02, 2007

JSON Pros and Cons

Following up on my JSON blog, here is great table summarizing the strengths and weaknesses of JSON as compared to XML.

Technorati: XML JSON Web2.0 Ajax

del.icio.us | furl | simpy | slashdot | technorati | digg |
|

Sun @ Ajax World

Sun Microsystems is a silver sponsor of AJAX World Conference and Expo East 2007, Mar 19-21, New York City. Ajax Architect Greg Murray, Struts creator Craig McClanahan, and Jean Francois Arcand of Grizzly fame, all from Sun, will be speaking. Here are the topics:

It seems the conference planners really like Greg a lot since they've not only featured him on their main page but given his brief bio thrice :) 

And his last name is "Murray", not "Murry".

All of them are great speakers. So if you are planning to attend Ajax World, I highly recommend their talk. You'll see/feel the passion. 

Technorati: Ajax Web2.0 Sun AjaxWorld presos

del.icio.us | furl | simpy | slashdot | technorati | digg |
|

http://blogs.sun.com/arungupta/date/20070301 Thursday March 01, 2007

Language-neutral data format: XML and JSON

XML and JSON are the two prevalent choices for language-neutral data format. That means a format used to exchange data between client and server, independent of the language used on each end. We are familiar with XML pointy bracket syntax which has served us well so far. With Rich Internet Applications becoming more common, there is a need to have a light-weight data interchange format. And so JSON is catching up (11% for data transfer in 2006).

Basically, JSON is built on two structures:

  • A collection of name/value pairs with unique names (associative array)
  • An ordered list of values (array)

See message samples formatted in JSON and equivalent XML. Tim Bray summarizes when to use which format.

Here is a collection of interesting articles in case you want to dig deeper:

The key advantages of JSON I derived from my reading of the above articles are:

  • Much simpler than XML because it is not a markup language and a natural representation of data.
  • JSON is better data exchange format, XML is a better document exchange format. 
  • JSON is easier to read for machines with no/thin client-side library.
  • JSON is a natural fit for data consumption by browser clients, for example Ajax components.
  • Ability to represent general data structures: records, lists and trees.
  • Wikipedia entry for JSON reports parsing and generating JSON support in 21 languages.

There are some disadvantages as well:

  • JSON format is hard to read for humans; for example complicated-looking syntax, like the }}]} at the end of data snippet is frightening and debugging pain.
  • JSON is a newer format so not enough tools to help with authoring & parsing. Some available are:
    • JSON Tools - Java Tools for the JSON Format (parser, renderer, serializer, mapper, validator)
    • JSON-lib - Java library for transforming beans, maps, collections, java arrays and XML to JSON and back again to beans.
    • JSON in Java - Java APIs from json.org (see more below)
    • JSON-taglib - JSON-taglib is a JSP 2.0 tag library used to render JSON data from within JSP code.
    • Could not find an editor that would allow me to edit JSON objects.
  • JSON does not have a <[CDATA[]]> feature, so it is not well suited to act as a carrier of sounds or images or other large binary payloads.
  • Unlike XML, JSON does not provide any display capabilities because it is not a document markup language. JSON was not even intended for that purpose.
  • JSON is not extensible - it does not need to be because it's not a document markup language.

In jMaki, we use JSON in Java. Here is a sample code to create a JSON object using these APIs:

import org.json.*;
import java.io.*;

public class JSONSample {
  public static void main(String[] args) throws Exception {

    // basic object creation
    JSONObject person = new JSONObject();
    person.put("name", "duke");
    person.put("age", "10");
    System.out.println(person.toString());

    // how to create array and write to a "writer"
    JSONObject address = new JSONObject();
    JSONArray array = new JSONArray();
    array.put("4140, Network Circle";);
    array.put("Santa Clara";);
    array.put("CA - 95054";);
    address.append("address", array);
    OutputStreamWriter osw = new OutputStreamWriter(System.out);
    address.write(osw);
    osw.flush();

    // XML->JSON conversion
    JSONObject likes = XML.toJSONObject("<likes><running/><skiing/></likes>");
    System.out.println(likes.toString());
  }
}

And here is the corresponding output:

{"age":"10","name":"duke"}
{"address":[["4140, network circle","Santa Clara","CA - 95054"]]}
{"likes":{"skiing":{},"running":{}}}

This API also allows conversion from comma-delimited text, HTTP, Cookie, and CookieList to JSON conversions. The source code for JSON in Java is freely available but here are two suggestions for ease-of-use:

  1. Provide a jar file that is ready to use
  2. Publish the link to framed version of javadocs on the main page since that is more useful.

In summary, XML is document-oriented and JSON is data-oriented. So if you want to deal with highly structured documents that requires a complex structure, binary data, exact ordering of elements and be able to render itself then use XML. OTOH, if you are focused on light-weight data exchange then JSON is the way to go. 

Follow the JSON blog and enjoy!

Technorati: XML JSON DataFormat JavaScript Web2.0 Ajax jMaki

del.icio.us | furl | simpy | slashdot | technorati | digg |
|

http://blogs.sun.com/arungupta/date/20070226 Monday February 26, 2007

Sun-internal jMaki Day Review

Last Friday jMaki team, at Sun Microsystems, arranged a jMaki Day for Sun-internal audience. The day was planned to introduce the technology and explains it's nuts and bolts with hands-on experience. Even though nobody outside Sun could attend it, but all the presos and lab material is available here

The morning sessions gave an overview of jMaki and included: 

The afternoon was BYOL (Bring Your Own Laptop) hands-on-labs and discussion with the team. It included:

The slides for the morning session and hands-on-labs are available. Here are some pictures:


Greg Murray

Attendees

Attendees

Carla Mott

Roberto Chinnici

Doris helping with mic

Ludovic Champenois

Greg Murray

Lunch

Lunch

Hands-on-labs

Hands-on-labs

You can get a flavor of these sessions and labs at Sun Tech Days

You can also view a collection of samples (run or download them) put together by Sun's Web 2.0 team. You can also look for a collection of jMaki samples here. All of these samples can be run on GlassFish.

Here are some important jMaki links:

Please send any feedback on slides and hands-on-labs to dev-AT-ajax.dev.java.net.

Technorati: jmaki ajax netbeans glassfish presos

del.icio.us | furl | simpy | slashdot | technorati | digg |
|
Main | Next page »

Valid HTML! Valid CSS!

This is a personal weblog, I do not speak for my employer.