<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
   <channel>
      <title>glassfish-webtier</title>
      <description>Aggregated feed from various developers working on GlassFish webtier</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=8uEA4dQi3RGq6caoTaoASA</link>
      <pubDate>Fri, 13 Nov 2009 17:24:56 -0800</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/GlassFish-webtier" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
         <title>IE, Memory Management, and You</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/T28bn3VTx1Q/ie-memory-management-and-you</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;In a &lt;a rel="nofollow" target="_blank" href="http://weblogs.java.net/blog/driscoll/archive/2009/10/19/request-aggregation-jsf-2-ajax"&gt;recent blog&lt;/a&gt;, commenters took me to task for a perceived IE 6 memory leak. It wasn't actually there (they were wrong), but in attempting to prove myself right, I found a couple of memory leaks under IE in JSF's Ajax support. Since I just spent a week learning how all this functioned, I thought I'd set it down so that others could learn from my efforts.
&lt;p&gt;
Now, none of the information that I'll present here is new - it's been discussed among Ajax programmers for at least the last 4 years. If you're a web guru, it's likely that you're not going to learn anything new here (thought I'd welcome any additional information and corrections). But at least a couple of the points I'll illustrate below are either poorly communicated or misunderstood. I'll include a number of links at the end of this article. There are also very significant differences between IE 8 (which mostly works), IE 7 (which is bad), and IE 6 (which is just awful). I'll try to point out the differences as they matter for each.
&lt;p&gt;
&lt;h3&gt;Tools&lt;/h3&gt;
First - use the right tool for the job: In order to spot leaks, you'll need to download a tool that can detect them. By all accounts, &lt;a rel="nofollow" target="_blank" href="http://home.orange.nl/jsrosman/"&gt;sIEve&lt;/a&gt; is the way to go. It uses IE itself, and introspects to get it's data. The UI is pretty primitive, but I can't recommend it enough - it's truely invaluable. Since it uses IE for it's work, you'll need to run it on a machine that has IE6 installed - presumably in a VM. You'll also want to have it running on a machine that has IE 7 and IE 8 as well, just to be sure. XP fits nicely on a VM that runs on my Mac, and this is how I use it.
&lt;p&gt;
&lt;h3&gt;Cyclic Leak&lt;/h3&gt;
Now that that's out of the way, it's time to talk about the very worst of the memory leaks in IE - the dreaded cyclic reference, which the commenters thought that I'd committed. Under certain conditions, IE 6 will "leak" DOM nodes, retaining them, and the javascript objects that point to them, until the browser is either shut down, or crashes entirely due to lack of memory. Ugh! To understand how this happens, you really only need to know two things:
&lt;ol&gt;
&lt;li&gt;IE 6 (and 7!) reportedly has very primitive garbage collection using reference counting&lt;/li&gt;
&lt;li&gt;There are two memory spaces in IE, one for JavaScript, and the other for the DOM, and they don't communicate well.&lt;/li&gt;
&lt;/ol&gt;
What could go wrong? Well, lots. The commenters thought that the rule was: A leak will occur if any reference is made in JavaScript to an element that isn't eventually set to null. That's close, but not quite correct. The real rule is: A leak will occur if the JavaScript code contains any reference to the DOM that isn't released in some way, either by going out of scope or being explicitly unset. &lt;p&gt;
When IE 6 sees a JavaScript variable that is pointing to something in the DOM (typically, an element or node), it will record that reference, and not collect it - even when you surf over to a new page. And the DOM won't be collected, since there's a reference to it from JavaScript. These two objects, and all the stuff that references them, will stick around until shutdown. In IE 7, the geniuses at Microsoft saw the bug, and said "Hey, I know how to fix that, let's garbage collect everything when we leave the page.". Nice improvement, but it still doesn't fix the bug, since if you're developing a page that is designed to be used for a long period of time (like many page-as-application apps are now), it'll still crash the browser. Apparently, they saw the error of their ways eventually, since this behavior is no longer present in IE8. (All this is confirmed by my testing with sIEve.)
&lt;p&gt;
So, in the example that had in my previous blog, there was no memory leak, because the variable that pointed to the element eventually went out of scope. So - how to you create variables that don't go out of scope? The easiest way is to put them in an object - this was the leak that I eventually found in JSF. The fix there was to null out the object manually. But there's another, more insidious way to create an object - create a closure. That creates a function object implicitly under the window object, and that will never go out of scope. But the key thing to remember is that you need to be aware of when things go out of scope when coding in IE, and act accordingly.
&lt;p&gt;
&lt;h3&gt;But wait! There's more&lt;/h3&gt;
If that was the only problem, life would have been fairly easy for me the last week. But that's not the only bug that the Web Wizards of Redmond chose to deliver to their unsuspecting consumers. There's another bug in IE (again, only in IE 6 and 7 - IE 8 appears to have fixed it per my testing), which also leaks DOM nodes that aren't cleaned up until you leave the page. Apparently, when the IE DOM receives a call from the removeChild or replaceChild functions, it doesn't actually, err, remove the nodes. It just leaves them there, hanging around the DOM like party guests that don't have the sense to leave after the host has started handing out coats. While these nodes will eventually be cleaned up when the user leaves the page, this still causes problems for page-as-app programs, as in the cyclic leak for IE 7, above. While the removeChild call is fairly notorious for this, I had to find out about replaceChild with my own testing (though I did find a few obscure references once I went looking for it). &lt;p&gt;
That means that instead of saying &lt;code&gt;node.parentNode.replaceChild(newNode, node)&lt;/code&gt;, you instead should say something like: &lt;code&gt;node.parentNode.insertBefore(newNode, node); deleteNode(node);&lt;/code&gt; (with an appropriate if statement for isIE(), and a deleteNode function that doesn't use removeChild). And instead of saying node.parentNode.removeChild(node); you instead are reduced to coding something like: node.outerHTML = ''; (again, with browser check). Except that when you combine that with IE's horrible problems with manipulating tables, it may fail. So instead, you're probably better off with something like this:
&lt;code&gt;
&lt;pre&gt; var temp = document.createElement('div'); try { temp.appendChild(node.parentNode.removeChild(node)); temp.innerHTML = ""; // Prevent leak in IE } catch (e) { // at least we tried } deleteNode(temp);
&lt;/pre&gt;
&lt;/code&gt;
Again, possibly with an isIE() check.
&lt;p&gt;
Hopefully you found this description of IE's Memory "Management" useful. Here's a few of the links that I used for research, that I found the most helpful.
&lt;ul&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://home.orange.nl/jsrosman/"&gt;sIEve - the tool you should already have.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://www.quirksmode.org/blog/archives/2005/10/memory_leaks_li.html"&gt;Quirks blog link roundup of memory leak info.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx"&gt;Microsoft MSDN article on the topic.&lt;/a&gt; Useful, even if it insultingly implies that it's your fault the browser is leaking.&lt;/li&gt;
&lt;/ul&gt; &lt;p&gt;
As always, I look forward to any comments. Especially about this topic - I'm far from expert in this area.</description>
         <guid isPermaLink="false">317866 at http://www.java.net</guid>
         <pubDate>Fri, 13 Nov 2009 12:59:01 -0800</pubDate>
      <feedburner:origLink>http://www.java.net/blog/driscoll/archive/2009/11/13/ie-memory-management-and-you</feedburner:origLink></item>
      <item>
         <title>TOTD #113: JavaFX front-end for GlassFish v3 Administration - Using REST interface</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/N8wwnygC1eg/totd_113_javafx_front_end</link>
         <description>&lt;p&gt;GlassFish v3 provides a REST interface to management and monitoring information as discussed in &lt;a rel="nofollow" target="_blank" href="http://blogs.sun.com/arungupta/entry/totd_96_glassfish_v3_rest"&gt;TOTD #96&lt;/a&gt;. As mentioned in that blog "the REST interface is a lower level API that enables toolkit developers and IT administrators to write their custom scripts/clients using language of their choice". This blog introduces a tool that uses the REST API to provide management and monitoring of GlassFish v3 and is written using &lt;a rel="nofollow" target="_blank" href="http://javafx.com"&gt;JavaFX&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This tool is only a proof-of-concept that demonstrates that GlassFish v3 REST interface is functionally very rich and can indeed be used to write third-party administration tools. The tool uses a subset of the REST interface and exposes only a limited amount of management and monitoring capabilities otherwise exposed. After all this is a proof-of-concept :-)&lt;/p&gt;
&lt;p&gt;A screencast of this tool in action along with a downloadable JNLP version will soon be available. For now, here is a snapshot of the main window of this tool:&lt;/p&gt;
&lt;p&gt;&lt;img height="545" border="1" style="margin:5px;" width="700" alt="" src="http://blog.arungupta.me/wp-content/uploads/2009/11/javafx-v3-admin-main-window.png"/&gt;&lt;/p&gt;
&lt;p&gt;The main screen allows you to enter a URL for the GlassFish administration. Then the GlassFish instance can be stopped/restarted from the main window using the buttons on top right. There is an animation at the bottom of the screen where the glassfish is swimming in the ocean and is directly related to the state of server running in the background. If the server is running, the animation works. If the server is not running then the animation stops as well.&lt;/p&gt;
&lt;p&gt;The main screen has three main buttons:&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;"List Applications" - list all the applications deployed on the running instance&lt;/li&gt; &lt;li&gt;"Show Monitoring Levels" - show/Update all the monitoring levels&lt;/li&gt; &lt;li&gt;"Server Stats" - show statistics of the running server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Clicking on "List Applications" shows the list of applications deployed on this particular instance. Here is how a snapshot looks like for an instance running on my localhost at port 4848:&lt;/p&gt;
&lt;p&gt;&lt;img height="292" border="1" width="497" style="margin:5px;" alt="" src="http://blog.arungupta.me/wp-content/uploads/2009/11/javafx-v3-admin-list-apps.png"/&gt;&lt;/p&gt;
&lt;p&gt;As shown in the screen, it shows a radio-bulleted list of all the applications. Each bullet is also accompanied by an image indicating the type of application - Web or Rails for now. Select the application and click on "Monitor" button to monitor that particular application. The REST API exposes a vast amount of monitoring data but a subset of monitoring data is displayed for Web and Rails application for now. Here is a snapshot of the monitoring data published for a Web application:&lt;/p&gt;
&lt;p&gt;&lt;img height="356" border="1" style="margin:5px;" width="464" alt="" src="http://blog.arungupta.me/wp-content/uploads/2009/11/javafx-v3-admin-monitoring-web-app.png"/&gt;&lt;/p&gt;
&lt;p&gt;As evident by the list of engines, this web application has EJBs bundled as well. It also shows total number of Servlets/JSPs loaded, number of requests made to this web application and some other monitoring data.&lt;/p&gt;
&lt;p&gt;Here is a snapshot of the monitoring data published for a Rails application:&lt;/p&gt;
&lt;p&gt;&lt;img height="452" border="1" style="margin:5px;" width="439" alt="" src="http://blog.arungupta.me/wp-content/uploads/2009/11/javafx-v3-admin-monitoring-rails-app.png"/&gt;&lt;/p&gt;
&lt;p&gt;It shows number of JRuby runtimes configured for the application, number of requests sent to the application, number of responses with different HTTP access codes and some other data.&lt;/p&gt;
&lt;p&gt;The monitoring levels of different containers can be easily updated by clicking on "Show Monitoring Levels" as shown below:&lt;/p&gt;
&lt;p&gt;&lt;img height="513" border="1" style="margin:5px;" width="431" alt="" src="http://blog.arungupta.me/wp-content/uploads/2009/11/javafx-v3-admin-monitoring-levels.png"/&gt;&lt;/p&gt;
&lt;p&gt;And finally some server statistics are shown by clicking on "Server Stats" as shown below:&lt;/p&gt;
&lt;p&gt;&lt;img height="495" border="1" style="margin:5px;" width="636" alt="" src="http://blog.arungupta.me/wp-content/uploads/2009/11/javafx-v3-admin-server-stats.png"/&gt;&lt;/p&gt;
&lt;p&gt;It shows when the server was started, host/port information, version and finally how long the server has been running for. The dials are an animation that shows the server up time.&lt;/p&gt;
&lt;p&gt;Here are other related JavaFX and GlassFish related blogs published earlier:&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://blogs.sun.com/arungupta/entry/totd_23_javafx_client_invoking"&gt;TOTD #23: JavaFX Client invoking a Metro endpoint&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://blogs.sun.com/arungupta/entry/javafx_1_0_launched_access"&gt;JavaFX 1.0 launched - access services hosted on embedded GlassFish&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How are you going to use the REST interface exposed by GlassFish v3 in your environment ?&lt;/p&gt;
&lt;p&gt;Are you using JavaFX with GlassFish together in any way ?&lt;/p&gt;
&lt;p&gt;Leave a comment on this blog if you do!&lt;/p&gt;
&lt;p&gt;&lt;small&gt;Technorati: &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tags/javafx"&gt;javafx&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tags/glassfish"&gt;glassfish&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tags/v3"&gt;v3&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tags/rest"&gt;rest&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tags/web"&gt;web&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tags/jruby"&gt;jruby&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tags/rubyonrails"&gt;rubyonrails&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tags/rest"&gt;rest&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tags/administration"&gt;administration&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tags/monitoring"&gt;monitoring&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tags/management"&gt;management&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;</description>
         <author>arungupta</author>
         <guid isPermaLink="false">http://blogs.sun.com/arungupta/entry/totd_113_javafx_front_end</guid>
         <pubDate>Tue, 10 Nov 2009 20:15:33 -0800</pubDate>
      <feedburner:origLink>http://blogs.sun.com/arungupta/entry/totd_113_javafx_front_end</feedburner:origLink></item>
      <item>
         <title>Servlet 3.0 Asynchronous API or Atmosphere? Easy decision!</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/ImNTWwaCfIE/servlet-30-async-or-atmosphere-you-decide</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;img border="0" align="left"/&gt;&lt;p&gt;One the comment I'm getting about &lt;a rel="nofollow" target="_blank" href="http://atmosphere.dev.java.net"&gt;Atmosphere&lt;/a&gt; is why should I use the framework instead of waiting for Servlet 3.0 Async API. Well, it simple: &lt;strong&gt;much simpler, works with any existing Java WebServer (including Google App Engine!), and will auto-detect the Servlet 3.0 Async API if you deploy your application on a WebServer that support it.&lt;/strong&gt;&lt;/p&gt;
&lt;img alt="IMG_0159.JPG" src="http://weblogs.java.net/sites/default/files/100_0159.jpg" width="640" height="400"/&gt;
&lt;p&gt;To make a fair comparison, let's write the hello world of Comet, a Chat application and compare the server side code. Without technical details, let's just drop the entire server code. First, the Servlet 3.0 version (can probably be optimized a little):&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt; 1 package web.servlet.async_request_war; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.util.Queue; 6 import java.util.concurrent.ConcurrentLinkedQueue; 7 import java.util.concurrent.BlockingQueue; 8 import java.util.concurrent.LinkedBlockingQueue; 9 10 import javax.servlet.AsyncContext; 11 import javax.servlet.AsyncEvent; 12 import javax.servlet.AsyncListener; 13 import javax.servlet.ServletConfig; 14 import javax.servlet.ServletException; 15 import javax.servlet.annotation.WebServlet; 16 import javax.servlet.http.HttpServlet; 17 import javax.servlet.http.HttpServletRequest; 18 import javax.servlet.http.HttpServletResponse; 19 20 @WebServlet(urlPatterns = {"/chat"}, asyncSupported = true) 21 public class AjaxCometServlet extends HttpServlet { 22 23 private static final Queue&amp;lt;AsyncContext&amp;gt; queue = new ConcurrentLinkedQueue&amp;lt;AsyncContext&amp;gt;(); 24 private static final BlockingQueue&amp;lt;String&amp;gt; messageQueue = new LinkedBlockingQueue&amp;lt;String&amp;gt;(); 25 private static final String BEGIN_SCRIPT_TAG = "&amp;lt;script type='text/javascript'&amp;gt;&amp;#92;n"; 26 private static final String END_SCRIPT_TAG = "&amp;lt;/script&amp;gt;&amp;#92;n"; 27 private static final long serialVersionUID = -2919167206889576860L; 28 29 private Thread notifierThread = null; 30 31 @Override 32 public void init(ServletConfig config) throws ServletException { 33 Runnable notifierRunnable = new Runnable() { 34 public void run() { 35 boolean done = false; 36 while (!done) { 37 String cMessage = null; 38 try { 39 cMessage = messageQueue.take(); 40 for (AsyncContext ac : queue) { 41 try { 42 PrintWriter acWriter = ac.getResponse().getWriter(); 43 acWriter.println(cMessage); 44 acWriter.flush(); 45 } catch(IOException ex) { 46 System.out.println(ex); 47 queue.remove(ac); 48 } 49 } 50 } catch(InterruptedException iex) { 51 done = true; 52 System.out.println(iex); 53 } 54 } 55 } 56 }; 57 notifierThread = new Thread(notifierRunnable); 58 notifierThread.start(); 59 } 60 61 @Override 62 protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { 63 res.setContentType("text/html"); 64 res.setHeader("Cache-Control", "private"); 65 res.setHeader("Pragma", "no-cache"); 66 67 PrintWriter writer = res.getWriter(); 68 // for IE 69 writer.println("&amp;lt;!-- Comet is a programming technique that enables web servers to send data to the client without having any need for the client to request it. --&amp;gt;&amp;#92; n"); 70 writer.flush(); 71 72 req.setAsyncTimeout(10 * 60 * 1000); &lt;strong&gt;73 final AsyncContext ac = req.startAsync();&lt;/strong&gt; 74 queue.add(ac); 75 req.addAsyncListener(new AsyncListener() { 76 public void onComplete(AsyncEvent event) throws IOException { 77 queue.remove(ac); 78 } 79 80 public void onTimeout(AsyncEvent event) throws IOException { 81 queue.remove(ac); 82 } 83 }); 84 } 85 86 @Override 87 @SuppressWarnings("unchecked") 88 protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { 89 res.setContentType("text/plain"); 90 res.setHeader("Cache-Control", "private"); 91 res.setHeader("Pragma", "no-cache"); 92 93 req.setCharacterEncoding("UTF-8"); 94 String action = req.getParameter("action"); 95 String name = req.getParameter("name"); 96 97 if ("login".equals(action)) { 98 String cMessage = BEGIN_SCRIPT_TAG + toJsonp("System Message", name + " has joined.") + END_SCRIPT_TAG; 99 notify(cMessage);
100 101 res.getWriter().println("success");
102 } else if ("post".equals(action)) {
103 String message = req.getParameter("message");
104 String cMessage = BEGIN_SCRIPT_TAG + toJsonp(name, message) + END_SCRIPT_TAG;
105 notify(cMessage);
106 107 res.getWriter().println("success");
108 } else {
109 res.sendError(422, "Unprocessable Entity");
110 }
111 }
112 113 @Override
114 public void destroy() {
115 queue.clear();
116 notifierThread.interrupt();
117 }
118 119 private void notify(String cMessage) throws IOException {
120 try {
121 messageQueue.put(cMessage);
122 } catch(Exception ex) {
123 throw new IOException(ex);
124 }
125 }
126 127 private String escape(String orig) {
128 StringBuffer buffer = new StringBuffer(orig.length());
129 130 for (int i = 0; i &amp;lt; orig.length(); i++) {
131 char c = orig.charAt(i);
132 switch (c) {
133 case '&amp;#92;b':
134 buffer.append("&amp;#92;&amp;#92;b");
135 break;
136 case '&amp;#92;f':
137 buffer.append("&amp;#92;&amp;#92;f");
138 break;
139 case '&amp;#92;n':
140 buffer.append("&amp;lt;br /&amp;gt;");
141 break;
142 case '&amp;#92;r':
143 // ignore
144 break;
145 case '&amp;#92;t':
146 buffer.append("&amp;#92;&amp;#92;t");
147 break;
148 case '&amp;#92;'':
149 buffer.append("&amp;#92;&amp;#92;'");
150 break;
151 case '&amp;#92;"':
152 buffer.append("&amp;#92;&amp;#92;&amp;#92;"");
153 break;
154 case '&amp;#92;&amp;#92;':
155 buffer.append("&amp;#92;&amp;#92;&amp;#92;&amp;#92;");
156 break;
157 case '&amp;lt;':
158 buffer.append("&amp;lt;");
159 break;
160 case '&amp;gt;':
161 buffer.append("&amp;gt;");
162 break;
163 case '&amp;':
164 buffer.append("&amp;");
165 break;
166 default:
167 buffer.append(c);
168 }
169 }
170 171 return buffer.toString();
172 }
173 174 private String toJsonp(String name, String message) {
175 return "window.parent.app.update({ name: &amp;#92;"" + escape(name) + "&amp;#92;", message: &amp;#92;"" + escape(message) + "&amp;#92;" });&amp;#92;n";
176 }
177 }&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;OK now with &lt;a rel="nofollow" target="_blank" href="http://atmosphere.dev.java.net"&gt;Atmosphere&lt;/a&gt; , the same code consist of:&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt; 1 package org.atmosphere.samples.chat.resources; 2 3 import javax.ws.rs.Consumes; 4 import javax.ws.rs.GET; 5 import javax.ws.rs.POST; 6 import javax.ws.rs.Path; 7 import javax.ws.rs.Produces; 8 import javax.ws.rs.WebApplicationException; 9 import javax.ws.rs.core.MultivaluedMap; 10 import org.atmosphere.annotation.Broadcast; 11 import org.atmosphere.annotation.Schedule; 12 import org.atmosphere.annotation.Suspend; 13 import org.atmosphere.util.XSSHtmlFilter; 14 15 @Path("/") 16 public class ResourceChat { 17 &lt;strong&gt; 18 @Suspend&lt;/strong&gt; 19 @GET 20 @Produces("text/html;charset=ISO-8859-1") 21 public String suspend() { 22 return ""; 23 } 24 &lt;strong&gt; 25 @Broadcast({XSSHtmlFilter.class, JsonpFilter.class})&lt;/strong&gt; 26 @Consumes("application/x-www-form-urlencoded") 27 @POST 28 @Produces("text/html;charset=ISO-8859-1") 29 public String publishMessage(MultivaluedMap form) { 30 String action = form.getFirst("action"); 31 String name = form.getFirst("name"); 32 33 if ("login".equals(action)) { 34 return ("System Message" + "__" + name + " has joined."); 35 } else if ("post".equals(action)) { 36 return name + "__" + form.getFirst("message"); 37 } else { 38 throw new WebApplicationException(422); 39 } 40 } 41 }&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;OK so what's the deal? What's makes Atmosphere so easy? The Servlet 3.0 new Async API offers:&lt;ul&gt;&lt;li&gt; Method to suspend a response, HttpServletRequest.startAsync()&lt;/li&gt;&lt;li&gt;Method to resume a response: AsyncContext.complete()&lt;/li&gt;&lt;/ul&gt;Atmosphere offers:&lt;ul&gt;&lt;li&gt;Annotation to suspend: @Suspend&lt;/li&gt;&lt;li&gt;Annotation or resume: @Resume&lt;/li&gt;&lt;li&gt;Annotation to broadcast (or push) events to the set of suspended responses: @Broadcast&lt;/li&gt;&lt;li&gt;Annotation to filter and serialize broadcasted events using BroadcasterFilter (XSSHtmlFilter.class, JsonpFilter.class)&lt;/li&gt;&lt;li&gt;Build it support for all browser implementation incompatible implementation (ex: no need to output comments like in the Servlet 3.0 sample (line 69)). Atmosphere will workaround all those issues for you.&lt;/li&gt;&lt;/ul&gt; With Servlet 3.0 Async API, the missing part is how you share information with suspended responses. In the current chat sample, you need to creates your own Thread/Queue in order to broadcast events to your set of suspended responses (line 32 to 56). This is not a big deal, but you will need to do something like that for all your Servlet 3.0 Async based applications...or use a Framework that do it for you!.&lt;/p&gt;&lt;p&gt;Still not convinced? Well, you can write your Atmosphere applications today and not have to wait for Servlet.3.0 implementation (OK easy plug for my other project: &lt;a rel="nofollow" target="_blank" href="http://glassfish.dev.java.net"&gt;GlassFish v3&lt;/a&gt; supports it pretty well!). Why? Atmosphere always auto-detected the best asynchronous API when you deploy your application. It always try first to look up the 3.0 Async API. If it fails, it will try to find WebServer's native API like Grizzly Comet (GlassFish), CometProcessor (Tomcat), Continuation (Jetty), HttpEventServlet (JBossWeb), AsyncServlet (WebLogic), Google App Engine (Google). Finally, it will fallback to use a blocking I/O Thread to emulate support for asynchronous events.&lt;/p&gt;&lt;p&gt;But you don't want to use Java? Fine, try the &lt;a rel="nofollow" target="_blank" href="http://grails.org/plugin/atmosphere"&gt;Atmosphere Grails Plug In&lt;/a&gt;, or Atmosphere in &lt;a rel="nofollow" target="_blank" href="http://primefaces.prime.com.tr/en/"&gt;PrimesFaces&lt;/a&gt; if you like JSF, or use Scala:&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt; 1 package org.atmosphere.samples.scala.chat 2 3 import javax.ws.rs.{GET, POST, Path, Produces, WebApplicationException, Consumes} 4 import javax.ws.rs.core.MultivaluedMap 5 import org.atmosphere.annotation.{Broadcast, Suspend} 6 import org.atmosphere.util.XSSHtmlFilter 7 8 @Path("/chat") 9 class Chat { 10 11 @Suspend 12 @GET 13 @Produces(Array("text/html;charset=ISO-8859-1")) 14 def suspend() = { 15 "" 16 } 17 18 @Broadcast(Array(classOf[XSSHtmlFilter],classOf[JsonpFilter])) 19 @Consumes(Array("application/x-www-form-urlencoded")) 20 @POST 21 @Produces(Array("text/html;charset=ISO-8859-1")) 22 def publishMessage(form: MultivaluedMap[String, String]) = { 23 val action = form.getFirst("action") 24 val name = form.getFirst("name") 25 26 val result: String = if ("login".equals(action)) "System Message" + "__" + name + " has joined." 27 else if ("post".equals(action)) name + "__" + form.getFirst("message") 28 else throw new WebApplicationException(422) 29 30 result 31 } 32 33 34 }&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;Echec et Mat!&lt;p&gt;&lt;p&gt;Now, I can understand you already have an existing application and just want to update it with suspend/resume/broadcast functionality, without having to re-write it completely. Fine, let's just use the Atmosphere's &lt;a rel="nofollow" target="_blank" href="http://is.gd/4P29o"&gt;Meteor API&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt; 1 package org.atmosphere.samples.chat; 2 3 import java.io.IOException; 4 import java.util.LinkedList; 5 import java.util.List; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 import org.atmosphere.cpr.BroadcastFilter; 10 import org.atmosphere.cpr.Meteor; 11 import org.atmosphere.util.XSSHtmlFilter; 12 13 public class MeteorChat extends HttpServlet { 14 15 private final List list; 16 17 public MeteorChat() { 18 list = new LinkedList (); 19 list.add(new XSSHtmlFilter()); 20 list.add(new JsonpFilter()); 21 } 22 23 @Override 24 public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
&lt;strong&gt; 25 Meteor m = Meteor.build(req, list, null);&lt;/strong&gt; 26 27 req.getSession().setAttribute("meteor", m); 28 29 res.setContentType("text/html;charset=ISO-8859-1"); 30 res.addHeader("Cache-Control", "private"); 31 res.addHeader("Pragma", "no-cache"); 32 &lt;strong&gt; 33 m.suspend(-1);&lt;/strong&gt; 34 m.broadcast(req.getServerName() + "__has suspended a connection from " + req.getRemoteAddr()); 35 } 36 37 public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException {
&lt;strong&gt; 38 Meteor m = (Meteor)req.getSession().getAttribute("meteor");&lt;/strong&gt; 39 res.setCharacterEncoding("UTF-8"); 40 String action = req.getParameterValues("action")[0]; 41 String name = req.getParameterValues("name")[0]; 42 43 if ("login".equals(action)) { 44 req.getSession().setAttribute("name", name); 45 m.broadcast("System Message from " + req.getServerName() + "__" + name + " has joined."); 46 res.getWriter().write("success"); 47 res.getWriter().flush(); 48 } else if ("post".equals(action)) { 49 String message = req.getParameterValues("message")[0]; 50 m.broadcast(name + "__" + message); 51 res.getWriter().write("success"); 52 res.getWriter().flush(); 53 } else { 54 res.setStatus(422); 55 56 res.getWriter().write("success"); 57 res.getWriter().flush(); 58 } 59 } 60 }&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;Servlet 3.0 Async API is Game Over! Finally I must admit that Servlet 3.0 Async API have asynchronous dispatcher you can use to forward request asynchronously:&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt; public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { final AsyncContext ac = req.startAsync(); final String target = req.getParameter("target"); Timer asyncTimer = new Timer("AsyncTimer", true); asyncTimer.schedule( new TimerTask() { @Override public void run() { ac.dispatch(target); } }, 5000); }&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;With Atmosphere, the same code will works but your application will only works when deployed on Servlet 3.0 WebServer. Instead, you can implement the same functionality using &lt;a rel="nofollow" target="_blank" href="https://atmosphere.dev.java.net/nonav/apidocs/org/atmosphere/cpr/Broadcaster.html#delayBroadcast(java.lang.Object,%20long,%20java.util.concurrent.TimeUnit)"&gt;Broadcast's delayed broadcast API&lt;/a&gt; and still have a portable application without limiting you with Servlet 3.0 Async API...that's something I will talk in my next blog!&lt;/p&gt;&lt;p&gt;For any questions or to download Atmosphere, go to &lt;a rel="nofollow" target="_blank" href="http://atmosphere.dev.java.net"&gt;our main site&lt;/a&gt; and use our &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/Atmosphere-users-mailling-list-f2493822.html"&gt;Nabble forum&lt;/a&gt; (no subscription needed) or &lt;a rel="nofollow" target="_blank" href="http://twitter.com/atmosphere_java"&gt;follow us on Twitter&lt;/a&gt; and tweet your questions there!&lt;/p&gt;&lt;p&gt;
 
 
technorati: &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/atmosphere+framework"&gt;atmosphere framework&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/rest"&gt;rest&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/comet"&gt;comet&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/jersey"&gt;jersey&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/ajax+push"&gt;ajax push&lt;/a&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">311597 at http://www.java.net</guid>
         <pubDate>Fri, 06 Nov 2009 09:38:21 -0800</pubDate>
      <feedburner:origLink>http://www.java.net/blog/jfarcand/archive/2009/11/06/servlet-30-async-or-atmosphere-you-decide</feedburner:origLink></item>
      <item>
         <title>New Hpricot Release</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/hQGI7V_SnK0/new-hpricot-release</link>
         <description>&lt;p&gt;It&amp;#8217;s with a modicum of fanfare and a cocktail of orange peel, maraschino, bitters, bourbon and vermouth that I announce the 0&amp;#46;8&amp;#46;2 release of Hpricot&amp;#46;&lt;/p&gt; &lt;p&gt;&lt;img src="http://hpricot.github.com/hpricot/images/hpricot.png" alt="hpricot"/&gt;&lt;/p&gt; &lt;div style="clear:both;"&gt;&lt;/div&gt; &lt;p&gt;The angly thingies are just two martini glasses turned on their side, see? Pouring out hpricoty goodness for you&amp;#46; (I don&amp;#8217;t know if &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Why_the_lucky_stiff"&gt;_why&lt;/a&gt; imbibed alcoholic beverages but I feel the desire to raise a glass to him&amp;#46;)&lt;/p&gt; &lt;p&gt;This release is mostly a refresh; the previous release was way back in April&amp;#46; From the &lt;a rel="nofollow" target="_blank" href="http://github.com/hpricot/hpricot/commits/master/"&gt;Git logs&lt;/a&gt; I can see that there were a few bug fixes since then&amp;#46; Otherwise, the main addition is a modern JRuby release, thanks to &lt;a rel="nofollow" target="_blank" href="http://olabini.com/"&gt;Ola Bini&lt;/a&gt;&amp;#46; (the previous was the 0&amp;#46;6 series)&amp;#46; This does &lt;a rel="nofollow" target="_blank" href="http://jira.codehaus.org/browse/JRUBY-3732"&gt;fix a fairly old, popular JRuby bug&lt;/a&gt;&amp;#46;&lt;/p&gt; &lt;p&gt;As for the future of Hpricot, it&amp;#8217;s up to you&amp;#46; I know it&amp;#8217;s still a trusty tool for many; I have no grand plans to change it&amp;#46; So if you encounter bugs and want to send patches, I&amp;#8217;m happy to serve as your curator&amp;#46;&lt;/p&gt;</description>
         <author>Nick Sieger</author>
         <guid isPermaLink="false">urn:uuid:93e42dac-f363-41aa-bd63-24e5186d6a3b</guid>
         <pubDate>Fri, 06 Nov 2009 08:06:37 -0800</pubDate>
      <feedburner:origLink>http://blog.nicksieger.com/articles/2009/11/06/new-hpricot-release</feedburner:origLink></item>
      <item>
         <title>See you in Europe in November</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/3dJPpXgFtbA/see-you-eu-november</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;img border="0" align="left"/&gt;&lt;p&gt;I'm will be leaving Québec next week for talks at JFall, Paris JUG, Prague JUG and Devoxx. The talks will focus on &lt;a rel="nofollow"&gt;Atmosphere&lt;/a&gt; and it's spin off (&lt;a rel="nofollow" target="_blank" href="http://grails.org/plugin/atmosphere"&gt;Grail Plug In&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://wiki.github.com/jboner/akka"&gt;Akka&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://primefaces.prime.com.tr/en/"&gt;PrimesFaces&lt;/a&gt;) and a little bit of Grizzly's work-in-progress Servlet Container.&lt;/p&gt;
&lt;img alt="IMG_0171.JPG" src="http://weblogs.java.net/sites/default/files/IMG_0171.jpg" width="640" height="400"/&gt;
&lt;p&gt;First, I will stop by Amsterdam November 11 and talk about &lt;a rel="nofollow" target="_blank" href="http://www.nljug.org/pages/events/content/jfall_2009/sessions/00007/"&gt;Atmosphere&lt;/a&gt; at &lt;a rel="nofollow" target="_blank" href="http://www.nljug.org/pages/events/content/jfall_2009/"&gt;JFall 2009&lt;/a&gt;. Next I will stop by &lt;a rel="nofollow" target="_blank" href="http://www.parisjug.org/xwiki/bin/view/Meeting/20091112"&gt;Paris JUG&lt;/a&gt; November 12 for an al-in-French talk on Atmosphere (I means pure French from Québec). Then on November 16 I will talk about Atmosphere at the &lt;a rel="nofollow" target="_blank" href="http://java.cz/article/czjug"&gt;Prague JUG&lt;/a&gt;. Finally I will be in Anwerp for Devoxx 2009, presenting &lt;a rel="nofollow" target="_blank" href="http://www.devoxx.com/display/DV09/Writing+Asynchronous+Web+application+%28Comet%29+using+the+Atmosphere+Framework"&gt;Atmosphere&lt;/a&gt; and our new &lt;a rel="nofollow" target="_blank" href="http://www.devoxx.com/display/DV09/Grizzly+Servlet+Container"&gt;Grizzly Servlet Container&lt;/a&gt; which support new OSGi Http Service spec.&lt;/p&gt;
&lt;p&gt;See you in EU!&lt;/p&gt;
&lt;p&gt;
 
 
technorati: &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/atmosphere+framework"&gt;atmosphere framework&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/ajax+push"&gt;ajax push&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/comet"&gt;comet&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/jersey"&gt;jersey&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/grizzly"&gt;grizzly&lt;/a&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">309302 at http://www.java.net</guid>
         <pubDate>Wed, 04 Nov 2009 09:58:03 -0800</pubDate>
      <feedburner:origLink>http://www.java.net/blog/jfarcand/archive/2009/11/04/see-you-eu-november</feedburner:origLink></item>
      <item>
         <title>Leaving Sun</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/juEWdnGY2rA/leaving-sun.html</link>
         <description>I've always regarded working full time on Jython at Sun as a miraculous sabbatical that might come to an end at any moment. Sadly that time has come. I've worked with many amazing people and had a great time: Sun provided me with one of the greatest professional experiences I have had, for which I will always be grateful.&lt;br /&gt;&lt;br /&gt;I'm very pleased with how far Jython has come during my tenure at Sun. Jython is now a modern version of Python, and has the momentum to continue its growth. A far larger group of developers than ever before contribute regularly, making Jython a very healthy project. Jython runs many more of the key frameworks and applications that are popular in the Python world. In the future we will be making Jython better, faster, and more complete. I started working on Jython long before I joined Sun, and I certainly plan be a part of Jython's future.&lt;br /&gt;&lt;br /&gt;I am looking for a new opportunity, and am open to many possibilities. I have been working in software for more than twelve years, often in a lead role. I am well regarded in the Open Source world, where I have participated in and helped build communities. I have been the Jython project lead for almost five years. I am a committer on the Python project, and a member of the Python Software Foundation. I have done a wide variety of work in recent history: development and leadership work in Java and Python, from the abstract level of parsing Python source and compiling to Java bytecodes, to the more concrete work of web development. I am able to do work in any of these areas, on either a full time or consulting/contracting basis. My contact information can be found on my &lt;a rel="nofollow" target="_blank" href="http://www.google.com/profiles/fwierzbicki"&gt;Google profile&lt;/a&gt; and my &lt;a rel="nofollow" target="_blank" href="http://www.linkedin.com/pub/frank-wierzbicki/3/559/380"&gt;LinkedIn profile&lt;/a&gt; is a good summary of my credentials.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14276139-4967987248813478165?l=fwierzbicki.blogspot.com'/&gt;&lt;/div&gt;</description>
         <author>Frank Wierzbicki</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-14276139.post-4967987248813478165</guid>
         <pubDate>Wed, 04 Nov 2009 06:05:00 -0800</pubDate>
      <feedburner:origLink>http://fwierzbicki.blogspot.com/2009/11/leaving-sun.html</feedburner:origLink></item>
      <item>
         <title>Writing a RESTful and Comet based PubSub application using Atmosphere in less than 10 lines</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/Nl-aNwaJ9GI/writing-restful-and-comet-based-pubsub-application-using-atmosphere</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;img border="0" align="left"/&gt;&lt;p&gt;Writing a &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Publish/subscribe"&gt;publisher/subscriber (PubSub)&lt;/a&gt; is quite simple with &lt;a rel="nofollow" target="_blank" href="http://atmosphere.dev.java.net"&gt;Atmosphere &lt;/a&gt;using the atmosphere-&lt;a rel="nofollow" target="_blank" href="http://jersey.dev.java.net"&gt;jersey&lt;/a&gt; module.&lt;/p&gt;&lt;img alt="Boo" src="http://weblogs.java.net/sites/default/files/IMG_0154.jpg" width="640" height="400"/&gt;&lt;p&gt; The main idea here is to use Comet for suspending the response when a client subscribe to a topic, and use REST for publishing messages to the those suspended responses. First, let&amp;rsquo;s bind our application to the root uri using the @path annotation&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package org.atmosphere.samples.pubsub;&lt;br /&gt;&lt;br /&gt;import javax.ws.rs.GET;&lt;br /&gt;import javax.ws.rs.Path;&lt;br /&gt;import javax.ws.rs.PathParam;&lt;br /&gt;import javax.ws.rs.Produces;&lt;br /&gt;import org.atmosphere.annotation.Broadcast;&lt;br /&gt;import org.atmosphere.annotation.Schedule;&lt;br /&gt;import org.atmosphere.annotation.Suspend;&lt;br /&gt;import org.atmosphere.cpr.Broadcaster;&lt;br /&gt;import org.atmosphere.jersey.Broadcastable;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;@Path("/")&lt;/strong&gt; public class PubSub {&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Next, let&amp;rsquo;s implement the subscribe operation by using the &lt;a rel="nofollow" target="_blank" href="https://atmosphere.dev.java.net/nonav/apidocs/org/atmosphere/annotation/Suspend.html"&gt;@Suspend&lt;/a&gt; and inject our Atmosphere&amp;rsquo;s &lt;a rel="nofollow" target="_blank" href="https://atmosphere.dev.java.net/nonav/apidocs/org/atmosphere/cpr/Broadcaster.html"&gt;Broadcaster&lt;/a&gt; using the @PathParam annotation:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; &lt;strong&gt;@Suspend&lt;/strong&gt;&lt;br /&gt; @GET&lt;br /&gt; @Path("/{topic}")&lt;br /&gt; @Produces("text/plain;charset=ISO-8859-1")&lt;br /&gt; public Broadcastable subscribe(&lt;strong&gt;@PathParam("topic") Broadcaster topic&lt;/strong&gt;) {&lt;br /&gt; return new Broadcastable("",topic);&lt;br /&gt; }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The code above will be invoked when we want to create a new topic (@Path("/{topic}"), we will return a &lt;a rel="nofollow" target="_blank" href="https://atmosphere.dev.java.net/nonav/apidocs/org/atmosphere/jersey/Broadcastable.html"&gt;Broadcastable&lt;/a&gt; instance which will tell Atmosphere to use the passed Broadcaster, who got injected using the @PathParam, when broadcasting {topic}. Finally, the underlying response will be suspended forever via @Suspend annotation. Next, let&amp;rsquo;s implement the publish operation:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; @GET&lt;br /&gt; @Path("/{topic}/{message}")&lt;br /&gt; @Produces("text/plain;charset=ISO-8859-1")&lt;br /&gt; &lt;strong&gt;@Broadcast&lt;/strong&gt;&lt;br /&gt; public Broadcastable publish(&lt;strong&gt;@PathParam("topic") Broadcaster topic,&lt;/strong&gt;&lt;br /&gt; @PathParam("message") String message){&lt;br /&gt;&lt;br /&gt; return new Broadcastable(message,topic);&lt;br /&gt; }&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;To publish, we just need to send a uri that takes the form of "/{topic}/{message}" as defined by @Path("/{topic}/{message}") and again, the Broadcaster we want to use to broadcast messagse will be injected based on the {topic} value. Finally, we just return a Broadcastable object and let Atmosphere broadcast the value to all suspended connections. That&amp;rsquo;s it! Now we can see it in action by doing:&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;strong&gt;Create a topic&lt;/strong&gt;
curl &lt;a rel="nofollow" target="_blank" href="http://localhost:8080/atmosphere-pubsub/myAtmosphereTopic" title="http://localhost:8080/atmosphere-pubsub/myAtmosphereTopic"&gt;http://localhost:8080/atmosphere-pubsub/myAtmosphereTopic&lt;/a&gt;
&lt;strong&gt;Publish to that topic&lt;/strong&gt;
curl http://localhost:8080/atmosphere-pubsub/myAtmosphereTopic/Atmosphere_is_cool&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;The source for the entire sample can be &lt;a rel="nofollow" target="_blank" href="https://atmosphere.dev.java.net/nonav/xref/org/atmosphere/samples/pubsub/PubSub.html#37"&gt;viewed here&lt;/a&gt;. Really simple, is it?&lt;/p&gt; &lt;p&gt;For any questions or to download Atmosphere, go to &lt;a rel="nofollow" target="_blank" href="http://atmosphere.dev.java.net"&gt;our main site&lt;/a&gt; and use our &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/Atmosphere-users-mailling-list-f2493822.html"&gt;Nabble forum&lt;/a&gt; (no subscription needed) or &lt;a rel="nofollow" target="_blank" href="http://twitter.com/atmosphere_java"&gt;follow us on Twitter&lt;/a&gt; and tweet your questions there!&lt;/p&gt;&lt;p&gt;
 
 
technorati: &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/atmosphere+framework"&gt;atmosphere framework&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/rest"&gt;rest&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/comet"&gt;comet&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/jersey"&gt;jersey&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/ajax+push"&gt;ajax push&lt;/a&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">308399 at http://www.java.net</guid>
         <pubDate>Tue, 03 Nov 2009 12:58:48 -0800</pubDate>
      <feedburner:origLink>http://www.java.net/blog/jfarcand/archive/2009/11/03/writing-restful-and-comet-based-pubsub-application-using-atmosphere</feedburner:origLink></item>
      <item>
         <title>Missed RubyConf? Attend Qcon's Ruby Track!</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/6y5r4MFqDRY/missed-rubyconf-attend-qcons-ruby-track.html</link>
         <description>This year, RubyConf reportedly reduced their attendee cap to 250 people (&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;Update:&lt;/span&gt;&lt;/span&gt; actually 450 people), after hosting a 500 to 600-person conference last year. As you can imagine, this meant a lot of people that wanted to attend were not able to get tickets. To complicate matters, the RubyConf registration site happened to go live during the middle of the night EU time, and by the time most Europeans woke up it was already sold out. &lt;span style="font-weight:bold;"&gt;What's a Rubyist to do?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well there's another option. Working with Ryan Slobojan of InfoQ and the organizers of Qcon San Francisco,&lt;span style="font-weight:bold;"&gt; I'll be hosting a one-day Ruby track the day before RubyConf!&lt;/span&gt; Qcon's main conference runs Wednesday through Friday, with my track on &lt;span style="font-weight:bold;"&gt;Wednesday, November 18th&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;And now the REALLY good news! Because we wanted this to be a fallback for folks that could not attend RubyConf, we realized that the full conference fee was simply too high (ranging from $1500 up). So to make it possible for people to attend just the one day Ruby track, you can register with the code "rubywednesday" to get a drastically reduced &lt;span style="font-weight:bold;"&gt;$350 one-day conference pass&lt;/span&gt;. And to sweeten the deal even more, you can pop over to other tracks and attend the keynotes that day. Yes Virginia, there is a Santa Claus!&lt;br /&gt;&lt;br /&gt;Those of you attending RubyConf are also welcome to attend this one-day track as well; most of the presentations won't overlap. &lt;span style="font-weight:bold;"&gt;&lt;a rel="nofollow" target="_blank" href="http://qconsf.com/sf2009/tracks/show_track.jsp?trackOID=318"&gt;Here's the lineup&lt;/a&gt;&lt;/span&gt;, including a special opening presentation by Yukihiro Matsumoto himself!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;10:20 - "The Many Facets of Ruby" track opening by me&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;Ruby has seen a dramatic growth in popularity over the last few years, and there are now many facets to the Ruby story - multiple implementations, game-changing web frameworks, and large-scale use in enterprise solutions. Join us as we explore many aspects of Ruby in today's world.&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;10:30 - "Why we love Ruby?" by Yukihiro Matsumoto&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;Why we love Ruby? I have asked myself this question repeatedly. In this presentation, I will disclose my answer as of 2009. The keyword is QWAN.&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;11:45 - "Basking in the Limelight" by Paul Pagel&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;Limelight is Ruby on the desktop. Build applications with multiple windows, or just one window. Take control of the desktop, or play nicely with the desktop. Create fun animated games, or productive business apps. Develop rich internet applications, or unwired apps to make you rich. Publish your apps on the internet, or keep them for you and your friends. Do all this, writing nothing but Ruby code, in Limelight.&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;13:45 - "You've Got Java in my Ruby" by Thomas Enebo&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;JRuby is now well-established as a popular alternative implementation of Ruby.But why would you want to use it? How can it help you? This talk will detail some of the more interesting differences and advantages of using JRuby. Expect to get a better understanding of how Java makes a faster and more stable Ruby as well as how you can leverage Java features as an extra set of tools for your project.&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;15:00 - "Rails 3" by Yehuda Katz&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;I don't have a full abstract for this, but it's what you might expect...an overview of why Rails 3 is really "growing up" the framework, making it more clearly componentized and easier to adapt to more complicated (dare I say "enterprise") applications in the future. In working with Yehuda I know he's also paid special attention to performance.. Rails 3 is going to be excellent.&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;16:30 - "Rails in the Large: How Agility Allows Us to Build One of the World's Biggest Rails Apps" by Neal Ford&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;While others have been debating whether Rails can scale to enterprise levels, we've been demonstrating it. ThoughtWorks is running one of the largest Rails projects in the world, for an Enterprise. This session discusses tactics, techniques, best practices, and other things we've learned from scaling rails development. I discuss infrastructure, testing, messaging, optimization, performance, and the results of lots of lessons learned, including killer rock-scissors-paper tricks to help you avoid babysitting the view tests!&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I think it's going to an outstanding track, and I'd probably pay the $350 just to see Matz speak if I knew I wouldn't get another chance for a long time. &lt;span style="font-weight:bold;"&gt;Limelight&lt;/span&gt; looks like an outstanding way to build&lt;span style="font-weight:bold;"&gt; rich client apps&lt;/span&gt; using JRuby, and of course you know I like JRuby. Tom will show some of the latest advancements we've done in JRuby, including the ability to produce &lt;span style="font-weight:bold;"&gt;"real" Java classes&lt;/span&gt; at runtime for integrating with Java frameworks better. &lt;span style="font-weight:bold;"&gt;Rails 3&lt;/span&gt; I've described above, but you really have to see Yehuda present it himself. And of course everyone would like to know how to &lt;span style="font-weight:bold;"&gt;scale Rails to the moon&lt;/span&gt;...Neal knows his stuff.&lt;br /&gt;&lt;br /&gt;Here's the track page: &lt;a rel="nofollow" target="_blank" href="http://qconsf.com/sf2009/tracks/show_track.jsp?trackOID=318"&gt;The Many Facets of Ruby&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And the &lt;a rel="nofollow" target="_blank" href="http://qconsf.com/sf2009/schedule/wednesday.jsp"&gt;full conference schedule for Wednesday&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And finally, the &lt;a rel="nofollow" target="_blank" href="http://qconsf.com/sf2009/registration/"&gt;registration page&lt;/a&gt; (don't forget to use code "rubywednesday").&lt;br /&gt;&lt;br /&gt;I really hope to see you all there, so you can get your Ruby conference fix this fall. &lt;span style="font-weight:bold;"&gt;Tell your friends&lt;/span&gt; and let me know if you have any questions!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20975090-2414424309867359514?l=blog.headius.com'/&gt;&lt;/div&gt;</description>
         <author>Charles Oliver Nutter</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-20975090.post-2414424309867359514</guid>
         <pubDate>Sat, 31 Oct 2009 05:48:00 -0700</pubDate>
      <feedburner:origLink>http://blog.headius.com/2009/10/missed-rubyconf-attend-qcons-ruby-track.html</feedburner:origLink></item>
      <item>
         <title>Follow up on Servlet 3.0 Security Annotations</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/e4cXJfEE_Ak/follow_up_on_servlet_3</link>
         <description>In May 2009, I discussed the Servlet 3.0 security annotations in one of my blogs,
&lt;a rel="nofollow" target="_blank" href="http://blogs.sun.com/swchan/entry/servlet_3_0_security_annotations"&gt;Servlet 3.0 Security Annotations&lt;/a&gt;.
At that time, the annotations were defined similar to those in EJB. During the discussion in &lt;a rel="nofollow" target="_blank" href="http://jcp.org/en/jsr/detail?id=315"&gt;JSR 315&lt;/a&gt; expert group, two issues were identified as follows:
&lt;ol&gt; &lt;li&gt;In &lt;a rel="nofollow" target="_blank" href="http://jcp.org/en/jsr/detail?id=250"&gt;JSR 250&lt;/a&gt;, type level annotations only apply to methods declared in that class, not those inherited. This is an issue for servlets as they extend &lt;code&gt;javax.servlet.http.HttpServlet&lt;/code&gt;. &lt;li&gt;The &lt;code&gt;doGet&lt;/code&gt; method et al may not correspond to http method GET et al as the logic can be overrided in &lt;code&gt;service&lt;/code&gt; method of the servlet.
&lt;/ol&gt; &lt;p&gt;Thanks to Ronald Monzilo for discussions in Servlet 3.0 security.
The following is the update on Servlet 3.0 security annotations:
&lt;ul&gt; &lt;li&gt;As in servlet 2.5, @DenyAll, @PermitAll, @RolesAllowed will not apply to servlets. @TransportProtected will not be added to JSR 250. &lt;li&gt;The following new annotations will be added to javax.servlet.annotation: &lt;ul&gt; &lt;li&gt;ServletSecurity &lt;li&gt;HttpConstraint &lt;li&gt;HttpMethodConstraint &lt;/ul&gt; Note that @ServletSecurity is a type level annotation and the rests are used as parameters in @ServletSecurity. &lt;li&gt;With the above new annotations, one can resolve the issue mentioned above. In addition, it covers the new use case where one want to have security constraint for extended http methods only, for instance FOO.
&lt;/ul&gt; &lt;p&gt;In this blog, I will illustrate how those annotation work. For convenient of readers of my previous blogs, I will first illustrate the four scenarios mentioned in my previous blog, &lt;a rel="nofollow" target="_blank" href="http://blogs.sun.com/swchan/entry/servlet_3_0_security_annotations"&gt;Servlet 3.0 Security Annotations&lt;/a&gt; with the new annotations. Then I have an additional example. &lt;p&gt;&lt;h3&gt;Example 1: For all Http Methods&lt;/h3&gt;
&lt;blockquote&gt;
@WebServlet("/myurl")&lt;br&gt;
&lt;b&gt;@ServletSecurity(@HttpConstraint(rolesAllowed={"javaee"}))&lt;/b&gt;&lt;br&gt;
public class TestServlet extends HttpServlet {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;
}&lt;br&gt;
&lt;/blockquote&gt; &lt;p&gt;In this case, all http methods are protected and accessible only by users with role javaee. &lt;p&gt;&lt;h3&gt;Example 2: Http Method Level&lt;/h3&gt;
&lt;p&gt;
&lt;blockquote&gt;
@WebServlet("/myurl")&lt;br&gt;
&lt;b&gt;@ServletSecurity(httpMethodConstraints={ @HttpMethodConstraint("GET"),&lt;/b&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;@HttpMethodConstraint(value="POST", rolesAllowed={"javaee"}),&lt;/b&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;@HttpMethodConstraint(value="TRACE", emptyRoleSemantic=ServletSecurity.EmptyRoleSemantic.DENY) })&lt;/b&gt;
&lt;br&gt;public class TestServlet extends HttpServlet {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected void doGet(HttpServletRequest req, HttpServletResponse res)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throws IOException, ServletException {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected void doPost(HttpServletRequest req, HttpServletResponse res)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throws IOException, ServletException {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected void doTrace(HttpServletRequest req, HttpServletResponse res)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throws IOException, ServletException {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
}&lt;br&gt;
&lt;/blockquote&gt; &lt;p&gt;The behaviors of the above servlet can be summarized as follows:
&lt;table border="1"&gt; &lt;tr&gt;&lt;th&gt;Http method&lt;th&gt;Behavior &lt;tr&gt;&lt;td&gt;GET&lt;td&gt;all can access GET method &lt;tr&gt;&lt;td&gt;POST&lt;td&gt;only authenticated users with role javaee can access POST method &lt;tr&gt;&lt;td&gt;TRACE&lt;td&gt;no one can access TRACE method
&lt;/table&gt; &lt;p&gt;&lt;h3&gt;Example 3: A General Constraint for all Http methods with some Exceptional Cases&lt;/h3&gt;
&lt;p&gt;
&lt;blockquote&gt;
@WebServlet("/myurl")&lt;br&gt;
&lt;b&gt;@ServletSecurity(value=@HttpConstraint(rolesAllowed={"javaee"}), &lt;/b&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;httpMethodConstraints={ @HttpMethodConstraint(value="POST", rolesAllowed={"staff"}),&lt;/b&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;@HttpMethodConstraint("TRACE") })&lt;/b&gt;
&lt;br&gt;public class TestServlet extends HttpServlet {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected void doPost(HttpServletRequest req, HttpServletResponse res)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throws IOException, ServletException {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected void doTrace(HttpServletRequest req, HttpServletResponse res)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throws IOException, ServletException {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
}&lt;br&gt;
&lt;/blockquote&gt; &lt;p&gt;The behaviors of the above servlet can be summarized as follows:
&lt;table border="1"&gt; &lt;tr&gt;&lt;th&gt;Http method&lt;th&gt;Behavior &lt;tr&gt;&lt;td&gt;POST&lt;td&gt;only authenticated users with role staff can access POST method &lt;tr&gt;&lt;td&gt;TRACE&lt;td&gt;all can access TRACE method &lt;tr&gt;&lt;td&gt;methods other than POST and TRACE&lt;td&gt;only authenticated users with role javaee can access
&lt;/table&gt;
Note that in the previous definitions, the exceptional cases must be the standard http methods. There is no such restriction for the new annotations as illustrated by the Example 5 below. &lt;p&gt;&lt;h3&gt;Example 4: Https and protected for a given role&lt;/h3&gt;
&lt;p&gt;
&lt;blockquote&gt;
@WebServlet("/myurl")&lt;br&gt;
&lt;b&gt;@ServletSecurity(value=HttpConstraint(&lt;/b&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;transportGuarantee=ServletSecurity.TransportGuarantee.CONFIDENTIAL), &lt;/b&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;httpMethodConstraints={ @HttpMethodConstraint(value="TRACE", transportGuarantee=ServletSecurity.TransportGuarantee.NONE, rolesAllowed={"javaee"}) })&lt;/b&gt;
&lt;br&gt;public class TestServlet extends HttpServlet {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected void doTrace(HttpServletRequest req, HttpServletResponse res)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throws IOException, ServletException {&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
}
&lt;/blockquote&gt; &lt;p&gt;The behaviors of the above servlet can be summarized as follows:
&lt;table border="1"&gt; &lt;tr&gt;&lt;th&gt;Http method&lt;th&gt;Behavior &lt;tr&gt;&lt;td&gt;TRACE&lt;td&gt;Https is supported. It just is not required. Only authenticated users with role javaee can access TRACE method &lt;tr&gt;&lt;td&gt;methods other than TRACE&lt;td&gt;require https
&lt;/table&gt; &lt;p&gt;&lt;h3&gt;Example 5: Protect FOO only&lt;/h3&gt;
&lt;blockquote&gt;
@WebServlet("/myurl")&lt;br&gt;
&lt;b&gt;@ServletSecurity(value=@HttpConstraint,&lt;/b&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;httpMethodConstraints={ @HttpMethodConstraint(value="FOO", rolesAllowed={"javaee"}) })&lt;/b&gt;
&lt;br&gt;public class TestServlet extends HttpServlet {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br&gt;
}
&lt;/blockquote&gt;
&lt;p&gt;The behaviors of the above servlet can be summarized as follows:
&lt;table border="1"&gt; &lt;tr&gt;&lt;th&gt;Http method&lt;th&gt;Behavior &lt;tr&gt;&lt;td&gt;FOO&lt;td&gt;only authenticated users with role staff can access POST method &lt;tr&gt;&lt;td&gt;methods other than FOO&lt;td&gt;all can access
&lt;/table&gt;
&lt;p&gt;</description>
         <author>swchan</author>
         <guid isPermaLink="false">http://blogs.sun.com/swchan/entry/follow_up_on_servlet_3</guid>
         <pubDate>Thu, 29 Oct 2009 07:19:19 -0700</pubDate>
      <feedburner:origLink>http://blogs.sun.com/swchan/entry/follow_up_on_servlet_3</feedburner:origLink></item>
      <item>
         <title>Atmosphere 0.4 Released</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/1tVwdEU-TYI/atmosphere-04-released</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;img border="0" align="left"/&gt;&lt;p&gt;Atmosphere 0.4, the framework that allow the creation of RESTFul and Ajax Push/Comet applications, is ready for prime time. This release contains many new features and can be seen in action in many well-known frameworks.&lt;/p&gt;
&lt;p&gt;First, I would like to thanks Paul Sandoz, Viktor Klang, Gerard Davison, Vlatko Davidobski, Hubert Iwaniuk, Bertrand Goetzmann,Cagatay Civici, Michal Hanti, A. Eduardo Garcia, Ransford Segu-Baffoe and Jim Driscoll for their contribution to that release!&lt;/p&gt;
&lt;p&gt;Atmosphere's adoption continues with this release, starting with &lt;a rel="nofollow" target="_blank" href="http://primefaces.prime.com.tr/"&gt;PrimeFaces'&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/Atmosphere-and-JSF-Integration-tt3806741.html#a3806741"&gt;support&lt;/a&gt; for Ajax Push/Comet (event on the &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/Atmosphere-Push-on-iPhone-tt3814785.html#a3814785"&gt;iPhone&lt;/a&gt;). You can also see Atmosphere in action within the Scala based &lt;a rel="nofollow" target="_blank" href="http://wiki.github.com/jboner/akka"&gt;Akka Project&lt;/a&gt;. Don't want to use Java? Why not using the Atmosphere Grails' plug in. Don't like Scala, Java and Groovy? Why not trying &lt;a rel="nofollow" target="_blank" href="http://weblogs.java.net/blog/jfarcand/archive/2009/09/10/writing-comet-applications-using-jruby-and-atmosphere-framework"&gt;JRuby&lt;/a&gt;!&lt;/p&gt;
&lt;img alt="Boo" src="http://weblogs.java.net/sites/default/files/IMG_0166.jpg" width="640" height="400"/&gt;
&lt;p&gt;What's new since &lt;a rel="nofollow" target="_blank" href="http://weblogs.java.net/blog/2009/07/23/atmosphere-03-released"&gt;Atmosphere 0.3&lt;/a&gt;?&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;Easy integration with other Framework like &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/FYI-Integrating-Wicket-with-Atmosphere-tt3829855.html#a3829855"&gt;Wicket&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/integrate-with-gwt-td3531993.html#a3557861"&gt;GWT&lt;/a&gt;&lt;/li&gt; &lt;li&gt;New &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/ANN-New-Meteor-API-for-easier-integration-with-existing-Servlet-JSP-JSF-Component-tt3660031.html#a3660031"&gt;Meteor API&lt;a rel="nofollow"&gt; for easier integration with existing Servlet based applications&lt;/li&gt; &lt;li&gt;Support the latest Bayeux Protocol specification and implementation from the DOJO Foundation powered &lt;a rel="nofollow" target="_blank" href="http://cometd.org/"&gt;Cometd.org&lt;/a&gt;&lt;/li&gt; &lt;li&gt;The Atmosphere RESTful module can now be used with and without session support.&lt;/li&gt; &lt;li&gt;Works with &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/Jersey-Atmosphere-annotations-td3819758.html#a3819758"&gt;EJB 3.1&lt;/a&gt;&lt;/li&gt; &lt;li&gt;New work-in-progress white paper (&lt;a rel="nofollow" target="_blank" href="https://atmosphere.dev.java.net/atmosphere_whitepaper.pdf"&gt;PDF&lt;/a&gt;)&lt;/li&gt; &lt;li&gt;The configuration file atmosphere.xml is now &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/FYI-atmosphere-xml-not-optional-for-atmosphere-core-tt3783261.html#a3783261"&gt;optional&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/FYI-Delayed-and-Scheduled-broadcast-operations-now-supported-tt3697164.html#a3697164"&gt;Delayed and Scheduled Broadcast&lt;/a&gt; now supported. &lt;/li&gt; &lt;li&gt;The new &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/ANN-Atmosphere-Spade-Server-tt3580390.html#a3580390"&gt;Atmosphere Spade Server&lt;a rel="nofollow"&gt; is an end-to-end stack that aggregate technology including the Grizzly Servlet Container, Jersey Runtime and The Atmosphere Framework and Plug In in single jar file! See how simple you can deploy on it, and it's production ready!&lt;/li&gt; &lt;li&gt;All Atmosphere modules are OSGi ready&lt;/li&gt; &lt;li&gt;You can now force Atmosphere to use Servlet 3.0 Async API or Blocking I/O API instead of Native Async API like Grizzly Comet, Tomcat AIO or Jetty Continuation&lt;/li&gt; &lt;li&gt;You can implement your own Comet support via the new CometSupport &lt;a rel="nofollow" target="_blank" href="https://atmosphere.dev.java.net/nonav/apidocs/org/atmosphere/cpr/CometSupport.html"&gt;SPI&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Many new sample like &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/FYI-Simple-RESTFul-Pub-Sub-sample-tt3896606.html#a3896606"&gt;PubSub&lt;a rel="nofollow"&gt;, GWT, &lt;a rel="nofollow" target="_blank" href="https://atmosphere.dev.java.net/nonav/xref/org/atmosphere/samples/chat/MeteorChat.html#57"&gt;Meteor&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="https://atmosphere.dev.java.net/nonav/xref/org/atmosphere/samples/spade/SpadeChat.html"&gt;Embedded Atmosphere&lt;a rel="nofollow"&gt; etc. now available&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For any questions or to download Atmosphere, go to &lt;a rel="nofollow" target="_blank" href="http://atmosphere.dev.java.net"&gt;our main site&lt;/a&gt; and use our &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/Atmosphere-users-mailling-list-f2493822.html"&gt;Nabble forum&lt;/a&gt; (no subscription needed) or &lt;a rel="nofollow" target="_blank" href="http://twitter.com/atmosphere_java"&gt;follow us on Twitter&lt;/a&gt; and tweet your questions there!&lt;/p&gt;&lt;p&gt;
 
 
technorati: &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/atmosphere+framework"&gt;atmosphere framework&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/cluster"&gt;cluster&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/comet"&gt;comet&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/scala"&gt;scala&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/ajax"&gt;ajax&lt;/a&gt;&lt;/p&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;</description>
         <guid isPermaLink="false">301790 at http://www.java.net</guid>
         <pubDate>Mon, 26 Oct 2009 19:22:13 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/jfarcand/archive/2009/10/26/atmosphere-04-released</feedburner:origLink></item>
      <item>
         <title>Mojarra 2.0.1 has shipped</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/FO_P9H5aPnU/mojarra-201-has-shipped</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;Just a short post to note that we've now shipped Mojarra 2.0.1. This version fixes a very serious bug when running on Tomcat. You can pick up the files from the &lt;a rel="nofollow" target="_blank" href="https://javaserverfaces.dev.java.net/servlets/ProjectDocumentList?folderID=11863&amp;expandFolder=11863&amp;folderID=11852"&gt;usual places&lt;/a&gt;, see the &lt;a rel="nofollow" target="_blank" href="https://javaserverfaces.dev.java.net/nonav/rlnotes/2.0.1/index.html"&gt;release notes&lt;/a&gt; for more information. If you're using GlassFish, and already running 2.0.0 (you leading edge adopter!), there's probably no reason to upgrade - though the new v3 (b69) has the updated jar, and it will be propagated via the usual Update Center distribution.</description>
         <guid isPermaLink="false">300040 at http://www.java.net</guid>
         <pubDate>Fri, 23 Oct 2009 14:10:46 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/driscoll/archive/2009/10/23/mojarra-201-has-shipped</feedburner:origLink></item>
      <item>
         <title>Request aggregation in JSF 2 Ajax</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/H1lXQEU2c1s/request-aggregation-jsf-2-ajax</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;p&gt;I've had a few requests for request aggregation, ala RichFaces queues, in JSF 2. This was deliberately not included in JSF 2.0, but it will be considered for JSF 2.1. The reason why is simple - there was simply not very much time, once all the base Ajax work was completed, to add any additional features. However, adding this functionality yourself isn't actually very hard. Here's an example of how.&lt;/p&gt;
&lt;p&gt;
For those not familiar with the idea of request aggregation, the idea is a pretty simple one: in cases where the user may generate a large number of requests (for instance, with the keyup event), you're going to want to wait and see if you can bundle the requests together, so you don't spam the server with thousands of tiny little requests.&lt;/p&gt;
&lt;p&gt;
The example will have two parts: a JSF page, and some backing JavaScript. The end result will be a program which accepts input, and echos it out to another part of the page via an Ajax request to the server. There's also a status area to show a little of what's going on during the call.&lt;/p&gt;
&lt;p&gt;
Here's the form:&lt;/p&gt;
&lt;pre&gt; 1 &amp;lt;h:form id="form1" prependId="false"&amp;gt; 2 &amp;lt;h:outputScript name="jsf.js" library="javax.faces" target="head"/&amp;gt; 3 &amp;lt;h:outputScript name="javascript/aggregate.js" target="head"/&amp;gt; 4 5 Output: &amp;lt;h:outputText id="out1" value="#{echo.str}"/&amp;gt; 6 &amp;lt;br/&amp;gt; 7 Input: &amp;lt;h:inputText id="in2" value="#{echo.str}" autocomplete="off" 8 onkeyup="aggregate('out1 in1', this)"/&amp;gt; 9 &amp;lt;br/&amp;gt; 10 Status: 11 &amp;lt;br/&amp;gt; 12 &amp;lt;textarea id="status" rows="10" cols="50" readonly="readonly"/&amp;gt; 13 &amp;lt;/h:form&amp;gt;
&lt;/pre&gt;&lt;p&gt;And here's the backing JavaScript:&lt;/p&gt;
&lt;pre&gt; 1 var increment = 1000; 2 var token; 3 function aggregate(target, element) { 4 window.clearTimeout(token); 5 addStatusMessage("cleared request, requeued"); 6 var send = function send() { 7 jsf.ajax.request(element, null, {render: target}); 8 }; 9 token = window.setTimeout(send, increment); 10 } 11 12 function addStatusMessage(message) { 13 var statusElement = document.getElementById("status"); 14 var status = statusElement.value; 15 var now = new Date(); 16 var timestamp = now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds(); 17 status = timestamp + ' ' + message + '&amp;#92;n' + status; 18 statusElement.value = status; 19 } 20 21 jsf.ajax.addOnEvent(function(data) { 22 if (data.status === "begin") { 23 addStatusMessage("request sent"); 24 } 25 });
&lt;/pre&gt;&lt;p&gt;This program is simple enough that it's function should be pretty self evident - but in case you've never worked with JavaScript timers, here's the control flow.&lt;/p&gt;
&lt;p&gt;
When you type a character into the input field, the aggregate function is called (JSF page line 8). If an outstanding request is already there, it will be canceled (JavaScript line 4), and a status message will be written (JavaScript lines 12-19) to a readonly textarea in the page (JSF page line 12). Then, a new request will be submitted, which will go off after 1 second (JavaScript line 9). If you type a new character before the second has elapsed, then the first request is canceled (JS line 4), before being submitted again with a new value (JS line 9). If a whole second goes by without a new keypress, then the request will finally be sent to the server, which will also trigger calling the event function (JS lines 21 - 24), which in turn writes out a status (JS lines 12-19), to the textarea (JSF line 12).&lt;/p&gt;
&lt;p&gt;
So, all told, the aggregation code was about 6 lines of JavaScript. And while that may be a trifle annoying, I can only assume that anyone writing a component like Autocomplete will include this into the component so you never need see it.&lt;/p&gt;
&lt;p&gt;
As always, feel free to ask questions on this post in the comments.&lt;/p&gt;</description>
         <guid isPermaLink="false">295378 at http://www.java.net</guid>
         <pubDate>Mon, 19 Oct 2009 13:59:26 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/driscoll/archive/2009/10/19/request-aggregation-jsf-2-ajax</feedburner:origLink></item>
      <item>
         <title>Mojarra is FCS!</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/XkwodcaFnkU/mojarra-fcs</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;p&gt;After years of effort, I'm delighted to echo &lt;a rel="nofollow" target="_blank" href="http://blogs.sun.com/rlubke/entry/mojarra_2_0_0_is"&gt;Ryan Lubke's announcement&lt;/a&gt; that Mojarra 2.0 is final!&lt;/p&gt;
&lt;p&gt;Please check &lt;a rel="nofollow" target="_blank" href="http://blogs.sun.com/rlubke/entry/mojarra_2_0_0_is"&gt;Ryan's blog&lt;/a&gt; for all the details.&amp;nbsp; You can download it directly from &lt;a rel="nofollow" target="_blank" href="https://javaserverfaces.dev.java.net"&gt;the project website&lt;/a&gt;, or just &lt;a rel="nofollow" target="_blank" href="https://javaserverfaces.dev.java.net/maven2"&gt;use maven&lt;/a&gt; to get the latest stuff.,.&lt;/p&gt;</description>
         <guid isPermaLink="false">295293 at http://www.java.net</guid>
         <pubDate>Mon, 19 Oct 2009 13:28:01 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/driscoll/archive/2009/10/19/mojarra-fcs</feedburner:origLink></item>
      <item>
         <title>Mojarra 2.0.0 is available!</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/ACaYH-D_Rlc/mojarra_2_0_0_is</link>
         <description>&lt;p&gt;Mojarra 2.0.0 is now available!&lt;/p&gt; &lt;p&gt; There are several ways to obtain the release.&amp;nbsp; &lt;/p&gt; &lt;ul&gt; &lt;li&gt;GlassFish V3 promoted build 69 (out later this week)&lt;/li&gt; &lt;li&gt;Download directly from &lt;a rel="nofollow" target="_blank" href="https://javaserverfaces.dev.java.net" title="Mojarra project site"&gt;https://javaserverfaces.dev.java.net&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Download using Maven2 using information provided &lt;a rel="nofollow" title="Mojarra 2.0.0 Maven2 details" target="_blank" href="https://javaserverfaces.dev.java.net/maven2"&gt;here&lt;/a&gt;&lt;a rel="nofollow" target="_blank" href="https://javaserverfaces.dev.java.net/maven2" title="Mojarra 2.0.0 Maven2 details"&gt;&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Please review the &lt;a rel="nofollow" target="_blank" href="https://javaserverfaces.dev.java.net/nonav/rlnotes/2.0.0/index.html" title="Mojarra 2.0.0 Release Notes"&gt;release notes&lt;/a&gt; as there are important details there pertaining to differences between the implementation and the specification as well as a basic migration guide from 1.2 to 2.0 (note that this is a live document, so we'll be making additions - check back regularly).&lt;/p&gt; &lt;p&gt;The JSF 2.0 tutorial from our Sun documentation team should be available in the coming weeks.&amp;nbsp; As soon as it is, we'll send out a notification.&amp;nbsp; Until then, here are some nice resources for JSF 2.0:&lt;/p&gt; &lt;ul&gt; &lt;li&gt; Andy Schwartz' blog entry - &lt;a rel="nofollow" title="What's New in JSF 2" target="_blank" href="http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/"&gt;What's New in JSF 2&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Ed Burns' blog - &lt;a rel="nofollow" title="Ed Burns' Blog" target="_blank" href="http://www.java.net/blogs/edburns/"&gt;http://www.java.net/blogs/edburns/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Jim Driscoll's blog - &lt;a rel="nofollow" title="Jim Driscoll's Blog" target="_blank" href="http://www.java.net/blogs/driscoll"&gt;http://www.java.net/blogs/driscoll&lt;/a&gt;&lt;/li&gt; &lt;li&gt;JSF 2.0 EG blog - &lt;a rel="nofollow" title="JSF 2.0 EG blog" target="_blank" href="http://blogs.jsfcentral.com/jsf2group/"&gt;http://blogs.jsfcentral.com/jsf2group/&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;On the tools+JSF 2.0 front, NetBeans is well underway with the JSF 2.0 support.&amp;nbsp; I'd recommend grabbing the NetBeans development build and try it out!&amp;nbsp; Ed noted the other day that you could highlight a section of markup in a Facelet template and extract it into a composite component.&amp;nbsp; Slick!&amp;nbsp; The JetBrains guys have been busy as well.&amp;nbsp; Check out their &lt;a rel="nofollow" target="_blank" href="http://blogs.jetbrains.com/idea/tag/jsf-20/"&gt;blog&lt;/a&gt; on JSF 2.0 support within Maia.&lt;br /&gt; &lt;p&gt;I'd like to personally thank all of our external contributors who have been committing code to the repository directly or submitting patches to help improve our quality (these are in no particular order - my apologies if I've missed anyone):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Guy Veraghtert&lt;/li&gt; &lt;li&gt;Imre Oßwald&lt;/li&gt; &lt;li&gt;Ted Goddard &lt;br /&gt;&lt;/li&gt; &lt;li&gt;Mark Collette&lt;br /&gt;&lt;/li&gt; &lt;li&gt;Dan Allen &lt;br /&gt;&lt;/li&gt; &lt;li&gt;Alexandr Smirnov &lt;br /&gt;&lt;/li&gt; &lt;li&gt;Martin Marinschek&lt;/li&gt; &lt;li&gt;Michael Kurz&lt;/li&gt; &lt;li&gt;Andy Schwartz&lt;br /&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;I'd also like to thank our top three issue reporters for taking the time to log issues (again, in no particular order)&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Frank Hofmann&lt;/li&gt; &lt;li&gt;Guy Veraghtert&lt;/li&gt; &lt;li&gt;Juergen Zimmerman&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Also, thanks to Ed Burns, Roger Kitain, Jim Driscoll, and Doug Donahue for putting up with me for the past two years while we worked on this project :)&lt;/p&gt; &lt;p&gt;Finally, if you'd like to discuss JSF 2.0 with other users, I'd recommend the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a rel="nofollow" title="GlassFish Webtier Forums" target="_blank" href="http://forums.java.net/jive/forum.jspa?forumID=138"&gt;GlassFish Webtier Forums &lt;br /&gt;&lt;/a&gt;&lt;/li&gt; &lt;li&gt;##jsf IRC channel on freenode.net&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The GlassFish Webtier forums are monitored by the Mojarra developers.&amp;nbsp;&amp;nbsp; The IRC channel, also, is frequented by the Mojarra developers, as well as folks from Exadel, MyFaces, and consumers of JSF as a technology.&amp;nbsp; It's a great way to interact with the community.&lt;/p&gt; &lt;p&gt;I'm excited that we've reached this stage and am looking forward to hearing/reading about people's experiences with JSF 2.0!&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">http://blogs.sun.com/rlubke/entry/mojarra_2_0_0_is</guid>
         <pubDate>Mon, 19 Oct 2009 10:25:38 -0700</pubDate>
      <feedburner:origLink>http://blogs.sun.com/rlubke/entry/mojarra_2_0_0_is</feedburner:origLink></item>
      <item>
         <title>JSF2 Facelet Tag Handlers</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/gBnizId8I8k/jsf2-facelet-tag-handlers</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;img border="0" align="left"/&gt;&lt;p&gt;The following topics and more will be covered in detail in my
upcoming book with Neil Griffin, &lt;a rel="nofollow"
 target="_blank" href="http://bit.ly/edburnsjsf2"&gt;JavaServer Faces 2.0: The Complete
Reference&lt;/a&gt;. Please enjoy this early access content!&lt;/p&gt; &lt;p&gt;One challenging aspect of designing JSF 2.0 was how to standardize
Facelets. We wanted to standardize only the minimum amount that would
still allow developers get the job done. Initially, we did not include
binary custom tag handlers in the standard because most users of
Facelets were simply using it to declare pages of existing UI
components. &lt;a rel="nofollow" target="_blank" href="http://andyschwartz.wordpress.com/"&gt;Andy
Schwartz&lt;/a&gt; and others advocated for the inclusion of a custom tag
handler feature in the standard but I didn't want to just standardize
what Jacob had initially done.&lt;/p&gt; &lt;p&gt;While Jacob's initial work for custom tag handlers was certainly
effective, EG discussions with Ken Paulsen, creator of the &lt;a rel="nofollow"
 target="_blank" href="https://jsftemplating.dev.java.net/"&gt;JSFTemplating View
Declaration Language&lt;/a&gt; led the EG to conclude that the standardization
work for some of Facelets would best be left to JSF 2.1. In
particular, Ken and EG member Imre O&amp;szlig;wald came up with something
they called View Abstract Syntax Tree that would handle deeper aspects
of Faces templating that they felt solved some of the flaws in the
implementation of Facelets. Rather than overspecify, we came up with a
simpler solution that still enables the most common usecases for custom
tag handlers.&lt;/p&gt; &lt;p&gt;First, let's take a look at the custom.taglib.xml file. The manner
and location for this file is exactly the same as before. In this
example, (available in the &lt;a rel="nofollow"
 target="_blank" href="https://mojarra.dev.java.net/svn/mojarra/trunk/jsf-demo/jsf2-facelet-custom-tag"&gt;Mojarra
svn repo&lt;/a&gt;), the file lives at
&lt;code&gt;WEB-INF/classes/META-INF/custom.taglib.xml&lt;/code&gt;.&lt;/p&gt; &lt;img style="float:right;" src="http://mediacast.sun.com/users/edburns00/media/01_ComponentHandlerCtor.png" alt="callstack to custom tag handler constructor"/&gt; &lt;div class="xml" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;?xml&lt;/span&gt; &lt;span style="color:#000066;"&gt;version&lt;/span&gt;=&lt;span style="color:#ff0000;"&gt;"1.0"&lt;/span&gt; &lt;span style="color:#000066;"&gt;encoding&lt;/span&gt;=&lt;span style="color:#ff0000;"&gt;"UTF-8"&lt;/span&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;facelet-taglib&lt;/span&gt; &lt;span style="color:#000066;"&gt;xmlns&lt;/span&gt;=&lt;span style="color:#ff0000;"&gt;"http://java.sun.com/xml/ns/javaee"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color:#000066;"&gt;xmlns:xsi&lt;/span&gt;=&lt;span style="color:#ff0000;"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color:#000066;"&gt;xsi:schemaLocation&lt;/span&gt;=&lt;span style="color:#ff0000;"&gt;"http://java.sun.com/xml/ns/javaee&lt;br /&gt; http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color:#000066;"&gt;version&lt;/span&gt;=&lt;span style="color:#ff0000;"&gt;"2.0"&lt;/span&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;namespace&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;http://mojarra.dev.java.net/custom&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/namespace&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;tag&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;tag-name&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;custom1&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/tag-name&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;component&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;component-type&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;javax.faces.Input&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/component-type&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;renderer-type&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;javax.faces.Text&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/renderer-type&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;handler-class&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;com.sun.faces.facelets.custom.CustomComponentHandler1&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/handler-class&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/component&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/tag&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/facelet-taglib&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;p&gt;The java code for this class is shown next. At right, you see the
stack trace for a breakpoint set on line 8.&lt;/p&gt; &lt;div style="padding:5px;"&gt; &lt;div class="java" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;package&lt;/span&gt; &lt;span style="color:#006699;"&gt;com.sun.faces.facelets.custom&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.facelets.ComponentConfig&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.facelets.ComponentHandler&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;class&lt;/span&gt; CustomComponentHandler1 &lt;span style="color:#000000;font-weight:bold;"&gt;extends&lt;/span&gt; ComponentHandler &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; CustomComponentHandler1&lt;span style="color:#009900;"&gt;(&lt;/span&gt;ComponentConfig config&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;super&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;config&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;/div&gt; &lt;p&gt;The preceding code does nothing. But it's a start. Particurlarly
useful is that &lt;a rel="nofollow"
 target="_blank" href="http://java.sun.com/javaee/javaserverfaces/2.0/docs/api/javax/faces/view/facelets/ComponentConfig.html"&gt;ComponentConfig&lt;/a&gt;
argument. This gives you access to a whole bunch of useful stuff. Note
also that extends &lt;a rel="nofollow"
 target="_blank" href="http://java.sun.com/javaee/javaserverfaces/2.0/docs/api/javax/faces/view/facelets/ComponentHandler.html"&gt;javax.faces.view.facelets.ComponentHandler&lt;/a&gt;.
There are handlers for all the kinds of tags in JSF: converter,
validator, component, and behavior.&lt;/p&gt; &lt;p&gt;In many cases, the only reason people were doing custom Facelet tags
was so they could be notified when the component is built. To get this
in JSF 2.0, just override the &lt;code&gt;onComponentCreated()&lt;/code&gt;
method, as shown in the next class.&lt;/p&gt; &lt;div style="padding:5px;"&gt; &lt;div class="java" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;package&lt;/span&gt; &lt;span style="color:#006699;"&gt;com.sun.faces.facelets.custom&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.component.UIComponent&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.facelets.ComponentConfig&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.facelets.ComponentHandler&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.facelets.FaceletContext&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;class&lt;/span&gt; CustomComponentHandler2 &lt;span style="color:#000000;font-weight:bold;"&gt;extends&lt;/span&gt; ComponentHandler &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; CustomComponentHandler2&lt;span style="color:#009900;"&gt;(&lt;/span&gt;ComponentConfig config&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;super&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;config&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000066;font-weight:bold;"&gt;void&lt;/span&gt; onComponentCreated&lt;span style="color:#009900;"&gt;(&lt;/span&gt;FaceletContext ctx, UIComponent c, UIComponent parent&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;super&lt;/span&gt;.&lt;span style="color:#006633;"&gt;onComponentCreated&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;ctx, c, parent&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000066;font-weight:bold;"&gt;void&lt;/span&gt; onComponentPopulated&lt;span style="color:#009900;"&gt;(&lt;/span&gt;FaceletContext ctx, UIComponent c, UIComponent parent&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;super&lt;/span&gt;.&lt;span style="color:#006633;"&gt;onComponentPopulated&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;ctx, c, parent&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;/div&gt; &lt;p&gt;The stack traces for &lt;code&gt;onComponentCreated&lt;/code&gt; and
&lt;code&gt;onComponentPopulated&lt;/code&gt; are &lt;a rel="nofollow"
 target="_blank" href="http://mediacast.sun.com/users/edburns00/media/02_onComponentCreated.png"&gt;here&lt;/a&gt;
and &lt;a rel="nofollow"
 target="_blank" href="http://mediacast.sun.com/users/edburns00/media/03_onComponentPopulated.png"&gt;here&lt;/a&gt;,
respectively.&lt;/p&gt; &lt;p&gt;If you really must have access to the &lt;code&gt;apply&lt;/code&gt; method, and
indeed override it, you can still do so. However, to preserve a clean
separation between interface and implementation there is a little extra
syntatic sugar you must endure. Sorry. Here's the code for a custom
tag handler that overrides &lt;code&gt;apply()&lt;/code&gt; and
&lt;code&gt;createMetaRuleset()&lt;/code&gt;. The stack trace for
&lt;code&gt;apply()&lt;/code&gt; is shown at left, while the one for
&lt;code&gt;createMetaRuleset()&lt;/code&gt; is available &lt;a rel="nofollow"
 target="_blank" href="http://mediacast.sun.com/users/edburns00/media/05_createMetaRuleSet.png"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;img style="float:left;padding:30px;" src="http://mediacast.sun.com/users/edburns00/media/04_apply.png" alt="callstack to custom tag handler constructor"/&gt;	&lt;div style="padding:5px;"&gt; &lt;div class="java" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;package&lt;/span&gt; &lt;span style="color:#006699;"&gt;com.sun.faces.facelets.custom&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;java.io.IOException&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.component.UIComponent&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.facelets.ComponentConfig&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.facelets.ComponentHandler&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.facelets.FaceletContext&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.facelets.MetaRuleset&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.facelets.TagHandlerDelegate&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;class&lt;/span&gt; CustomComponentHandler3 &lt;span style="color:#000000;font-weight:bold;"&gt;extends&lt;/span&gt; ComponentHandler &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; CustomComponentHandler3&lt;span style="color:#009900;"&gt;(&lt;/span&gt;ComponentConfig config&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;super&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;config&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000066;font-weight:bold;"&gt;void&lt;/span&gt; onComponentCreated&lt;span style="color:#009900;"&gt;(&lt;/span&gt;FaceletContext ctx, UIComponent c, UIComponent parent&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;super&lt;/span&gt;.&lt;span style="color:#006633;"&gt;onComponentCreated&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;ctx, c, parent&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000066;font-weight:bold;"&gt;void&lt;/span&gt; onComponentPopulated&lt;span style="color:#009900;"&gt;(&lt;/span&gt;FaceletContext ctx, UIComponent c, UIComponent parent&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;super&lt;/span&gt;.&lt;span style="color:#006633;"&gt;onComponentPopulated&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;ctx, c, parent&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;protected&lt;/span&gt; TagHandlerDelegate getTagHandlerDelegate&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;final&lt;/span&gt; TagHandlerDelegate parent &lt;span style="color:#339933;"&gt;=&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;super&lt;/span&gt;.&lt;span style="color:#006633;"&gt;getTagHandlerDelegate&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TagHandlerDelegate result &lt;span style="color:#339933;"&gt;=&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;new&lt;/span&gt; TagHandlerDelegate&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; MetaRuleset createMetaRuleset&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;Class&lt;/span&gt; type&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;return&lt;/span&gt; parent.&lt;span style="color:#006633;"&gt;createMetaRuleset&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;type&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000066;font-weight:bold;"&gt;void&lt;/span&gt; apply&lt;span style="color:#009900;"&gt;(&lt;/span&gt;FaceletContext ctx, UIComponent comp&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;throws&lt;/span&gt; &lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;IOException&lt;/span&gt;&lt;/a&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; parent.&lt;span style="color:#006633;"&gt;apply&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;ctx, comp&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;return&lt;/span&gt; result&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;/div&gt; &lt;p&gt;As mentioned previously, there are handlers for all the different
kinds of JSF artifacts that may appear in a Facelet page. The syntax in
the &lt;code&gt;.taglib.xml&lt;/code&gt; file is rather similar for all of them, but
the one for the validator is shown next.&lt;/p&gt; &lt;div style="padding:5px;"&gt; &lt;div class="xml" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;tag&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;tag-name&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;validator&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/tag-name&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;validator&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;validator-id&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;javax.faces.Required&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/validator-id&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;handler-class&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;com.sun.faces.facelets.custom.CustomValidatorHandler&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/handler-class&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/validator&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/tag&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;/div&gt; &lt;p&gt;Finally, here's the code for this custom validator.&lt;/p&gt; &lt;div style="padding:5px;"&gt; &lt;div class="java" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;package&lt;/span&gt; &lt;span style="color:#006699;"&gt;com.sun.faces.facelets.custom&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;java.io.IOException&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.component.UIComponent&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.facelets.FaceletContext&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.facelets.MetaRuleset&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.facelets.TagHandlerDelegate&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.facelets.ValidatorConfig&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.facelets.ValidatorHandler&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;class&lt;/span&gt; CustomValidatorHandler &lt;span style="color:#000000;font-weight:bold;"&gt;extends&lt;/span&gt; ValidatorHandler &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; CustomValidatorHandler&lt;span style="color:#009900;"&gt;(&lt;/span&gt;ValidatorConfig config&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;super&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;config&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;protected&lt;/span&gt; TagHandlerDelegate getTagHandlerDelegate&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;final&lt;/span&gt; TagHandlerDelegate parent &lt;span style="color:#339933;"&gt;=&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;super&lt;/span&gt;.&lt;span style="color:#006633;"&gt;getTagHandlerDelegate&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TagHandlerDelegate result &lt;span style="color:#339933;"&gt;=&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;new&lt;/span&gt; TagHandlerDelegate&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; MetaRuleset createMetaRuleset&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;Class&lt;/span&gt; type&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;return&lt;/span&gt; parent.&lt;span style="color:#006633;"&gt;createMetaRuleset&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;type&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000066;font-weight:bold;"&gt;void&lt;/span&gt; apply&lt;span style="color:#009900;"&gt;(&lt;/span&gt;FaceletContext ctx, UIComponent comp&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;throws&lt;/span&gt; &lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;IOException&lt;/span&gt;&lt;/a&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; parent.&lt;span style="color:#006633;"&gt;apply&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;ctx, comp&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;return&lt;/span&gt; result&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;/div&gt; &lt;p&gt;The callstacks for &lt;code&gt;apply()&lt;/code&gt; and
&lt;code&gt;createMetaRuleset()&lt;/code&gt; are &lt;a rel="nofollow"
 target="_blank" href="http://mediacast.sun.com/users/edburns00/media/06_validator_apply.png"&gt;here&lt;/a&gt;
and &lt;a rel="nofollow"
 target="_blank" href="http://mediacast.sun.com/users/edburns00/media/07_validator_createMetaRuleset.png"&gt;here&lt;/a&gt;&lt;/p&gt; &lt;p&gt;80% of the time, there is no need for any custom tag handlers. If
you're doing your job right, the logic should be in the UIComponent,
Validator, Converter, etc. However, for that extra 20% of the time, you
can use the above practices to get the job done.&lt;/p&gt; &lt;p&gt;&lt;span class="technoratitag"&gt; Technorati Tags: &lt;a rel="nofollow" target="_blank" href="http://www.technorati.com/tags/edburns"&gt;edburns&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;</description>
         <guid isPermaLink="false">292919 at http://www.java.net</guid>
         <pubDate>Thu, 15 Oct 2009 12:47:59 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/edburns/archive/2009/10/15/jsf2-facelet-tag-handlers</feedburner:origLink></item>
      <item>
         <title>Slides for JSF 2 up on Slideshare</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/TnXtE8Ds1lQ/slides-jsf-2-slideshare</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;I've posted the slides for the talk that Andy Schwartz and I did at Oracle Open World up on Slideshare. &lt;p&gt;
&lt;a rel="nofollow" target="_blank" href="http://www.slideshare.net/jimdriscoll/a-complete-tour-of-jsf-2"&gt;Check 'em out.&lt;/a&gt;</description>
         <guid isPermaLink="false">291738 at http://www.java.net</guid>
         <pubDate>Wed, 14 Oct 2009 12:36:16 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/driscoll/archive/2009/10/14/slides-jsf-2-slideshare</feedburner:origLink></item>
      <item>
         <title>An (almost) comprehensive list of Web Components</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/KZZvaGi1xjw/almost-comprehensive-list-components</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;p&gt;
In talking with &lt;a rel="nofollow" target="_blank" href="http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/"&gt;Andy Schwartz&lt;/a&gt; before &lt;a rel="nofollow" target="_blank" href="http://www.slideshare.net/jimdriscoll/a-complete-tour-of-jsf-2"&gt;our recent talk&lt;/a&gt; together at &lt;a rel="nofollow" target="_blank" href="http://www.oracle.com/us/openworld/registration.htm?src=6773924&amp;Act=109"&gt;Oracle Open World&lt;/a&gt;, Andy mentioned that he'd like to see some new components make it in to JSF 2.1.
&lt;/p&gt;
&lt;p&gt;
I'd like to see that too - but what new components? To aid the discussion, I thought it might be handy to make up a list of components that I think would be handy for JSF - but please, don't take this as an endorsement of any particular component for inclusion into the spec. At best, I can see us adding only a handful, perhaps 3 or so. Still, once started, this kind of project becomes it's own end - so I decided it might be good to publish such a list. Many of these components already exist in some form or another for JSF, or as a JavaScript Widget that could be wrapped in a JSF component - so most of them are available today.
&lt;/p&gt;
&lt;h2&gt;Basic Html&lt;/h2&gt;
&lt;p&gt;Most of the basic HTML components are already well covered, but there would seem to be a little room for a few very basic components&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;File Upload&lt;/li&gt; This is pretty basic - and Servlet 3.0 just added it. &lt;li&gt;Formatted i18n data&lt;/li&gt; These can currently be done with converters and validators, but is there a better way? &lt;ul&gt; &lt;li&gt;Date entry/display&lt;/li&gt; &lt;li&gt;Time entry/display&lt;/li&gt; &lt;li&gt;Currency entry/display&lt;/li&gt; &lt;/ul&gt; &lt;li&gt;Flat Tree&lt;/li&gt; A very basic hierarchical data visualization component that has no JavaScript required. &lt;li&gt;Static Progress Status&lt;/li&gt; A bar which indicates percent complete, a static version of the Ajax version below &lt;li&gt;SingleRowSelect&lt;/li&gt; A radio button that works with a table. &lt;li&gt;HTML5&lt;/li&gt; There's new stuff coming up - should we start to care? IE is, as usual, the lone holdout.
&lt;/ul&gt; &lt;h2&gt;Navigation &lt;/h2&gt;
&lt;p&gt;Components for navigating from one page to another.&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;Breadcrumb Trail &lt;/li&gt; Almost standard on many sites now, a horizontal list, often limited to three deep, that allows you to backtrack through your history without the back button. &lt;li&gt;Navigation List &lt;/li&gt; A fairly straightforward list of links that navigate to different pages in the site. Often put in a Navbar on the left of the page. &lt;li&gt;Navigation Tree &lt;/li&gt; Like a Navigation List, but with hierarchical categories &lt;/ul&gt;
&lt;h2&gt;Security &lt;/h2&gt;
&lt;p&gt;Components that deal with identity and authorization.&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;Java EE Login&lt;/li&gt; This one would seem to be a no brainer, but it's actually a bit hard to get right. &lt;li&gt;Logout &lt;/li&gt; If you log in, you should be able to log out. &lt;li&gt;Register &lt;/li&gt; Probably not possible in a fully reusable way, since Java EE doesn't specify a standard registration API. &lt;li&gt;Forgotten Password/Username &lt;/li&gt; Same problem as Register &lt;li&gt;Capcha &lt;/li&gt; This would be very useful, but probably not amenable to standardization, since the robots keep getting smarter.
&lt;/ul&gt;
&lt;h2&gt;Simple Rich UI &lt;/h2&gt;
&lt;ul&gt; &lt;li&gt;Framebuster &lt;/li&gt; The war between the framers and the framebusters means that this will be obsolete almost immedately on release, but it might be worthwhile to try. &lt;li&gt;Tabbed Pane&lt;/li&gt; Basic Web component or rich component, depending on whether you use DHTML. Since DHTML is probably easier for the end user, it's my preference to have it in this list. &lt;li&gt;Spinner &lt;/li&gt; Increment an integer value by a set amount at the press of a button, or manually enter a number. Implemented as a demo in Mojarra 2.0. &lt;li&gt;Slider&lt;/li&gt; Analog slider to choose a numeric value, or manually enter a value. &lt;li&gt;Calendar&lt;/li&gt; Need to also include options to pick a date, or only a month, or even only pick a year. May be hard to do reusably, since styling matters so much. Wrapped a YUI Calendar widget as a component as a demo in Mojarra 2.0. &lt;li&gt;TimeSpinner&lt;/li&gt; A special case of a spinner, for picking a time. &lt;li&gt;ColorPicker&lt;/li&gt; A very special case, but easy to implement. &lt;li&gt;ModalWindow&lt;/li&gt; Alert box. &lt;li&gt;ModalDialog&lt;/li&gt; Alert box, with two or more buttons. &lt;li&gt;Popup Menu&lt;/li&gt; &lt;li&gt;FloatingWindow&lt;/li&gt; A detached embedded window, that you can move around within the HTML frame or window that contains it. After a brief burst of popularity, I've seen usage drop off. &lt;li&gt;Tag Cloud&lt;/li&gt; I'm frankly not convinced of the usefulness of this particular visualization, but many designers seem to love it. &lt;li&gt;TabularData &lt;/li&gt; A table that's modeled on a database set, rather than being explicitly bound to the HTML table. Would include sorting, at a minimum, and also probably reorder of rows. Maybe even filtering? &lt;li&gt;Menubar&lt;/li&gt; Drop down menu bar. Many HI people hate them on the web. &lt;li&gt;CommandBar (icon button) &lt;/li&gt; Essentially, a horizontal strip of buttons.
&lt;/ul&gt; &lt;h2&gt;Filthy Rich UI &lt;/h2&gt;
&lt;p&gt;Really elaborate graphical components. Harder to do as a standard, since styling becomes so important.&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;Carosel &lt;/li&gt; Like Apple's cover flow, flip through a set of images to select one. &lt;li&gt;Accordian&lt;/li&gt; Just because I've never seen it implemented well doesn't mean it's useless. &lt;li&gt;EditText (in place edit)&lt;/li&gt; Easy to do, but hard to get right, I've implemented it as a demo in Mojarra 2.0. &lt;li&gt;Shuttle (Switch List)&lt;/li&gt; Fairly common, I've implemented it as a demo in Mojarra 2.0. &lt;li&gt;ComboBox &lt;/li&gt; Essentially a static version of the AutoSuggest component, below. &lt;li&gt;Collapsible Tree&lt;/li&gt; Tomahawk has had a tree for years. &lt;li&gt;RichTextEdit &lt;/li&gt; Several good JavaScript widgets exist for this functionality. &lt;li&gt;RSSReader&lt;/li&gt; Update a page automaticially with the latest blog posts. Far more useful than you might first think, since many programs (like hudson, for instance) now export data as RSS. &lt;li&gt;Slideshow&lt;/li&gt; A fairly complex JavaScript widget. &lt;li&gt;Lightbox&lt;/li&gt; An incredibly complex JavaScript widget for organizing images. &lt;li&gt;Charting&lt;/li&gt; Incredibly complex, and incredibly useful, this is probably best done as a completely separate software product. Some JavaScript widgets already exist, and some JSF components already support this...
&lt;/ul&gt; &lt;h2&gt;Behaviors&lt;/h2&gt;
&lt;p&gt;Things that are probably best implemented as behaviors.&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;Tooltip&lt;/li&gt; Probably almost trival to implement. &lt;li&gt;DragAndDrop&lt;/li&gt; The opposite of trivial to implement, it could still be incredibly useful. Some support in various JSF component sets already. &lt;li&gt;Clientside Validation&lt;/li&gt; A customer request since year 2000.
&lt;/ul&gt; &lt;h2&gt;Ajax&lt;/h2&gt;
&lt;ul&gt; &lt;li&gt;AutoSuggest&lt;/li&gt; The "shopping cart" of the Ajax world. Note that Andy is working on a demo that implements this as a behavior. Supported as a component in some JSF component sets. &lt;li&gt;Poll&lt;/li&gt; Besides periodic updates, also handy for keeping sessions alive, and avoiding many cases of view expiration. Less necessary if we implement Comet, but probably still useful as simpler solution. &lt;li&gt;Map&lt;/li&gt; Relying on an external service means that this is probably not suitable for standardization. &lt;li&gt;Progress Indicator&lt;/li&gt; Progress of a server operation &lt;li&gt;Busy Status Indicator&lt;/li&gt; Essentially a binary version of Progress Status
&lt;/ul&gt; &lt;h3&gt;More?&lt;/h3&gt;
I'm sure I've left some out - suggest more in the comments...</description>
         <guid isPermaLink="false">291681 at http://www.java.net</guid>
         <pubDate>Wed, 14 Oct 2009 11:27:30 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/driscoll/archive/2009/10/14/almost-comprehensive-list-components</feedburner:origLink></item>
      <item>
         <title>Fresh 0.9.2 activerecord-jdbc-adapter Release</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/rrzEoIozFCk/fresh-0-9-2-activerecord-jdbc-adapter-release</link>
         <description>&lt;p&gt;As &lt;a rel="nofollow" target="_blank" href="http://markmail.org/message/mkwdu56wp74pj4tf"&gt;announced last week on the jruby&amp;#45;user list&lt;/a&gt;, 0&amp;#46;9&amp;#46;2, the latest &lt;code&gt;activerecord-jdbc-adapter&lt;/code&gt; release, has been pushed out&amp;#46; Please install the gem in the usual fashion and try it out on your applications&amp;#46;&lt;/p&gt; &lt;p&gt;One of the &lt;a rel="nofollow" target="_blank" href="http://jira.codehaus.org/browse/JRUBY-3502"&gt;most contentious bugs&lt;/a&gt; broke &lt;code&gt;db:create&lt;/code&gt; and &lt;code&gt;db:drop&lt;/code&gt;, ruining the quick&amp;#45;start workflow that Rails is known for&amp;#46; To fix this, a creative solution was needed that ended up bringing some nice benefits&amp;#46;&lt;/p&gt; &lt;p&gt;The problem stemmed from the fact that some database setup tasks in Rails 2&amp;#46;3 no longer load the environment; instead they just load the configuration data and work with that&amp;#46; This means that there is no easy way to hook into Rails and override those tasks, which is &lt;a rel="nofollow" target="_blank" href="http://github.com/nicksieger/activerecord-jdbc-adapter/blob/master/lib/jdbc_adapter/jdbc.rake"&gt;what activerecord&amp;#45;jdbc needs to do&lt;/a&gt;&amp;#46;&lt;/p&gt; &lt;p&gt;The solution I ended up with was to create a &lt;code&gt;jdbc&lt;/code&gt; Rails generator that inserts a couple files into your rails application that inject the JDBC logic into ActiveRecord and the database rake tasks&amp;#46; To wit:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;$ jruby script/generate jdbc exists config/initializers create config/initializers/jdbc.rb exists lib/tasks create lib/tasks/jdbc.rake
&lt;/code&gt;&lt;/pre&gt; &lt;p&gt;The upside of this new technique is that now that we have a way to ensure the JDBC adapter is properly injected into Rails, and you no longer need to use adapter names like &lt;code&gt;jdbcmysql&lt;/code&gt;, &lt;code&gt;jdbcsqlite3&lt;/code&gt; and the like&amp;#46; The net result is that &lt;strong&gt;database&amp;#46;yml no longer needs to be modified&lt;/strong&gt; for the default Rails databases (&lt;code&gt;mysql&lt;/code&gt;, &lt;code&gt;sqlite3&lt;/code&gt;, &lt;code&gt;postgresql&lt;/code&gt;)&amp;#46; So while we introduced one additional step in the process to bootstrap a Rails application under JRuby, the removal the step where &lt;code&gt;database.yml&lt;/code&gt; needs to be modified results in a more predictable workflow&amp;#46;&lt;/p&gt; &lt;p&gt;The new JRuby&amp;#45;specific Rails workflow looks like the following, assuming you&amp;#8217;ve installed the &lt;code&gt;activerecord-jdbc-adapter&lt;/code&gt; gem into JRuby, along with the appropriate database driver gem (e&amp;#46;g, &lt;code&gt;jdbc-mysql&lt;/code&gt;)&amp;#46; (Of course, the gems only need to be installed once per JRuby installation&amp;#46;)&lt;/p&gt; &lt;ol&gt;
&lt;li&gt;Create your Rails application as usual&amp;#46;&lt;/li&gt;
&lt;li&gt;Run the &lt;code&gt;jdbc&lt;/code&gt; generator as shown above&amp;#46;&lt;/li&gt;
&lt;li&gt;Profit!&lt;/li&gt;
&lt;/ol&gt; &lt;p&gt;Additionally, if you maintain a &lt;a rel="nofollow" target="_blank" href="http://m.onkey.org/2008/12/4/rails-templates"&gt;Rails application template&lt;/a&gt; that you use to start a new application, you can simply add &lt;code&gt;generate(:jdbc)&lt;/code&gt; to that template&amp;#8217;s script&amp;#46;&lt;/p&gt; &lt;p&gt;What&amp;#8217;s more, the presence of the JDBC files in your application are guarded and only inject JDBC support when running under JRuby, so you can safely keep them around when running Rails under multiple Ruby implementations&amp;#46;&lt;/p&gt; &lt;p&gt;For more details of what&amp;#8217;s in the release please consult the &lt;a rel="nofollow" target="_blank" href="http://rubyforge.org/forum/forum.php?forum_id=34972"&gt;mini&amp;#45;changelog on Rubyforge&lt;/a&gt; and the &lt;a rel="nofollow" target="_blank" href="http://kenai.com/jira/browse/ACTIVERECORD_JDBC/fixforversion/10195"&gt;list of fixed issues in JIRA&lt;/a&gt;&amp;#46;&lt;/p&gt;</description>
         <author>Nick Sieger</author>
         <guid isPermaLink="false">urn:uuid:65e528d4-1673-400f-b67c-60f97a152db4</guid>
         <pubDate>Mon, 12 Oct 2009 11:30:45 -0700</pubDate>
      <feedburner:origLink>http://blog.nicksieger.com/articles/2009/10/12/fresh-0-9-2-activerecord-jdbc-adapter-release</feedburner:origLink></item>
      <item>
         <title>JSF 2, Custom Java Components, and Ajax Behaviors</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/b6NI5RoIdXI/jsf-2-custom-java-components-and-ajax-behaviors</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;p&gt;Unlike most of my blog posts, where I try to describe the easiest possible way to do things, in this posting, I'll instead go over a Java-based custom JSF component that responds to the Ajax tag. The reason being that there simply aren't any examples out there of how to do this, and at least two people have expressed interest in finding exactly out how this is done. I'd advise anyone considering doing this to make &lt;i&gt;really&lt;/i&gt; sure that you can't do the same thing in a Composite Component (you usually can), but sometimes, a Java-based custom JSF component is going to be required.&lt;/p&gt;
&lt;p&gt;We're going to cover the following topics here, and it's going to be a little more code than usual, but I suspect that this will end up saving some folks a bunch of time, so lets plow forward. I'll cover:&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;Ajax listeners&lt;/li&gt; &lt;li&gt;Facelet components&lt;/li&gt; &lt;li&gt;Integrating the two&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;First, the Ajax Listener&lt;/h2&gt;
&lt;p&gt;An ajax listener, connected to your ajax event with the listener attribute, is a method that will be called every time the ajax request is made. For example, let's look at the following page section:&lt;/p&gt;
&lt;pre&gt; 1 Echo test: &amp;lt;h:outputText id="out" value="#{custom.hello}"/&amp;gt; 2 &amp;lt;br/&amp;gt; 3 Echo count: &amp;lt;h:outputText id="count" value="#{custom.count}"/&amp;gt; 4 &amp;lt;br/&amp;gt; 5 &amp;lt;h:inputText id="in" value="#{custom.hello}" autocomplete="off"&amp;gt; 6 &amp;lt;f:ajax event="keyup" render="out count eventcount" listener="#{custom.update}"/&amp;gt; 7 &amp;lt;/h:inputText&amp;gt; 8 &amp;lt;br/&amp;gt; 9 Event count: &amp;lt;h:outputText id="eventcount" value="#{custom.eventCount}"/&amp;gt;
&lt;/pre&gt;
&lt;p&gt;We've got three bean properties - hello (which is the string entered by the inputText), count (which is a count of the characters in hello, and eventCount (which is a count of the number of ajax requests). We also have a method on the bean, update (line 6), which will be called every time the ajax call is submitted.&lt;/p&gt;
&lt;p&gt;The behavior of this page is pretty simple - every time you press a character in the inputText, the complete value of the input is echoed to the outputText "out" (line 1) - the length of "out" is written to "count" (line 3), and the "eventCount" outputText (line 9) has it's value incremented by one.&lt;/p&gt;
&lt;p&gt;So - what code is in the bean? Here's the relevant bits:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt; 1 public void setHello(String hello) { 2 this.hello = hello; 3 } 4 public int getCount() { 5 return count; 6 } 7 public int getEventCount() { 8 return eventCount; 9 } 10 public void update(AjaxBehaviorEvent event) { 11 count = hello.length(); 12 eventCount++; 13 }
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Not so bad - the only thing new here is that AjaxBehaviorEvent class - and we're not even using it. The update method will simply set up the values to be correct, and we let the Ajax render to the rest. So - listeners are easy.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Facelets Components&lt;/h2&gt;
&lt;p&gt;Now, we'll want to create a custom tag in Java. To do that, we'll need to make a few configuration file entries, and write a little java code. But first, let's see it used in the page:&lt;/p&gt;
&lt;p&gt;In the XHTML header, we'll say:&lt;/p&gt;
&lt;pre&gt; 1 &amp;lt;html xmlns="http://www.w3.org/1999/xhtml" 2 xmlns:ui="http://java.sun.com/jsf/facelets" 3 xmlns:h="http://java.sun.com/jsf/html" 4 xmlns:f="http://java.sun.com/jsf/core" 5 xmlns:cu="http://javaserverfaces.dev.java.net/demo/custom-taglib"&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Setting up the "cu" prefix (line 5) to point to "custom-taglib" (the whole URL is significant). Then later on in the page, we'll use it like so:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;cu:custom id="customId"&amp;gt;
&lt;/pre&gt;
&lt;p&gt;We then need to add an entry in web.xml:&lt;/p&gt;
&lt;pre&gt; 1 &amp;lt;context-param&amp;gt; 2 &amp;lt;param-name&amp;gt;javax.faces.FACELETS_LIBRARIES&amp;lt;/param-name&amp;gt; 3 &amp;lt;param-value&amp;gt;/WEB-INF/custom-taglib.xml&amp;lt;/param-value&amp;gt; 4 &amp;lt;/context-param&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This points to our next config file, which is the filename on line 3. Here's its contents, in full:&lt;/p&gt;
&lt;pre&gt; 1 &amp;lt;facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee &lt;a rel="nofollow" target="_blank" href="http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"" title="http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd""&gt;http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"&lt;/a&gt; 4 version="2.0"&amp;gt; 5 &amp;lt;namespace&amp;gt;http://javaserverfaces.dev.java.net/demo/custom-taglib&amp;lt;/namespace&amp;gt; 6 &amp;lt;tag&amp;gt; 7 &amp;lt;tag-name&amp;gt;custom&amp;lt;/tag-name&amp;gt; 8 &amp;lt;component&amp;gt; 9 &amp;lt;component-type&amp;gt;mycustom&amp;lt;/component-type&amp;gt; 10 &amp;lt;/component&amp;gt; 11 &amp;lt;/tag&amp;gt; 12 &amp;lt;/facelet-taglib&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Note that the namespace element on line 5 matches the URL we used for the namespace in the html element of the using page. We said this taglibrary will have one tag "custom" (line 7), which maps to the FacesComponent "mycustom". Where does it find the definition of "mycustom"? In the Java file defining the component, using the new @FacesComponent attribute. Here's the full Java code, leaving out the imports:&lt;/p&gt;
&lt;pre&gt; 1 @FacesComponent(value = "mycustom") 2 public class MyCustom extends UIComponentBase { 3 4 @Override 5 public String getFamily() { 6 return "custom"; 7 } 8 9 @Override 10 public void encodeEnd(FacesContext context) throws IOException { 11 12 ResponseWriter responseWriter = context.getResponseWriter(); 13 responseWriter.startElement("div", null); 14 responseWriter.writeAttribute("id",getClientId(context),"id"); 15 responseWriter.writeAttribute("name", getClientId(context),"clientId"); 16 responseWriter.write("Howdy!"); 17 responseWriter.endElement("div"); 18 } 19 }
&lt;/pre&gt;
&lt;p&gt;In fact, the Java code itself is simple enough that I don't really think it requires any explanation. Putting the cu:custom tag in your page will now render Howdy!, surrounded by a div with the same id and name as you gave the component. All that's left is to add the Ajax. That... is a bit more complicated, but now that we've handled everything else, it's really just incremental.&lt;/p&gt;
&lt;h2&gt;Using f:ajax with your custom tag&lt;/h2&gt;
&lt;p&gt;To use the f:ajax tag, we'd like to, for instance, do something like this:&lt;/p&gt;
&lt;pre&gt; 1 &amp;lt;cu:custom id="customId"&amp;gt; 2 &amp;lt;f:ajax render="eventcount" listener="#{custom.updateEventCount}"/&amp;gt; 3 &amp;lt;/cu:custom&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Meaning, we'd like to just decorate the tag, and let it do something "smart". In this case, we'll default to "onclick" (since we're dealing with a div, after all, we could also default to "onmouseover", for instance). It'd also be nice if we could still call the ajax listener. That'll require a bit more code. Here's the full Java component, with the additional ajax code. I'll go over it at the end:&lt;/p&gt;
&lt;pre&gt; 1 @FacesComponent(value = "mycustom") 2 public class MyCustom extends UIComponentBase implements ClientBehaviorHolder { 3 4 @Override 5 public String getFamily() { 6 return "custom"; 7 } 8 9 @Override 10 public void encodeEnd(FacesContext context) throws IOException { 11 12 ClientBehaviorContext behaviorContext = 13 ClientBehaviorContext.createClientBehaviorContext(context, 14 this, "click", getClientId(context), null); 15 16 ResponseWriter responseWriter = context.getResponseWriter(); 17 responseWriter.startElement("div", null); 18 responseWriter.writeAttribute("id",getClientId(context),"id"); 19 responseWriter.writeAttribute("name", getClientId(context),"clientId"); 20 Map&amp;lt;String,List&amp;lt;ClientBehavior&amp;gt;&amp;gt; behaviors = getClientBehaviors(); 21 if (behaviors.containsKey("click") ) { 22 String click = behaviors.get("click").get(0).getScript(behaviorContext); 23 responseWriter.writeAttribute("onclick", click, null); 24 } 25 responseWriter.write("Click me!"); 26 responseWriter.endElement("div"); 27 } 28 29 30 @Override 31 public void decode(FacesContext context) { 32 Map&amp;lt;String, List&amp;lt;ClientBehavior&amp;gt;&amp;gt; behaviors = getClientBehaviors(); 33 if (behaviors.isEmpty()) { 34 return; 35 } 36 37 ExternalContext external = context.getExternalContext(); 38 Map&amp;lt;String, String&amp;gt; params = external.getRequestParameterMap(); 39 String behaviorEvent = params.get("javax.faces.behavior.event"); 40 41 if (behaviorEvent != null) { 42 List&amp;lt;ClientBehavior&amp;gt; behaviorsForEvent = behaviors.get(behaviorEvent); 43 44 if (behaviors.size() &amp;gt; 0) { 45 String behaviorSource = params.get("javax.faces.source"); 46 String clientId = getClientId(context); 47 if (behaviorSource != null &amp;&amp; behaviorSource.equals(clientId)) { 48 for (ClientBehavior behavior: behaviorsForEvent) { 49 behavior.decode(context, this); 50 } 51 } 52 } 53 } 54 } 55 56 @Override 57 public Collection&amp;lt;String&amp;gt; getEventNames() { 58 return Arrays.asList("click"); 59 } 60 61 @Override 62 public String getDefaultEventName() { 63 return "click"; 64 } 65 }
&lt;/pre&gt;
&lt;p&gt;At 65 lines, this is probably the longest code example I've ever posted, but most of this is either really easy, or stuff you've seen in the previous section. First, we define what Ajax events we'll accept ("click") and what one is the default ("click" again), on lines 56-64. These are part of the ClientBehaviorHolder interface (line 2). We also had to add a little code to the encodeEnd method, so that we correctly output the DOM event script as part of the div (lines 12-14, 20-24). And lastly, we needed to add a decode method, since our component is no longer output only - the ajax event handling code is always part of the decode process (lines 31-50). This is the part where we actually make sure that that listener is being called.&lt;/p&gt;
&lt;p&gt;Did I mention that you can do pretty much the same thing in a composite component?&amp;nbsp; That'll be the subject of a future blog.&lt;/p&gt;
&lt;p&gt;Well, I warned you this was a little more complex - hopefully it's all fairly clear. If it isn't - ask in the comments.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
         <guid isPermaLink="false">288577 at http://www.java.net</guid>
         <pubDate>Fri, 09 Oct 2009 16:30:48 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/driscoll/archive/2009/10/09/jsf-2-custom-java-components-and-ajax-behaviors</feedburner:origLink></item>
      <item>
         <title>JSF2 and POST Redirect GET</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/3VXNQ7JwpA4/jsf2-and-post-redirect-get</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;img border="0" align="left"/&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://bit.ly/5qrXJ"&gt;&lt;img style="float:left;"
 src="http://www.java.net/sites/default/files/jsf2-prg.png" alt="Atoning
for the sins of the past"/&gt;&lt;/a&gt;The image on the left is a screengrab I
took when I was reviewing content for my upcoming book, with Neil
Griffin, &lt;a rel="nofollow" target="_blank" href="http://bit.ly/5qrXJ"&gt;JavaServer Faces 2.0: The
Complete Reference&lt;/a&gt;. I consider this little snippet an atonment for
the HTTP violations of JSF versions past (before I was spec lead).
Sorry about that.&lt;/p&gt; &lt;p&gt;For the record, the article referred to in the book is at &amp;lt;&lt;a rel="nofollow" target="_blank" href="http://www.theserverside.com/tt/articles/article.tss?l=RedirectAfterPost"&gt;http://www.theserverside.com/tt/articles/article.tss?l=RedirectAfterPost&lt;/a&gt;&amp;gt;.&lt;/p&gt; &lt;p&gt;&lt;span class="technoratitag"&gt; Technorati Tags: &lt;a rel="nofollow" target="_blank" href="http://www.technorati.com/tags/edburns"&gt;edburns&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;table id="attachments" class="sticky-enabled"&gt; &lt;thead&gt;&lt;tr&gt;&lt;th&gt;Attachment&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt; &lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt; &lt;tr class="odd"&gt;&lt;td&gt;&lt;a rel="nofollow" target="_blank" href="http://www.java.net/sites/default/files/jsf2-prg.png"&gt;jsf2-prg.png&lt;/a&gt;&lt;/td&gt;&lt;td&gt;102.27 KB&lt;/td&gt; &lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
         <guid isPermaLink="false">287713 at http://www.java.net</guid>
         <pubDate>Thu, 08 Oct 2009 18:56:35 -0700</pubDate>
         
      <feedburner:origLink>http://www.java.net/blog/edburns/archive/2009/10/08/jsf2-and-post-redirect-get</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/GlassFish-webtier/~5/Q-aFbaCrUPA/jsf2-prg.png" length="104729" type="image/png" /><feedburner:origEnclosureLink>http://www.java.net/sites/default/files/jsf2-prg.png</feedburner:origEnclosureLink></item>
      <item>
         <title>Atmosphere at Oracle OpenWorld Unconference</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/R1F250Cwb4w/atmosphere-oracle-openworld-unconference</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;div class="field field-type-filefield field-field-thumb-100x70"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item odd"&gt;&lt;img class="imagefield imagefield-field_thumb_100x70" width="73" height="73" alt="" src="http://www.java.net/sites/default/files/jfarcand/med_bigger.jpg?1254961213"/&gt;    &lt;/div&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://twitter.com/jfarcand"&gt;@jfarcand&lt;/a&gt; will talk about &lt;a rel="nofollow" target="_blank" href="http://atmosphere.dev.java.net"&gt;the Atmosphere Framework&lt;/a&gt; at the upcoming &lt;a rel="nofollow" target="_blank" href="http://wiki.oracle.com/page/The+Atmospher+Framework"&gt;Oracle OpenWorld (October 13th Tuesday, 1-2pm)&lt;/a&gt;. If you are around, come to learn what is Atmosphere and how you can write RESTful and Asynchronous Web (Comet/Ajax Push) application using Scala, JRuby, Java or Groovy!&lt;/p&gt;
&lt;p&gt;
&lt;img alt="IMG_0347.JPG" src="http://weblogs.java.net/sites/default/files/100_0014.jpg" width="640" height="400"/&gt;
&lt;/p&gt;
&lt;p&gt;I&amp;nbsp;will describe what is the Atmosphere Framework and its components, where the community is and how our next release 0.4 is going, demonstrate the framework power using JRuby, Scala, Java and Groovy (via the new Atmosphere Grails Plug In).&amp;nbsp; I will also talk about the role of the framework in &lt;a rel="nofollow" target="_blank" href="http://wiki.github.com/jboner/akka"&gt;akka&lt;/a&gt; (RESTFul Distributed Persistent Transactional Actors),&amp;nbsp; and conclude by transforming &lt;a rel="nofollow" target="_blank" href="http://glassfish.dev.java.net"&gt;GlassFish V3&lt;/a&gt; into an Atmosphere-OSGI-only Server. Sound like a lot of buzzwords, does it! If you can't come, &lt;a rel="nofollow" target="_blank" href="http://twitter.com/atmosphere_java"&gt;just follow us on Twitter&lt;/a&gt; since everything about the framework and its evolution are twitted on line. &lt;/p&gt; &lt;p&gt;
 
 
technorati: &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/atmosphere+framework"&gt;atmosphere framework&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/cluster"&gt;cluster&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/comet"&gt;comet&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/scala"&gt;scala&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/ajax"&gt;ajax&lt;/a&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">286437 at http://www.java.net</guid>
         <pubDate>Wed, 07 Oct 2009 17:32:32 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/jfarcand/archive/2009/10/07/atmosphere-oracle-openworld-unconference</feedburner:origLink></item>
      <item>
         <title>TOTD #111: Rails Scaffold for a pre-existing table using Oracle and GlassFish</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/FubfmwmeeGc/http_blog_arungupta_me_2009</link>
         <description>Content available at: &lt;a rel="nofollow" target="_blank" href="http://blog.arungupta.me/2009/10/totd-111-rails-scaffold-for-a-pre-existing-table-using-oracle-and-glassfish/"&gt;http://blog.arungupta.me/2009/10/totd-111-rails-scaffold-for-a-pre-existing-table-using-oracle-and-glassfish/&lt;/a&gt;.</description>
         <author>arungupta</author>
         <guid isPermaLink="false">http://blogs.sun.com/arungupta/entry/http_blog_arungupta_me_2009</guid>
         <pubDate>Wed, 07 Oct 2009 03:31:41 -0700</pubDate>
      <feedburner:origLink>http://blogs.sun.com/arungupta/entry/http_blog_arungupta_me_2009</feedburner:origLink></item>
      <item>
         <title>TOTD #110: JRuby on Rails application using Oracle on GlassFish</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/lOzbBd5Jvr8/totd_110_jruby_on_rails</link>
         <description>Content available at: &lt;a rel="nofollow" target="_blank" href="http://blog.arungupta.me/2009/10/totd-110-jruby-on-rails-application-using-oracle-on-glassfish/"&gt;http://blog.arungupta.me/2009/10/totd-110-jruby-on-rails-application-using-oracle-on-glassfish/&lt;/a&gt;.</description>
         <author>arungupta</author>
         <guid isPermaLink="false">http://blogs.sun.com/arungupta/entry/totd_110_jruby_on_rails</guid>
         <pubDate>Tue, 06 Oct 2009 16:00:00 -0700</pubDate>
      <feedburner:origLink>http://blogs.sun.com/arungupta/entry/totd_110_jruby_on_rails</feedburner:origLink></item>
      <item>
         <title>Slides for JSF 2 and Ajax</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/g33GiemFK7U/slides-jsf-2-and-ajax</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;p&gt;
I've placed my slides for my JSF 2 and Ajax talk &lt;a rel="nofollow" target="_blank" href="http://www.slideshare.net/jimdriscoll/jsf-2-and-ajax"&gt;up on slideshare&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Check 'em out, and ask questions in the comments.
&lt;/p&gt;</description>
         <guid isPermaLink="false">283551 at http://www.java.net</guid>
         <pubDate>Mon, 05 Oct 2009 09:33:21 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/driscoll/archive/2009/10/05/slides-jsf-2-and-ajax</feedburner:origLink></item>
      <item>
         <title>Mixing Ajax and full requests in JSF 2.0</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/Dhnad08cD9A/mixing-ajax-and-full-requests-jsf-20</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;p&gt;JSF 2.0 makes ajax pretty easy - but it can't hide everything from you... It's tempting to just add a few ajax tags into your page, and not worry too much about interactions - here's one example of a problem you may run into.&lt;/p&gt;
&lt;p&gt;Let's say you've got a page with an input text, and a command button - like this:&lt;/p&gt;
&lt;pre&gt; 1 &amp;lt;h:form&amp;gt; 2 &amp;lt;h:inputText value="#{blah.blah}"&amp;gt; 3 &amp;lt;/h:inputText&amp;gt; 4 &amp;lt;h:commandButton/&amp;gt; 5 &amp;lt;/h:form&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Now, we decide to add an ajax tag:&lt;/p&gt;
&lt;pre&gt; 1 &amp;lt;h:form&amp;gt; 2 &amp;lt;h:inputText value="#{blah.blah}"&amp;gt; 3 &amp;lt;f:ajax event="blur"/&amp;gt; 4 &amp;lt;/h:inputText&amp;gt; 5 &amp;lt;h:commandButton/&amp;gt; 6 &amp;lt;/h:form&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Can you spot what's wrong with this example? When we push the button, we're also blurring the inputText. That means that the ajax request is sent - but then, almost immediately, that request is canceled as the whole page is reloaded.&lt;/p&gt;
&lt;p&gt;Is this a bad thing? For this simple example, not so much. There's going to be a broken connection - and that can be a grim problem for a large server, especially if you start getting one on each page, for each use.&lt;/p&gt;
&lt;p&gt;But the real issue is that you've just set up a race condition. Imagine instead you did this:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt; 1 &amp;lt;h:form&amp;gt; 2 &amp;lt;h:inputText value="#{blah.blah}"&amp;gt; 3 &amp;lt;f:ajax event="blur" listener="#{bean.somethingthatchangesstate}"/&amp;gt; 4 &amp;lt;/h:inputText&amp;gt; 5 &amp;lt;h:commandButton/&amp;gt; 6 &amp;lt;/h:form&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Now we've got a real problem from that race condition - did the listener execute? Maybe. Maybe is never a good answer in software.&lt;/p&gt;
&lt;p&gt;So - what to do?&lt;/p&gt;
&lt;p&gt;Probably the best solution is also the simplest:&lt;/p&gt;
&lt;pre&gt; 1 &amp;lt;h:form&amp;gt; 2 &amp;lt;h:inputText value="#{blah.blah}"&amp;gt; 3 &amp;lt;f:ajax event="blur" listener="#{bean.somethingthatchangesstate}"/&amp;gt; 4 &amp;lt;/h:inputText&amp;gt; 5 &amp;lt;h:commandButton&amp;gt; 6 &amp;lt;f:ajax render="@form"&amp;gt; 7 &amp;lt;/h:commandButton&amp;gt; 8 &amp;lt;/h:form&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Switching to ajax for the commandButton will now provide a predictable call sequence.&lt;/p&gt;
&lt;p&gt;One more issue: When the two connections are submitted simultaneously, an error alert may be produced. I just updated that error to say: "The Http Transport returned a 0 status code. This is usually the result of mixing ajax and full requests. This is usually undesired, for both performance and data integrity reasons." What happens if you &lt;b&gt;want&lt;/b&gt; to do this? Well, the error alert only shows up under two conditions, both of which must be true - the Project Stage must be Development, and there must be no error listener set. So, if you're really sure you want to mix ajax and full requests, despite what I said above, just set up an error listener for your ajax code - you'll want to anyway for a production environment.&lt;/p&gt;
&lt;p&gt;As always, if you have questions, please ask in the comments.&lt;/p&gt;</description>
         <guid isPermaLink="false">281751 at http://www.java.net</guid>
         <pubDate>Thu, 01 Oct 2009 18:20:54 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/driscoll/archive/2009/10/01/mixing-ajax-and-full-requests-jsf-20</feedburner:origLink></item>
      <item>
         <title>JSF 2.0 Reminder: Project Stage</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/T2KW8CDGxQQ/jsf-20-reminder-project-stage</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;p&gt;Just a reminder that while you are developing a JSF 2.0 project, you really, really, &lt;b&gt;really&lt;/b&gt; should enable the Development Project Stage. Doing this enables better error messages, including in the client side JavaScript, at the cost of some performance.&lt;/p&gt;
&lt;p&gt;Enabling this is as simple as putting the below into your web.xml:&lt;/p&gt;
&lt;p&gt;&amp;lt;context-param&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;param-name&amp;gt;javax.faces.PROJECT_STAGE&amp;lt;/param-name&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;param-value&amp;gt;Development&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;/p&gt;
&lt;p&gt;When going into production, simply change the project stage to Production, like so:&lt;/p&gt;
&lt;p&gt;&amp;lt;context-param&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;param-name&amp;gt;javax.faces.PROJECT_STAGE&amp;lt;/param-name&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;param-value&amp;gt;Production&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;/p&gt;
&lt;p&gt;This will turn off some error messages, and emphasize performance.&lt;/p&gt;</description>
         <guid isPermaLink="false">278468 at http://www.java.net</guid>
         <pubDate>Mon, 28 Sep 2009 11:16:04 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/driscoll/archive/2009/09/28/jsf-20-reminder-project-stage</feedburner:origLink></item>
      <item>
         <title>Jython 2.5.1 Final is out!</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/yu4yz50cRjU/jython-251-final-is-out.html</link>
         <description>On behalf of the Jython development team, I'm pleased to announce that Jython 2.5.1 final is available for &lt;a rel="nofollow" target="_blank" href="https://sourceforge.net/projects/jython/files/jython/2.5.1/jython_installer-2.5.1.jar/download"&gt;download&lt;/a&gt;. See the &lt;a rel="nofollow" target="_blank" href="http://wiki.python.org/jython/InstallationInstructions"&gt;installation instructions&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Jython 2.5.1 fixes a number of bugs, including some major errors when using coroutines and when using relative imports, as well as a potential data loss bug when writing to files in append mode. Please see the NEWS file for detailed release notes.&lt;br /&gt;&lt;br /&gt;Please &lt;a rel="nofollow" target="_blank" href="http://bugs.jython.org"&gt;report any bugs&lt;/a&gt; that you find. Thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14276139-5933807826971952652?l=fwierzbicki.blogspot.com'/&gt;&lt;/div&gt;</description>
         <author>Frank Wierzbicki</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-14276139.post-5933807826971952652</guid>
         <pubDate>Sat, 26 Sep 2009 07:36:00 -0700</pubDate>
      <feedburner:origLink>http://fwierzbicki.blogspot.com/2009/09/jython-251-final-is-out.html</feedburner:origLink></item>
      <item>
         <title>Jython 2.5.1 Release Candidate 3 is out</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/ijXdDtHwyWs/jython-251-release-candidate-3-is-out.html</link>
         <description>On behalf of the Jython development team, I'm pleased to announce that Jython 2.5.1rc3 is available for &lt;a rel="nofollow" target="_blank" href="https://sourceforge.net/projects/jython/files/jython-dev/2.5.1rc3/jython_installer-2.5.1rc3.jar/download"&gt;download&lt;/a&gt;. See the &lt;a rel="nofollow" target="_blank" href="http://wiki.python.org/jython/InstallationInstructions"&gt;installation instructions&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I didn't really want to have an RC3, I was hoping to have a final by now, but a data loss bug was discovered in RC2 and that prompted one more RC. I'm hoping that this is the last one and that we'll have a final shortly. Please see the NEWS file for detailed release notes.&lt;br /&gt;&lt;br /&gt;Please &lt;a rel="nofollow" target="_blank" href="http://bugs.jython.org"&gt;report any bugs&lt;/a&gt; that you find. Thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14276139-168143111420495921?l=fwierzbicki.blogspot.com'/&gt;&lt;/div&gt;</description>
         <author>Frank Wierzbicki</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-14276139.post-168143111420495921</guid>
         <pubDate>Wed, 23 Sep 2009 14:54:00 -0700</pubDate>
      <feedburner:origLink>http://fwierzbicki.blogspot.com/2009/09/jython-251-release-candidate-3-is-out.html</feedburner:origLink></item>
      <item>
         <title>TOTD #104: GlassFish v3 Monitoring – How to monitor a Rails app using asadmin, JavaScript, jConsole, REST ?</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/ntYaGEIfB-c/totd_104_glassfish_v3_monitoring</link>
         <description>Content available at: &lt;a rel="nofollow" target="_blank" href="http://blog.arungupta.me/2009/09/totd-104-glassfish-v3-monitoring-how-to-monitor-a-rails-app-using-asadmin-javascript-jconsole-rest/"&gt;http://blog.arungupta.me/2009/09/totd-104-glassfish-v3-monitoring-how-to-monitor-a-rails-app-using-asadmin-javascript-jconsole-rest/&lt;/a&gt;</description>
         <author>arungupta</author>
         <guid isPermaLink="false">http://blogs.sun.com/arungupta/entry/totd_104_glassfish_v3_monitoring</guid>
         <pubDate>Tue, 22 Sep 2009 23:00:53 -0700</pubDate>
      <feedburner:origLink>http://blogs.sun.com/arungupta/entry/totd_104_glassfish_v3_monitoring</feedburner:origLink></item>
      <item>
         <title>Video from Secrets of the Rockstar Programmers at Jazoon on Parleys</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/w8YqugzJDCQ/video-secrets-rockstar-programmers-jazoon-parleys</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;img border="0" align="left"/&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://purl.oclc.org/NET/RidingTheCrest/Show"&gt;&lt;img
 style="float:left;" src="http://ridingthecrest.com/author-jazoon-2009.png" width="269" height="147" alt=""/&gt;&lt;/a&gt;Ed
has developed a 50 minute audio-visual presentation recounting his
experience in writing the book. This presentation includes audio clips
from the programmers themselves, including subtitles for those for whom
English is not their native language, together with insight to tie it
all together.&lt;/p&gt; &lt;p&gt;Ed has given this presentation at numerous international developer
conferences and user groups around the world, including JAX in Germany,
Jazoon in Switzerland, The Developer's Conference in S&amp;atilde;o Paulo,
Brazil and the Rich Web Experience in U.S.A..&lt;/p&gt; &lt;h2&gt;See the presentation online now!&lt;/h2&gt; &lt;p&gt;Audio and Video from Ed's presentation at Jazoon 2009 is available at
Parleys.com, at the URL: &amp;lt;&lt;a rel="nofollow"
 target="_blank" href="http://purl.oclc.org/NET/RidingTheCrest/Show"&gt;http://purl.oclc.org/NET/RidingTheCrest/Show&lt;/a&gt;&amp;gt;.
Unfortunately, the subtitles did not come through on this presentation,
but those viewing the presentation live do see them.&lt;/p&gt; &lt;p&gt;&lt;span class="technoratitag"&gt; Technorati Tags: &lt;a rel="nofollow" target="_blank" href="http://www.technorati.com/tags/edburns"&gt;edburns&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;</description>
         <guid isPermaLink="false">274954 at http://www.java.net</guid>
         <pubDate>Tue, 22 Sep 2009 18:30:09 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/edburns/archive/2009/09/22/video-secrets-rockstar-programmers-jazoon-parleys</feedburner:origLink></item>
      <item>
         <title>Free Rails/GlassFish Webinar with live Q&amp;A: Sep 23, 2009,10am PT</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/Uk7zJdGdYdk/free_rails_glassfish_webinar_with</link>
         <description>&lt;p&gt;Content available at: &lt;a rel="nofollow" target="_blank" href="http://blog.arungupta.me/2009/09/free-railsglassfish-webinar-with-live-qa-sep-23-200910am-pt/"&gt;http://blog.arungupta.me/2009/09/free-railsglassfish-webinar-with-live-qa-sep-23-200910am-pt/&lt;/a&gt;&lt;/p&gt;</description>
         <author>arungupta</author>
         <guid isPermaLink="false">http://blogs.sun.com/arungupta/entry/free_rails_glassfish_webinar_with</guid>
         <pubDate>Fri, 18 Sep 2009 05:00:00 -0700</pubDate>
      <feedburner:origLink>http://blogs.sun.com/arungupta/entry/free_rails_glassfish_webinar_with</feedburner:origLink></item>
      <item>
         <title>Popular Ruby-on-Rails applications on GlassFish v3 – Redmine, Typo, Substruct</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/z1Iw39kjnNI/popular_ruby_on_rails_applications</link>
         <description>&lt;br&gt;Content available at: &lt;a rel="nofollow" target="_blank" href="http://blog.arungupta.me/2009/09/redmine-typo-mephisto-on-glassfish-v3/"&gt;http://blog.arungupta.me/2009/09/redmine-typo-mephisto-on-glassfish-v3/&lt;/a&gt;&lt;br&gt;&lt;br&gt;</description>
         <author>arungupta</author>
         <guid isPermaLink="false">http://blogs.sun.com/arungupta/entry/popular_ruby_on_rails_applications</guid>
         <pubDate>Thu, 17 Sep 2009 23:14:51 -0700</pubDate>
      <feedburner:origLink>http://blogs.sun.com/arungupta/entry/popular_ruby_on_rails_applications</feedburner:origLink></item>
      <item>
         <title>PyCon 2010 Call For Talks Ends Soon!</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/ZMGFYAftyHA/pycon-2010-call-for-talks-ends-soon.html</link>
         <description>If you where thinking about &lt;a rel="nofollow" target="_blank" href="http://us.pycon.org/2010/conference/proposals/"&gt;submitting a talk&lt;/a&gt; to &lt;a rel="nofollow" target="_blank" href="http://us.pycon.org/2010/about/"&gt;PyCon 2010&lt;/a&gt; you should do it now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14276139-5834467030405262944?l=fwierzbicki.blogspot.com'/&gt;&lt;/div&gt;</description>
         <author>Frank Wierzbicki</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-14276139.post-5834467030405262944</guid>
         <pubDate>Wed, 16 Sep 2009 13:20:00 -0700</pubDate>
      <feedburner:origLink>http://fwierzbicki.blogspot.com/2009/09/pycon-2010-call-for-talks-ends-soon.html</feedburner:origLink></item>
      <item>
         <title>Grizzly 1.9.18 is out</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/m-LZxsxv7G0/grizzly-1918-out</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;div class="field field-type-filefield field-field-thumb-100x70"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item odd"&gt;&lt;img class="imagefield imagefield-field_thumb_100x70" width="73" height="73" alt="" src="http://www.java.net/sites/default/files/GrizzlyLogo-Twitter-73x73_bigger.gif?1252948412"/&gt;    &lt;/div&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We have been quiet for awhile with the monster...but we keep making improvements, and this week the team is proud to announce the GA availability of 1.9.18&lt;/p&gt;
&lt;img alt="IMG_0347.JPG" src="http://weblogs.java.net/sites/default/files/100_0520.JPG" width="640" height="400"/&gt;
&lt;p&gt;This version doesn't contains any new features as we have focused on performance and fixing bugs. The change logs can be found &lt;a rel="nofollow" target="_blank" href="http://is.gd/39uZX"&gt;here&lt;/a&gt;. Note that we are more and more to work on the &lt;a rel="nofollow" target="_blank" href="https://grizzly-servlet-container.dev.java.net/"&gt;Grizzly Servlet Container&lt;/a&gt; and make it pass the Servlet 2.5 TCKs. Hopefully before the end of the year we will have it working on both Grizzly 1.9.x and 2.0.0! On The Grizzly 2.0.0 side, we have been swamped by the upcoming GlassFish v3 release all summer (hopefully Oracle allow us more resources :-))....but 1.9.18 should be the last one integrated in v3, hence we will resume our full time work on completing Grizzly 2.0.0. GlassFish v3 is a &lt;strong&gt;heavy user&lt;/strong&gt; of the Grizzly HTTP Framework: ALL Scripting language support: JRuby, Python and Groovy, the Admin CLI, &lt;a rel="nofollow" target="_blank" href="http://blogs.sun.com/theaquarium/entry/glassfish_v3_monitoring_dtrace_rest"&gt;Monitoring/Management REST&amp;nbsp;API&lt;/a&gt; (with the help of Jersey's GrizzlyAdapter), EJB WebServices, Java WebStart, etc.....&lt;/p&gt;&lt;p&gt;Finally, one interesting use of Grizzly can be seen with the &lt;a rel="nofollow" target="_blank" href="http://atmosphere.dev.java.net"&gt;Atmosphere Framework&lt;/a&gt;, which offer an &lt;a rel="nofollow" target="_blank" href="http://weblogs.java.net/blog/jfarcand/archive/2009/09/10/writing-comet-applications-using-jruby-and-atmosphere-framework"&gt;end to end stack&lt;/a&gt; for writing Comet and REST applications with the help of &lt;a rel="nofollow" target="_blank" href="http://jersey.dev.java.net"&gt;Jersey.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For any questions or to download samples and tutorials, go to &lt;a rel="nofollow" target="_blank" href="http://grizzly.dev.java.net"&gt;our main site&lt;/a&gt; and use our &lt;a rel="nofollow" target="_blank" href="http://www.nabble.com/Grizzly---Users-f23249.html"&gt;Nabble forum&lt;/a&gt; (no subscription needed) or &lt;a rel="nofollow" target="_blank" href="http://twitter.com/project_grizzly"&gt;follow us on Twitter&lt;/a&gt; and tweet your questions there!&lt;/p&gt;&lt;p&gt;
 
&lt;/p&gt; 
&lt;p&gt;technorati: &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/grizzly"&gt;grizzly&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/nio+frameowkr"&gt;nio framework&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/embedded"&gt;embedded&lt;/a&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">268460 at http://www.java.net</guid>
         <pubDate>Mon, 14 Sep 2009 10:13:39 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/jfarcand/archive/2009/09/14/grizzly-1918-out</feedburner:origLink></item>
      <item>
         <title>Jython 2.5.1 Release Candidate 2 is out!</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/bt3yCF4t818/jython-251-release-candidate-2-is-out.html</link>
         <description>On behalf of the Jython development team, I'm pleased to announce that Jython 2.5.1rc2 is available for &lt;a rel="nofollow" target="_blank" href="https://sourceforge.net/projects/jython/files/jython-dev/2.5.1rc2/jython_installer-2.5.1rc2.jar/download"&gt;download&lt;/a&gt;. See the &lt;a rel="nofollow" target="_blank" href="http://wiki.python.org/jython/InstallationInstructions"&gt;installation instructions&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Jython 2.5.1rc2 fixes bugs that we found when testing rc1, including some db, codec, and locking issues. Please see the NEWS file for detailed release notes.&lt;br /&gt;&lt;br /&gt;Please &lt;a rel="nofollow" target="_blank" href="http://bugs.jython.org"&gt;report any bugs&lt;/a&gt; that you find. Thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14276139-8470220654451474773?l=fwierzbicki.blogspot.com'/&gt;&lt;/div&gt;</description>
         <author>Frank Wierzbicki</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-14276139.post-8470220654451474773</guid>
         <pubDate>Sat, 12 Sep 2009 08:04:00 -0700</pubDate>
      <feedburner:origLink>http://fwierzbicki.blogspot.com/2009/09/jython-251-release-candidate-2-is-out.html</feedburner:origLink></item>
      <item>
         <title>JRubyConf 2009: First of Many!</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/dHfbqisLM0c/jrubyconf-2009-first-of-many</link>
         <description>&lt;p&gt;I&amp;#8217;m so excited to see the news finally hit the wire today about the paint drying on the plans for &lt;a rel="nofollow" target="_blank" href="http://jrubyconf.com/"&gt;JRubyConf 2009&lt;/a&gt;! &lt;/p&gt; &lt;p&gt;&lt;img alt="jrubyconf-sf.jpg"/&gt;&lt;/p&gt; &lt;div style="clear:both;"&gt;&lt;/div&gt; &lt;p&gt;We always joked about having the first JRubyConf in the middle of a brisk Minnesota winter at Tom&amp;#8217;s Cabin, but I think this will do nicely!&lt;/p&gt; &lt;p&gt;&lt;img src="http://farm3.static.flickr.com/2057/2222072226_d81ef00828.jpg" alt="cabin"/&gt;&lt;/p&gt; &lt;div style="clear:both;"&gt;&lt;/div&gt; &lt;p&gt;Please go quickly and &lt;a rel="nofollow" target="_blank" href="http://jrubyconf.eventbrite.com/"&gt;register&lt;/a&gt;! Though there is no fee for the day, we only have a limited number of spots available!&lt;/p&gt; &lt;p&gt;&lt;em&gt;P&amp;#46;S&amp;#46; This post is a little late to the party; I was in the air on the way back from JavaZone&amp;#46; If you want a peek at what&amp;#8217;s been happening in JRuby land you can &lt;a rel="nofollow"&gt;check out the slides from my talk there&lt;/a&gt;&amp;#46;&lt;/em&gt;&lt;/p&gt;</description>
         <author>Nick Sieger</author>
         <guid isPermaLink="false">urn:uuid:c67b3b5d-38de-48d2-a7d7-66b6a378c1b0</guid>
         <pubDate>Fri, 11 Sep 2009 21:22:15 -0700</pubDate>
      <feedburner:origLink>http://blog.nicksieger.com/articles/2009/09/12/jrubyconf-2009-first-of-many</feedburner:origLink></item>
      <item>
         <title>Announcing JRubyConf 2009</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/DhrFuij3fyg/announcing-jrubyconf-2009.html</link>
         <description>Good news everybody! We're finally going to have JRubyConf!&lt;br /&gt;&lt;br /&gt;After over 3 years of heavy development, dozens of deployments and hundreds of users, it's time for a conference for JRuby users. We've talked about it on the JRuby mailing lists, polled users, and seen other JRubyists do the same. And the chorus slowly grew: you all wanted JRubyConf more and more.&lt;br /&gt;&lt;br /&gt;Now, thanks to &lt;a rel="nofollow" target="_blank" href="http://www.engineyard.com"&gt;Engine Yard&lt;/a&gt;, who's producing the conference, and to sponsors &lt;a rel="nofollow" target="_blank" href="http://edgecase.com/home"&gt;EdgeCase&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://www.thoughtworks.com/"&gt;ThoughtWorks&lt;/a&gt;, we'll host the first ever JRubyConf the day after RubyConf, on Sunday November 22nd. This should allow folks attending RubyConf to also attend JRubyConf and not have to schedule a separate trip.&lt;br /&gt;&lt;br /&gt;So here's the details:&lt;br /&gt;&lt;blockquote&gt;What: JRubyConf 2009 (the first ever!)&lt;br /&gt;When: Sunday, November 22nd; the day after RubyConf 2009&lt;br /&gt;Where: Same hotel as RubyConf, the Embassy Suites at San Francisco Airport. You don't even have to switch locations!&lt;br /&gt;Why: Because we love you!&lt;br /&gt;Price: &lt;b&gt;FREE!!!&lt;/b&gt;&lt;br /&gt;&lt;/blockquote&gt;We've been putting together a wide range of talks and speakers, from the JRuby core team members to real-world users; from the latest on deploying Rails to gaming and desktop development. It's going to be a fast-paced event with something for everyone, and best of all, it's &lt;span style="font-weight:bold;"&gt;FREE!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Space is limited for the event, and you will have to register separately from RubyConf to secure your seat (but you don't have to go to RubyConf to attend JRubyConf!). Check out &lt;a rel="nofollow" target="_blank" href="http://www.jrubyconf.com/"&gt;www.jrubyconf.com&lt;/a&gt; for information, registration, and so on, and be quick about it!&lt;br /&gt;&lt;br /&gt;See you at JRubyConf 2009!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20975090-4227112972393354416?l=blog.headius.com'/&gt;&lt;/div&gt;</description>
         <author>Charles Oliver Nutter</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-20975090.post-4227112972393354416</guid>
         <pubDate>Fri, 11 Sep 2009 04:58:00 -0700</pubDate>
      <feedburner:origLink>http://blog.headius.com/2009/09/announcing-jrubyconf-2009.html</feedburner:origLink></item>
      <item>
         <title>Writing Comet Applications Using JRuby and the Atmosphere Framework</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/YHBUrjOczGE/writing-comet-applications-using-jruby-and-atmosphere-framework</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;div class="field field-type-filefield field-field-thumb-100x70"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item odd"&gt;&lt;img class="imagefield imagefield-field_thumb_100x70" width="285" height="229" alt="" src="http://www.java.net/sites/default/files/atmo256.PNG?1252604540"/&gt;    &lt;/div&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Writing Atmosphere's Comet based applications is &lt;a rel="nofollow" target="_blank" href="http://weblogs.java.net/blog/jfarcand/archive/2009/03/getting_started_1.html"&gt;simple&lt;/a&gt;. Imagine using JRuby instead of Java...it becomes really simple!. As with &lt;a rel="nofollow" target="_blank" href="http://java.dzone.com/articles/writing-comet-applications"&gt;Scala&lt;/a&gt;, it is also possible to write Comet application with &lt;a rel="nofollow" target="_blank" href="http://atmosphere.dev.java.net"&gt;Atmosphere Framework&lt;/a&gt; using JRuby. &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/Iframe-streaming-with-Jruby-and-Atmosphere-tp3525131p3572901.html"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="IMG_0347.JPG" src="http://weblogs.java.net/sites/default/files/100_0600.jpg" width="640" height="400"/&gt;&lt;/p&gt;
&lt;p&gt;A user of Atmosphere recently posted&lt;/a&gt; the famous chat application written using JRuby and an embedded instance of Jetty. I've decided to write the same application using the &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/ANN-Atmosphere-Spade-Server-tp3580390p3580390.html"&gt;Atmosphere Spade Server&lt;/a&gt;, which build on top of &lt;a rel="nofollow" target="_blank" href="http://jersey.dev.java.net"&gt;Jersey&lt;a rel="nofollow"&gt; and &lt;a rel="nofollow" target="_blank" href="http://grizzly.dev.java.net"&gt;Grizzly&lt;/a&gt; (will soon support &lt;a rel="nofollow" target="_blank" href="http://jboss.org/netty/"&gt;Netty&lt;/a&gt; and Jetty). The idea behind the Atmosphere Spade Server is to make it really simple to test and embed your Comet application. Note that any application written using the Atmosphere Spade Server is portable, e.g. it will also deploy into any Servlet Container like Tomcat, Glassfish, Weblogic etc.&lt;/p&gt;
&lt;p&gt;Before jumping into JRuby, let's just explore the Atmosphere Spade Server main class, &lt;a rel="nofollow" target="_blank" href="http://is.gd/37x9D"&gt;AtmosphereSpadeServer&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;public static AtmosphereSpadeServer.build(String uri);&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Invoking that simple method will automatically creates, under the hood, a Grizzly Servlet Container instance ready to receive requests based on the URI entered&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;AtmosphereSpadeServer.build("http://localhost:8080/")&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Next step is to add your Atmosphere POJO aka AtmosphereHandler (I recommend you read that post for more details about &lt;a rel="nofollow" target="_blank" href="http://weblogs.java.net/blog/jfarcand/archive/2009/03/getting_started_1.html"&gt;AtmosphereHandler&lt;a rel="nofollow"&gt;):&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;AtmosphereSpadeServer.build("http://localhost:8080/").addAtmosphereHandler(...);&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;And finally, you are ready to start it:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;AtmosphereSpadeServer.build("http://localhost:8080/").addAtmosphereHandler(...).start();&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;If you are using &lt;a rel="nofollow" target="_blank" href="http://weblogs.java.net/blog/jfarcand/archive/2009/06/getting_started_2.html"&gt;Atmosphere Core/REST&lt;/a&gt; (powered by Jersey), it event simpler as you don't need to define AtmosphereHandler, but instead just tell Jersey the name of the package to look for JAX RS resources:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt;AtmosphereSpadeServer build("http://localhost:8080/","org.atmosphere.myresources").start()&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Now let's jump into JRuby world and uses the AtmosphereSpadeServer:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt; 1 require 'java' 2 3 Dir["./Java/atmosphere/atmosphere-spade-server.jar"].each { |jar| require jar } 4 5 include_class 'javax.servlet.http.HttpServlet' 6 include_class 'org.atmosphere.cpr.AtmosphereHandler' 7 include_class 'org.atmosphere.grizzly.AtmosphereSpadeServer' 8 9 #setup and start the server 10 def main 11 AtmosphereSpadeServer.build("http://localhost:8080/") 12 .addAtmosphereHandler("", ChatPage.new()) 13 .addAtmosphereHandler("/chat-stream", ChatStream.new()).start 14 end&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The above code starts the server using two AtmosphereHandler. The first will send back a chat.html page to be rendered by the browser&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt; 17 #serve the chat page 18 class ChatPage 19 include AtmosphereHandler 20 21 def onEvent(event) 22 Kernel.load(__FILE__) 23 res = event.getResponse() 24 25 res.setContentType("text/html") 26 res.addHeader("Cache-Control", "private") 27 res.addHeader("Pragma", "no-cache") 28 File.open(File.dirname(__FILE__)+'/chat.html').each { |line| 29 res.getWriter().write(line) 30 } 31 res.getWriter().flush() 32 event 33 end 34 end&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The second one is used for suspending the response and broadcasting chat messages&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;&lt;code&gt; 36 #serve the chat stream and post messages 37 class ChatStream 38 include AtmosphereHandler 39 40 BEGIN_SCRIPT_TAG = '&amp;lt;script&amp;gt;' 41 END_SCRIPT_TAG = '&amp;lt;/script&amp;gt;' 42 43 def onEvent(event) 44 req = event.getRequest(); 45 res = event.getResponse(); 46 47 res.setContentType("text/html") 48 res.addHeader("Cache-Control", "private") 49 res.addHeader("Pragma", "no-cache") 50 res.setCharacterEncoding("UTF-8"); 51 52 if (req.getMethod().upcase === "GET") 53 # for IE 54 res.getWriter().write("&amp;lt;!-- Comet enables web " + 55 "servers to send data without having any need " + 56 "for the client to request it. --&amp;gt;&amp;#92;n"); 57 res.getWriter().flush(); 58 &lt;strong&gt;event.suspend();&lt;/strong&gt; 59 60 elsif (req.getMethod().upcase === "POST") 61 message = req.getParameterValues("message")[0].to_s 62 ip = req.getRemoteAddr().to_s 63 &lt;strong&gt;event.getBroadcaster().broadcast( 64 BEGIN_SCRIPT_TAG + 65 "window.parent.say('&amp;lt;small&amp;gt;#{ip} - #{req.getHeader("User-Agent").to_s}: &amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;&amp;lt;b&amp;gt;#{message}&amp;lt;/b&amp;gt;')" + 66 END_SCRIPT_TAG);&lt;/strong&gt; 67 68 res.getWriter().write('success') 69 res.getWriter().flush(); 70 end 71 72 event 73 end 74 75 def onMessage(event) 76 writer = event.getResponse().getWriter() 77 writer.write(event.getMessage().to_s.ljust(1*1024)) 78 writer.flush() 79 event 80 end 81 end&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;With Atmosphere, every suspended connection are represented by an instance of AtmosphereEvent, and when a Broadcast operations happens, the AtmosphereHandler.onMessage(AtmosphereEvent) will be invoked hence an application can write back the broadcasted message.&lt;/p&gt;
&lt;p&gt;Of course, you can do much more complex application using Atmosphere and JRuby, but my goal here was just to show how easy it can be.
&lt;p&gt;For any questions or to download the above sample, go to &lt;a rel="nofollow" target="_blank" href="http://atmosphere.dev.java.net"&gt;our main site&lt;/a&gt; and use our &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/Atmosphere-users-mailling-list-f2493822.html"&gt;Nabble forum&lt;/a&gt; (no subscription needed) or &lt;a rel="nofollow" target="_blank" href="http://twitter.com/atmosphere_java"&gt;follow us on Twitter&lt;/a&gt; and tweet your questions there!&lt;/p&gt;
&lt;p&gt;&lt;p&gt;technorati: &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/atmosphere+framework"&gt;atmosphere framework&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/jrubyr"&gt;jruby&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/comet"&gt;comet&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/scala"&gt;scala&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/ajax"&gt;ajax&lt;/a&gt;&lt;/p&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;&lt;/a&gt;</description>
         <guid isPermaLink="false">266518 at http://www.java.net</guid>
         <pubDate>Thu, 10 Sep 2009 10:42:20 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/jfarcand/archive/2009/09/10/writing-comet-applications-using-jruby-and-atmosphere-framework</feedburner:origLink></item>
      <item>
         <title>Context And Dependency Injection (JSR 299) And Servlets</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/vOPUgXEjydY/context-and-dependency-injection-jsr-299-and-servlets</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;p&gt;I've had questions about how to inject Web Beans into servlets and whether that is supported.&amp;nbsp; In this entry I'll outline a method of accomplishing just that.&lt;br /&gt;
This is a simple login application that communicates to a servlet using Ajax calls from a JSP view.&amp;nbsp; I'm not going to focus on the view or the protocol (Ajax) that&amp;nbsp; is used to communicate with the servlet.&amp;nbsp; If you are interested in that, you can check out the source (instructions at the end of this post).&amp;nbsp; I'm going to focus on the servlet code and the supporting classes for the application.&amp;nbsp; The application just prompts for a user name / pasword, and pressing the submit button sends those values to a servlet.&amp;nbsp; First, let's take a look at some of the supporting code for the application:&lt;/p&gt;
&lt;h3&gt;Listing 1: Login Credentials&lt;/h3&gt;
&lt;table cellspacing="2" cellpadding="2" border="1" style="text-align:left;width:1277px;background-color:rgb(240, 248, 255);height:486px;"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="vertical-align:top;background-color:rgb(240, 248, 255);"&gt; &lt;ol&gt; &lt;li&gt;package webbeansservlet;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;import javax.enterprise.context.RequestScoped;&lt;/li&gt; &lt;li&gt;import javax.enterprise.inject.Default;&lt;/li&gt; &lt;li&gt;import javax.inject.Named;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;/**&lt;/li&gt; &lt;li&gt;&amp;nbsp;* This is just a simple container class Web Bean for the username &lt;/li&gt; &lt;li&gt;&amp;nbsp;*&amp;nbsp; and password entry values.&lt;/li&gt; &lt;li&gt;&amp;nbsp;*/&lt;/li&gt; &lt;li style="color:rgb(51, 51, 255);"&gt;@Named&lt;/li&gt; &lt;li style="color:rgb(51, 51, 255);"&gt;@RequestScoped&lt;/li&gt; &lt;li style="color:rgb(51, 51, 255);"&gt;@Default&lt;/li&gt; &lt;li&gt;public class Credentials {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String username = null;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String password = null;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getUsername() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return username;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setUsername(String username) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.username = username;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getPassword() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return password;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setPassword(String password) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.password = password;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;Line 11: The name of this Web Bean will be &lt;span style="font-style:italic;"&gt;credentials&lt;/span&gt; since we don't supply an argument to the Named annotation.&lt;/li&gt; &lt;li&gt;Line 12: For the purposes of this simple application this Web Bean scope will be for the current request.&lt;/li&gt; &lt;li&gt;Line 13: Specifies the default qualifier type for this Web Bean.&amp;nbsp; Note that you should not have to specify this if it's the only qualifier type being used.&amp;nbsp; In future implementations of Web Beans this should be fixed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Listing 2: Login&lt;/h3&gt;
&lt;table cellspacing="2" cellpadding="2" border="1" style="text-align:left;width:1277px;background-color:rgb(240, 248, 255);height:486px;"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="vertical-align:top;background-color:rgb(240, 248, 255);"&gt; &lt;ol&gt; &lt;li&gt;package webbeansservlet;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;import java.io.Serializable;&lt;/li&gt; &lt;li&gt;import javax.enterprise.context.SessionScoped;&lt;/li&gt; &lt;li&gt;import javax.enterprise.inject.Default;&lt;/li&gt; &lt;li&gt;import javax.inject.Inject;&lt;/li&gt; &lt;li&gt;import javax.inject.Named;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;/**&lt;/li&gt; &lt;li&gt;&amp;nbsp;* A simple Web Bean that performs a login operation with user's&lt;/li&gt; &lt;li&gt;&amp;nbsp;* credentials.&lt;/li&gt; &lt;li&gt;&amp;nbsp;*/&lt;/li&gt; &lt;li style="color:rgb(51, 51, 255);"&gt;@Named&lt;/li&gt; &lt;li style="color:rgb(51, 51, 255);"&gt;@SessionScoped&lt;/li&gt; &lt;li style="color:rgb(51, 51, 255);"&gt;@Default&lt;/li&gt; &lt;li&gt;public class Login implements Serializable {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(51, 51, 255);"&gt;@Inject Credentials credentials;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private boolean loggedIn = false;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * This is where you could potentially access a database.&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void login() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((&lt;span style="color:rgb(51, 51, 255);"&gt;credentials&lt;/span&gt;.getUsername() != null &amp;amp;&amp;amp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(51, 51, 255);"&gt;credentials&lt;/span&gt;.getUsername().trim().length() &amp;gt; 0) &amp;amp;&amp;amp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color:rgb(51, 51, 255);"&gt;credentials&lt;/span&gt;.getPassword() != null &amp;amp;&amp;amp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(51, 51, 255);"&gt;credentials&lt;/span&gt;.getPassword().trim().length() &amp;gt; 0)) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loggedIn = true;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public boolean isLoggedIn() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return loggedIn;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt; &lt;li&gt;Line 13: The name of this Web Bean will be &lt;span style="font-style:italic;"&gt;login&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Line 14: This Web Bean will exist for the session&lt;/li&gt; &lt;li&gt;Line 15: Specifies the default qualifier type for this Web Bean.&lt;/li&gt; &lt;li&gt;Line 18: We're injecting an instance of &lt;span style="font-style:italic;"&gt;Credentials &lt;/span&gt;so we can check the validity of the user name and password entries&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Listing 3: Login Servlet&lt;/h3&gt;
&lt;table cellspacing="2" cellpadding="2" border="1" style="text-align:left;width:1277px;background-color:rgb(240, 248, 255);height:486px;"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="vertical-align:top;background-color:rgb(240, 248, 255);"&gt; &lt;ol&gt; &lt;li&gt;package webbeansservlet;&lt;/li&gt; &lt;li&gt;import java.io.IOException;&lt;/li&gt; &lt;li&gt;import java.io.PrintWriter;&lt;/li&gt; &lt;li&gt;import javax.enterprise.inject.spi.BeanManager;&lt;/li&gt; &lt;li&gt;import javax.inject.Inject;&lt;/li&gt; &lt;li&gt;import javax.servlet.ServletException;&lt;/li&gt; &lt;li&gt;import javax.servlet.annotation.WebServlet;&lt;/li&gt; &lt;li&gt;import javax.servlet.http.HttpServlet;&lt;/li&gt; &lt;li&gt;import javax.servlet.http.HttpServletRequest;&lt;/li&gt; &lt;li&gt;import javax.servlet.http.HttpServletResponse;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;/**&lt;/li&gt; &lt;li&gt;&amp;nbsp;* This Servlet class demonstrates Web Beans injection.&lt;/li&gt; &lt;li&gt;&amp;nbsp;*/&lt;/li&gt; &lt;li&gt;@WebServlet(name="LoginServlet", urlPatterns={"/LoginServlet"})&lt;/li&gt; &lt;li&gt;public class LoginServlet extends HttpServlet {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Inject Web Beans Bean Manager.&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(51, 51, 255);"&gt;@Inject BeanManager m;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Inject The Credentials Web Bean.&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(51, 51, 255);"&gt;@Inject Credentials credentials;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Inject the Login Web Bean.&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(51, 51, 255);"&gt;@Inject Login login;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Processes requests for both HTTP &amp;lt;code&amp;gt;GET&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;POST&amp;lt;/code&amp;gt; methods.&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param request servlet request&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param response servlet response&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @throws ServletException if a servlet-specific error occurs&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @throws IOException if an I/O error occurs&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throws ServletException, IOException {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.setContentType("text/html;charset=UTF-8");&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PrintWriter out = response.getWriter();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(51, 51, 255);"&gt;credentials.setUsername&lt;/span&gt;(request.getParameter("username"));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(51, 51, 255);"&gt;credentials.setPassword&lt;/span&gt;(request.getParameter("password"));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(51, 51, 255);"&gt;login.login();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (&lt;span style="color:rgb(51, 51, 255);"&gt;login.isLoggedIn()&lt;/span&gt;) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.println("Successfully Logged In As: " + &lt;span style="color:rgb(51, 51, 255);"&gt;credentials.getUsername()&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.println("Login Failed: Check username and/or password.");&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } finally {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.close();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp; .......&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt; &lt;li&gt;Line 15: New for Servlet 3.0 - eliminates servlet entry in web.xml! Not relevant to this example, but worth mentioning.&lt;/li&gt; &lt;li&gt;Line 19: The Web Beans &lt;span style="font-style:italic;"&gt;Bean Manager &lt;/span&gt;can also be injected.&amp;nbsp; The &lt;span style="font-style:italic;"&gt;Bean Manager &lt;/span&gt;api provides some useful methods for interrogating portions of a Web Beans application.&lt;/li&gt; &lt;li&gt;Line 22: The &lt;span style="font-style:italic;"&gt;Credentials &lt;/span&gt;Web Bean is injected making it available to the servlet.&lt;/li&gt; &lt;li&gt;Line 38: Now we can access the &lt;span style="font-style:italic;"&gt;Credentials &lt;/span&gt;Web Bean.&lt;/li&gt; &lt;li&gt;Line 40: We can also use the injected &lt;span style="font-style:italic;"&gt;Login &lt;/span&gt;Web Bean&lt;span style="font-style:italic;"&gt; &lt;/span&gt;instance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is just one example of Web Bean injection into a servlet.&amp;nbsp; There are more areas in the JavaEE6 platform that can be used as Web Bean injection points - topics that will certainly be covered in future posts.&amp;nbsp; The sample for this blog can be found under the &lt;a rel="nofollow" target="_blank" href="https://glassfish-samples.dev.java.net/"&gt;glassfish-samples&lt;/a&gt; project.&amp;nbsp; You can check out the code following these &lt;a rel="nofollow" target="_blank" href="https://glassfish-samples.dev.java.net/source/browse/glassfish-samples/"&gt;instructions&lt;/a&gt;.&amp;nbsp; Once the workspace is checked out, you can find this sample under &lt;span style="font-style:italic;"&gt;glassfish-samples/ws/javaee6/webbeans/webbeans-servlet&lt;/span&gt;.&amp;nbsp; You can find documentation for the sample under &lt;span style="font-style:italic;"&gt;glassfish-samples/ws/javaee6/webbeans/webbeans-servlet/docs.&amp;nbsp; &lt;/span&gt;As with all the Web Beans samples now, you should run with GlassFish V3 - any build after September 2 2009.&lt;/p&gt;</description>
         <guid isPermaLink="false">265331 at http://www.java.net</guid>
         <pubDate>Wed, 09 Sep 2009 07:34:21 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/rogerk/archive/2009/09/09/context-and-dependency-injection-jsr-299-and-servlets</feedburner:origLink></item>
      <item>
         <title>Contexts and Dependency Injection (JSR 299) and GlassFish</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/x5JzPpGciDE/contexts-and-dependency-injection-jsr-299-and-glassfish</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;p&gt;Version 1.0.0.PREVIEW3 of Web Beans (the implementation for &lt;a rel="nofollow" target="_blank" href="http://jcp.org/en/jsr/summary?id=299"&gt;JSR 299&lt;/a&gt; Contexts and Dependency Injection For Java EE) now uses the annotations from &lt;a rel="nofollow" target="_blank" href="http://jcp.org/en/jsr/summary?id=330"&gt;JSR 330&lt;/a&gt; (Dependency Injection For Java) and it is available in GlassFish V3.&amp;nbsp; &lt;br /&gt;
In this entry, we'll look at a simple JSF 2 application that uses Web Beans and the JSR 330 annotations. There are other features available in this release of Web Beans which will be discussed in subsequent blog entries. This application is a simple "guess number" application which I'm sure we are probably all familiar with by now.&amp;nbsp; Let's start by taking a look at the application's UI markup.&lt;/p&gt;
&lt;h3&gt;Listing 1: User Interface Markup&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table cellspacing="2" cellpadding="2" border="1" style="text-align:left;width:1277px;background-color:rgb(240, 248, 255);height:518px;"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="vertical-align:top;background-color:rgb(240, 248, 255);"&gt; &lt;ol&gt; &lt;li&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:ui="http://java.sun.com/jsf/facelets"&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:h="http://java.sun.com/jsf/html"&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:f="http://java.sun.com/jsf/core"&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:head&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;JSF 2.0 Web Beans Example&amp;lt;/title&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/h:head&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:body&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:form id="NumberGuessMain"&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:panelGrid styleClass="title-panel"&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputText value="Guess Number" styleClass="title-panel-text"/&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputText value="Powered By JavaServer Faces 2.0 and Web Beans" styleClass="title-panel-subtext"/&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/h:panelGrid&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div style="color: black; font-size: 24px;"&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I'm thinking of a number between &amp;lt;span style="color: blue"&amp;gt;&lt;span style="color:rgb(255, 0, 0);"&gt;#{&lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.smallest}&lt;/span&gt;&amp;lt;/span&amp;gt; and &amp;lt;span style="color: blue"&amp;gt;&lt;span style="color:rgb(255, 0, 0);"&gt;#{&lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.biggest}&lt;/span&gt;&amp;lt;/span&amp;gt;. You have &amp;lt;span style="color: blue"&amp;gt;&lt;span style="color:rgb(255, 0, 0);"&gt;#{&lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.remainingGuesses}&lt;/span&gt;&amp;lt;/span&amp;gt; guesses.&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:panelGrid border="1" columns="5" style="font-size: 18px;"&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Number:&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:inputText id="inputGuess" value="&lt;span style="color:rgb(255, 0, 0);"&gt;#{&lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.guess}&lt;/span&gt;" required="true" size="3" disabled="&lt;span style="color:rgb(255, 0, 0);"&gt;#{&lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.number eq &lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.guess}&lt;/span&gt;" validator="&lt;span style="color:rgb(255, 0, 0);"&gt;#{&lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.validateNumberRange}&lt;/span&gt;"/&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:commandButton id="GuessButton" value="Guess" action="&lt;span style="color:rgb(255, 0, 0);"&gt;#{&lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.check}&lt;/span&gt;" disabled="&lt;span style="color:rgb(255, 0, 0);"&gt;#{&lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.number eq &lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.guess}&lt;/span&gt;"/&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:commandButton id="RestartButton" value="Reset" action="&lt;span style="color:rgb(255, 0, 0);"&gt;#{&lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.reset}&lt;/span&gt;" immediate="true" /&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputText id="Higher" value="Higher!" rendered="&lt;span style="color:rgb(255, 0, 0);"&gt;#{&lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.number gt &lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.guess and &lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.guess ne 0}"&lt;/span&gt; style="color: red"/&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputText id="Lower" value="Lower!" rendered="&lt;span style="color:rgb(255, 0, 0);"&gt;#{&lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.number lt &lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.guess and &lt;span style="color:rgb(51, 51, 255);"&gt;game&lt;/span&gt;.guess ne 0}"&lt;/span&gt; style="color: red"/&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/h:panelGrid&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div style="color: red; font-size: 14px;"&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:messages id="messages" globalOnly="false"/&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputStylesheet name="stylesheet.css" /&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/h:form&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/h:body&amp;gt;&lt;/li&gt; &lt;li&gt;&amp;lt;/html&amp;gt;&lt;/li&gt; &lt;/ol&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;
Everything on this page is really just standard JSF 2.0 view markup.&amp;nbsp; I've emphasized&amp;nbsp; the&amp;nbsp; Expression Language&amp;nbsp; (EL) portions of the view, especially &lt;span style="font-style:italic;"&gt;game &lt;/span&gt;because it refers to a contextual bean instance also known as a &lt;span style="font-style:italic;"&gt;Web Bean&lt;/span&gt;.&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;Line 17: Binding to Web Bean properties&lt;/li&gt; &lt;li&gt;Line 21: Binding to Web Bean properties and validation method&lt;/li&gt; &lt;li&gt;Line 22, 23: Binding to Web Bean action method&lt;/li&gt; &lt;li&gt;Line 24, 25: Binding to Web Bean properties&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you can see, in JSF, binding to a Web Bean is no different than binding to a typical managed bean.&lt;/p&gt;
&lt;h2&gt;Supporting Classes And Annotations For The Applicaton&lt;/h2&gt;
&lt;p&gt;Let's take a look at some of the utility classes for the application, namely the classes that are used to generate a random number and some of the supporting annotations.&lt;/p&gt;
&lt;h3&gt;Listing 2: The "Random" Annotation&lt;/h3&gt;
&lt;table cellspacing="2" cellpadding="2" border="1" style="text-align:left;width:100%;"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="vertical-align:top;background-color:rgb(240, 248, 255);"&gt; &lt;ol&gt; &lt;li&gt;package webbeansguess;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;import static java.lang.annotation.ElementType.FIELD;&lt;/li&gt; &lt;li&gt;import static java.lang.annotation.ElementType.METHOD;&lt;/li&gt; &lt;li&gt;import static java.lang.annotation.ElementType.PARAMETER;&lt;/li&gt; &lt;li&gt;import static java.lang.annotation.ElementType.TYPE;&lt;/li&gt; &lt;li&gt;import static java.lang.annotation.RetentionPolicy.RUNTIME;&lt;/li&gt; &lt;li&gt;import java.lang.annotation.Documented;&lt;/li&gt; &lt;li&gt;import java.lang.annotation.Retention;&lt;/li&gt; &lt;li style="color:rgb(255, 0, 0);"&gt;import javax.inject.Qualifier;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;@Target( { TYPE, METHOD, PARAMETER, FIELD })&lt;/li&gt; &lt;li&gt;@Retention(RUNTIME)&lt;/li&gt; &lt;li&gt;@Documented&lt;/li&gt; &lt;li style="color:rgb(255, 0, 0);"&gt;@Qualifier&lt;/li&gt; &lt;li&gt;public @interface Random {&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;
The JSR 330 &lt;span style="font-style:italic;"&gt;@Qualifier &lt;/span&gt;annotation is used to make &lt;span style="font-style:italic;"&gt;Random &lt;/span&gt;a binding type.&amp;nbsp;&amp;nbsp; This will allow us to inject a random number into the application.&lt;/p&gt;
&lt;h3&gt;Listing 3: The "MaxNumber" Annotation&lt;/h3&gt;
&lt;table cellspacing="2" cellpadding="2" border="1" style="text-align:left;width:100%;"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="vertical-align:top;background-color:rgb(240, 248, 255);"&gt; &lt;ol&gt; &lt;li&gt;package webbeansguess;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;import static java.lang.annotation.ElementType.FIELD;&lt;/li&gt; &lt;li&gt;import static java.lang.annotation.ElementType.METHOD;&lt;/li&gt; &lt;li&gt;import static java.lang.annotation.ElementType.PARAMETER;&lt;/li&gt; &lt;li&gt;import static java.lang.annotation.ElementType.TYPE;&lt;/li&gt; &lt;li&gt;import static java.lang.annotation.RetentionPolicy.RUNTIME;&lt;/li&gt; &lt;li&gt;import java.lang.annotation.Documented;&lt;/li&gt; &lt;li&gt;import java.lang.annotation.Retention;&lt;/li&gt; &lt;li&gt;import java.lang.annotation.Target;&lt;/li&gt; &lt;li style="color:rgb(255, 0, 0);"&gt;import javax.inject.Qualifier;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;@Target( { TYPE, METHOD, PARAMETER, FIELD })&lt;/li&gt; &lt;li&gt;@Retention(RUNTIME)&lt;/li&gt; &lt;li&gt;@Documented&lt;/li&gt; &lt;li style="color:rgb(255, 0, 0);"&gt;@Qualifier&lt;/li&gt; &lt;li&gt;public @interface MaxNumber {&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;
&lt;/span&gt;Likewise, the &lt;span style="font-style:italic;"&gt;@Qualifier &lt;/span&gt;annotation is used to make &lt;span style="font-style:italic;"&gt;MaxNumber &lt;/span&gt;a binding type that will allow us to inject the maximum number allowed (for a guess) in the application.&lt;/p&gt;
&lt;h3&gt;Listing 4: The "Generator" Class&lt;/h3&gt;
&lt;table cellspacing="2" cellpadding="2" border="1" style="text-align:left;width:100%;background-color:rgb(240, 248, 255);"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="vertical-align:top;"&gt; &lt;ol&gt; &lt;li&gt;package webbeansguess;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;import java.io.Serializable;&lt;/li&gt; &lt;li style="color:rgb(51, 51, 255);"&gt;import javax.enterprise.context.ApplicationScoped;&lt;/li&gt; &lt;li style="color:rgb(51, 51, 255);"&gt;import javax.enterprise.inject.Produces;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="color:rgb(51, 51, 255);"&gt;@ApplicationScoped&lt;/li&gt; &lt;li&gt;public class Generator implements Serializable {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static final long serialVersionUID = -7213673465118041882L;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp; private java.util.Random random = new java.util.Random( System.currentTimeMillis() );&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int maxNumber = 100;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; java.util.Random getRandom() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return random;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:rgb(51, 51, 255);"&gt; @Produces @Random&lt;/span&gt; int next() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; return getRandom().nextInt(maxNumber);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(51, 51, 255);"&gt;@Produces @MaxNumber&lt;/span&gt; int getMaxNumber() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; return maxNumber;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;Line 7: An instance of this class exists for the lifecycle of the application&lt;/li&gt; &lt;li&gt;Line 15: &lt;span style="font-style:italic;"&gt;next() &lt;/span&gt;is a Web Beans &lt;span style="font-style:italic;"&gt;producer &lt;/span&gt;method.&amp;nbsp; It will get called by the Web Beans Manager to obtain an instance of the next random number.&lt;/li&gt; &lt;li&gt;Line 18: &lt;span style="font-style:italic;"&gt;getMaxNumber() &lt;/span&gt;is also a Web Beans &lt;span style="font-style:italic;"&gt;producer &lt;/span&gt;method.&amp;nbsp; It will get called by the Web Beans Manager to obtain an instance of &lt;span style="font-style:italic;"&gt;maxNumber - &lt;/span&gt;essentially returning the maximum number to "guess" in the application (in this case "100").&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Anatomy of a Simple Contextual Bean&lt;/h2&gt;
&lt;p&gt;Now that we have are utility classes and annotations in place, we can use them in our Web Bean.&lt;/p&gt;
&lt;h3&gt;Listing 5: The "Game" Contextual Bean&lt;/h3&gt;
&lt;table cellspacing="2" cellpadding="2" border="1" style="text-align:left;width:1277px;height:1397px;background-color:rgb(240, 248, 255);"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style="vertical-align:top;"&gt; &lt;ol&gt; &lt;li&gt;package webbeansguess;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;import java.io.Serializable;&lt;/li&gt; &lt;li&gt;import javax.annotation.PostConstruct;&lt;/li&gt; &lt;li style="color:rgb(51, 51, 255);"&gt;import javax.enterprise.context.SessionScoped;&lt;/li&gt; &lt;li style="color:rgb(51, 51, 255);"&gt;import javax.enterprise.inject.Instance;&lt;/li&gt; &lt;li style="color:rgb(255, 0, 0);"&gt;import javax.inject.Inject;&lt;/li&gt; &lt;li style="color:rgb(255, 0, 0);"&gt;import javax.inject.Named;&lt;/li&gt; &lt;li&gt;import javax.faces.application.FacesMessage;&lt;/li&gt; &lt;li&gt;import javax.faces.component.UIComponent;&lt;/li&gt; &lt;li&gt;import javax.faces.component.UIInput;&lt;/li&gt; &lt;li&gt;import javax.faces.context.FacesContext;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="color:rgb(255, 0, 0);"&gt;@Named&lt;/li&gt; &lt;li style="color:rgb(51, 51, 255);"&gt;@SessionScoped&lt;/li&gt; &lt;li&gt;public class Game implements Serializable {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static final long serialVersionUID = 1L;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int number;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int guess;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int smallest;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(204, 51, 204);"&gt;@MaxNumber&lt;/span&gt; &lt;span style="color:rgb(255, 0, 0);"&gt;@Inject&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp; &amp;nbsp; private int maxNumber;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int biggest;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int remainingGuesses;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:rgb(204, 51, 204);"&gt;@Random&lt;/span&gt; &lt;span style="color:rgb(255, 0, 0);"&gt;@Inject &lt;/span&gt;Instance&amp;lt;Integer&amp;gt; randomNumber;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Game() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp; &amp;nbsp; public int getNumber() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return number;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp; &amp;nbsp; public int getGuess() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return guess;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setGuess(int guess) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.guess = guess;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp; &amp;nbsp; public int getSmallest() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return smallest;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getBiggest() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return biggest;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getRemainingGuesses() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return remainingGuesses;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String check() throws InterruptedException {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (guess&amp;gt;number) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; biggest = guess - 1;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (guess&amp;lt;number) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; smallest = guess + 1;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (guess == number) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Correct!"));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; remainingGuesses--;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @PostConstruct&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void reset() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.smallest = 0;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; this.guess = 0;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; this.remainingGuesses = 10;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; this.biggest = maxNumber;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; this.number = &lt;span style="color:rgb(51, 51, 255);"&gt;randomNumber.get()&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void validateNumberRange(FacesContext context,&amp;nbsp; UIComponent toValidate, Object value) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (remainingGuesses &amp;lt;= 0) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FacesMessage message = new FacesMessage("No guesses left!");&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.addMessage(toValidate.getClientId(context), message);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((UIInput)toValidate).setValid(false);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int input = (Integer) value;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (input &amp;lt; smallest || input &amp;gt; biggest) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((UIInput)toValidate).setValid(false);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FacesMessage message = new FacesMessage("Invalid guess");&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.addMessage(toValidate.getClientId(context), message);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;
I've color coded the areas of interest in this class.&amp;nbsp; The &lt;span style="color:rgb(51, 51, 255);"&gt;blue &lt;span style="color:rgb(0, 0, 0);"&gt;areas are JSR 299 (Web Beans) implementation details.&amp;nbsp; The &lt;span style="color:rgb(255, 0, 0);"&gt;red &lt;span style="color:rgb(0, 0, 0);"&gt;areas are JSR 330 (Dependency Injection For Java) areas.&amp;nbsp; The &lt;span style="color:rgb(204, 51, 204);"&gt;purple &lt;span style="color:rgb(0, 0, 0);"&gt;areas are the &lt;span style="font-style:italic;"&gt;binding types.&lt;/span&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;&lt;span style="color:rgb(51, 51, 255);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(255, 0, 0);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(204, 51, 204);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;Line 14: We are using the &lt;span style="font-style:italic;"&gt;Named &lt;/span&gt;annotation to associate a name with this bean.&amp;nbsp; Because there is no argument specified with the &lt;span style="font-style:italic;"&gt;Named &lt;/span&gt;annotation, its name will be the name of the bean itself with the first letter lowercase (game).&amp;nbsp;&amp;nbsp; This allows us to reference the bean by that name using the Expression Language in the view.&lt;br /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:rgb(51, 51, 255);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(255, 0, 0);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(204, 51, 204);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;Line 15: We declare this bean as a session scoped bean, meaning it's lifecycle is the lifecycle of the session. &lt;br /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:rgb(51, 51, 255);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(255, 0, 0);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(204, 51, 204);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;Line 23: The &lt;span style="font-style:italic;"&gt;producer &lt;/span&gt;method in the &lt;span style="font-style:italic;"&gt;Generator&lt;/span&gt; class (line 18) will service this injection point causing maxNumber to have a value of "100".&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:rgb(51, 51, 255);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(255, 0, 0);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(204, 51, 204);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;Line 29: The &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:rgb(51, 51, 255);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(255, 0, 0);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(204, 51, 204);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="font-style:italic;"&gt;producer &lt;/span&gt;method in the &lt;span style="font-style:italic;"&gt;Generator&lt;/span&gt; class (line 15) will service this injection point making a&amp;nbsp; &lt;span style="font-style:italic;"&gt;randomNumber &lt;/span&gt;instance available for this Web Bean.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:rgb(51, 51, 255);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(255, 0, 0);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(204, 51, 204);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;Line 72: We use a standard &lt;span style="font-style:italic;"&gt;@PostConstruct &lt;/span&gt;annotation causing variable initialization (after this Web Bean is created).&lt;br /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:rgb(51, 51, 255);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(255, 0, 0);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(204, 51, 204);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;Line 78: Our Web Bean has been created, so the &lt;span style="font-style:italic;"&gt;randomNumber.get() &lt;/span&gt;call will cause the &lt;span style="font-style:italic;"&gt;producer &lt;/span&gt;method in the &lt;span style="font-style:italic;"&gt;Generator &lt;/span&gt;class (line 15) to get called.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style="color:rgb(51, 51, 255);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(255, 0, 0);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;&lt;span style="color:rgb(204, 51, 204);"&gt;&lt;span style="color:rgb(0, 0, 0);"&gt;Well, that's a quick overview of a simple JSF2 application that uses the Web Beans (JSR 299 implementation) and the Java Dependency Injection (JSR 330) annotations. You can find this version of Web Beans in any of the GlassFish V3 builds after September 2, 2009.&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
         <guid isPermaLink="false">263829 at http://www.java.net</guid>
         <pubDate>Fri, 04 Sep 2009 12:34:20 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/rogerk/archive/2009/09/04/contexts-and-dependency-injection-jsr-299-and-glassfish</feedburner:origLink></item>
      <item>
         <title>Dealing Gracefully with ViewExpiredException in JSF2</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/8mPUdWduEfo/dealing-gracefully-viewexpiredexception-jsf2</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;img border="0" align="left"/&gt;&lt;p&gt;My previous entry dove under the covers for JSF 2.0 and examined &lt;a rel="nofollow"
 target="_blank" href="http://weblogs.java.net/blog/edburns/archive/2009/09/02/jsf2-composite-component-metadata"&gt;composite
component metadata&lt;/a&gt;. This one is far less esoteric and shows how to
handle the &lt;code&gt;ViewExpiredException&lt;/code&gt; using a new JSF feature,
the &lt;code&gt;ExceptionHandler&lt;/code&gt;, contributed by &lt;a rel="nofollow"
 target="_blank" href="http://blog.hibernate.org/Bloggers/Pete"&gt;Pete Muir&lt;/a&gt; a JSF
Expert Group representative from JBoss.&lt;/p&gt; &lt;p&gt;JSF throws a &lt;code&gt;ViewExpiredException&lt;/code&gt; when a postback is
made to a view and, for whatever reason, that view cannot be restored.
Usually this is due to a session timeout, but a custom state management
solution could also cause this exception to be thrown. The default
behavior in JSF2 is to show the Facelets error page saying View
Expired. The default page is illustrated at right.&lt;/p&gt; &lt;img src="http://mediacast.sun.com/users/edburns00/media/default-view-expired-message.png" alt="The default ViewExpiredException error page" style="float:right;"/&gt; &lt;p&gt;One way to fix this is to declare an &lt;code&gt;&amp;lt;error-page&amp;gt;&lt;/code&gt;
element in your web.xml, as shown here.&lt;/p&gt; &lt;div class="xml" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;error-page&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;exception-type&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;javax.faces.application.ViewExpiredException&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/exception-type&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;location&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;/faces/viewExpired.xhtml&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/location&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/error-page&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;p&gt;This works well enough. You can even put JSF components on the error
page if you put the proper Faces Servlet mapping in the
&lt;code&gt;&amp;lt;location&amp;gt;&lt;/code&gt; element, as shown above. If you want to
do some application level manipulation in response to the exception,
you'll want something different, however. In this case, a custom
&lt;code&gt;ExceptionHandler&lt;/code&gt; is just the trick. I cover this in much
more detial in my upcoming book, &lt;a rel="nofollow"
 target="_blank" href="http://bit.ly/edburnsjsf2"&gt;JavaServer Faces 2.0: The Complete
Reference&lt;/a&gt;, and the example shown in this blog entry is neatly
integrated into the chapter 10 sample app. Consider this blog entry an
appetizer. So delete that old web.xml (it's not needed if you have JSF2
and Servlet 3, which you get in Glassfish V3) and let's go.&lt;/p&gt; &lt;p&gt;First, we need to install a custom &lt;code&gt;ExceptionHandler&lt;/code&gt;.
This is done using the tried and true JSF decorator pattern. In this
case, we place the following into the &lt;code&gt;faces-config.xml&lt;/code&gt;.
There's no annotation for this because it's relatively uncommon, and we
expect advanced users to use the feature. Therefore, the EG tradeoff
was to not add yet another "scan for this annotation" clause to the
spec.&lt;/p&gt; &lt;div class="xml" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;factory&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;exception-handler-factory&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;com.sun.faces.ViewExpiredExceptionExceptionHandlerFactory&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/exception-handler-factory&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/factory&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;p&gt;Here's the code for the class.&lt;/p&gt; &lt;div class="java" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;package&lt;/span&gt; &lt;span style="color:#006699;"&gt;com.sun.faces&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.context.ExceptionHandler&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.context.ExceptionHandlerFactory&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;class&lt;/span&gt; ViewExpiredExceptionExceptionHandlerFactory &lt;span style="color:#000000;font-weight:bold;"&gt;extends&lt;/span&gt; ExceptionHandlerFactory &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;private&lt;/span&gt; ExceptionHandlerFactory parent&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; ViewExpiredExceptionExceptionHandlerFactory&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;ExceptionHandlerFactory parent&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;this&lt;/span&gt;.&lt;span style="color:#006633;"&gt;parent&lt;/span&gt; &lt;span style="color:#339933;"&gt;=&lt;/span&gt; parent&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; ExceptionHandler getExceptionHandler&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ExceptionHandler result &lt;span style="color:#339933;"&gt;=&lt;/span&gt; parent.&lt;span style="color:#006633;"&gt;getExceptionHandler&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result &lt;span style="color:#339933;"&gt;=&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;new&lt;/span&gt; ViewExpiredExceptionExceptionHandler&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;result&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;return&lt;/span&gt; result&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;p&gt;The interesting things happen on lines 15 - 20. This method is
called once per request must return a new &lt;code&gt;ExceptionHandler&lt;/code&gt;
instance each time it's called. I know the method name should be
&lt;code&gt;&lt;strong&gt;create&lt;/strong&gt;ExceptionHandler&lt;/code&gt;, but we stuck with
"get" for consistence with other JSF methods. On line 17, we call the
real &lt;code&gt;ExceptionHandlerFactory&lt;/code&gt; and ask it to create the
instance, which we then wrap in our custom
&lt;code&gt;ViewExpiredExceptionExceptionHandlerFactory&lt;/code&gt; class. This is
where the real interesting stuff happens.&lt;/p&gt; &lt;div class="java" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;package&lt;/span&gt; &lt;span style="color:#006699;"&gt;com.sun.faces&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;java.util.Iterator&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;java.util.Map&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.FacesException&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.application.NavigationHandler&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.application.ViewExpiredException&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.component.UIViewRoot&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.context.ExceptionHandler&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.context.ExceptionHandlerWrapper&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.context.FacesContext&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.event.ExceptionQueuedEvent&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.event.ExceptionQueuedEventContext&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;class&lt;/span&gt; ViewExpiredExceptionExceptionHandler &lt;span style="color:#000000;font-weight:bold;"&gt;extends&lt;/span&gt; ExceptionHandlerWrapper &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;private&lt;/span&gt; ExceptionHandler wrapped&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; ViewExpiredExceptionExceptionHandler&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;ExceptionHandler wrapped&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;this&lt;/span&gt;.&lt;span style="color:#006633;"&gt;wrapped&lt;/span&gt; &lt;span style="color:#339933;"&gt;=&lt;/span&gt; wrapped&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; ExceptionHandler getWrapped&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;return&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;this&lt;/span&gt;.&lt;span style="color:#006633;"&gt;wrapped&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000066;font-weight:bold;"&gt;void&lt;/span&gt; handle&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;throws&lt;/span&gt; FacesException &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;for&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;Iterator&lt;span style="color:#339933;"&gt;&amp;lt;&lt;/span&gt;ExceptionQueuedEvent&lt;span style="color:#339933;"&gt;&amp;gt;&lt;/span&gt; i &lt;span style="color:#339933;"&gt;=&lt;/span&gt; getUnhandledExceptionQueuedEvents&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color:#006633;"&gt;iterator&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt; i.&lt;span style="color:#006633;"&gt;hasNext&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ExceptionQueuedEvent event &lt;span style="color:#339933;"&gt;=&lt;/span&gt; i.&lt;span style="color:#006633;"&gt;next&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ExceptionQueuedEventContext context &lt;span style="color:#339933;"&gt;=&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;ExceptionQueuedEventContext&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt; event.&lt;span style="color:#006633;"&gt;getSource&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3Athrowable+java.sun.com&amp;amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;Throwable&lt;/span&gt;&lt;/a&gt; t &lt;span style="color:#339933;"&gt;=&lt;/span&gt; context.&lt;span style="color:#006633;"&gt;getException&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;if&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;t &lt;span style="color:#000000;font-weight:bold;"&gt;instanceof&lt;/span&gt; ViewExpiredException&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ViewExpiredException vee &lt;span style="color:#339933;"&gt;=&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;ViewExpiredException&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt; t&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FacesContext fc &lt;span style="color:#339933;"&gt;=&lt;/span&gt; FacesContext.&lt;span style="color:#006633;"&gt;getCurrentInstance&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Map&lt;span style="color:#339933;"&gt;&amp;lt;&lt;/span&gt;String, Object&lt;span style="color:#339933;"&gt;&amp;gt;&lt;/span&gt; requestMap &lt;span style="color:#339933;"&gt;=&lt;/span&gt; fc.&lt;span style="color:#006633;"&gt;getExternalContext&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color:#006633;"&gt;getRequestMap&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; NavigationHandler nav &lt;span style="color:#339933;"&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fc.&lt;span style="color:#006633;"&gt;getApplication&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;.&lt;span style="color:#006633;"&gt;getNavigationHandler&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;try&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#666666;font-style:italic;"&gt;// Push some useful stuff to the request scope for&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#666666;font-style:italic;"&gt;// use in the page&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; requestMap.&lt;span style="color:#006633;"&gt;put&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;"currentViewId"&lt;/span&gt;, vee.&lt;span style="color:#006633;"&gt;getViewId&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nav.&lt;span style="color:#006633;"&gt;handleNavigation&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;fc, &lt;span style="color:#000066;font-weight:bold;"&gt;null&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;"viewExpired"&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fc.&lt;span style="color:#006633;"&gt;renderResponse&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;finally&lt;/span&gt; &lt;span style="color:#009900;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i.&lt;span style="color:#006633;"&gt;remove&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#666666;font-style:italic;"&gt;// At this point, the queue will not contain any ViewExpiredEvents.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#666666;font-style:italic;"&gt;// Therefore, let the parent handle them.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;getWrapped()&lt;/span&gt;.&lt;span style="color:#006633;"&gt;handle&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color:#009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;p&gt;On line 15, you see we take advantage of the
&lt;code&gt;javax.faces.context.ExceptionHandlerWrapper&lt;/code&gt; convenience
class. JSF has lots of these wrapper classes and when you use them, you
need only override the &lt;code&gt;getWrapped()&lt;/code&gt; method to return the
instance of the class you're wrapping, which is often simply passed to
the constructor, as shown on lines 19 - 21. Once you override
&lt;code&gt;getWrapped()&lt;/code&gt;, you need only override those methods you're
interested in. In this case, we want to override only
&lt;code&gt;handle()&lt;/code&gt;, which we do on lines 29 - 57.&lt;/p&gt; &lt;p&gt;We iterate over the unhandler exceptions using the iterator returned
from &lt;code&gt;getUnhandledExceptionQueuedEvents().iterator()&lt;/code&gt;, as
shown on line 30. The &lt;code&gt;ExeceptionQueuedEvent&lt;/code&gt; is a
&lt;code&gt;SystemEvent&lt;/code&gt; (also described in detail in &lt;a rel="nofollow"
 target="_blank" href="http://bit.ly/edburnsjsf2"&gt;my book&lt;/a&gt;) from which we can get the
actual &lt;code&gt;ViewExpiredException&lt;/code&gt;, which I do on line 35. I know
I'm going to be ultimately showing a JSF page so I want to extract some
information from the exception and place it in request scope, so I can
access it via EL in the page. I do this on line 37.&lt;/p&gt; &lt;p&gt;On lines 45 and 46, I leverage the JSF implicit navigation system and
cause the server to navigate to the "viewExpired" page. This assumes,
of course, that there is a &lt;code&gt;viewExpired.xhtml&lt;/code&gt; page out
there. Naturally, you could parameterize this howevere you like,
context-param, annotation, whatever. Line 46 causes the intervening
lifecycle phases to be skipped.&lt;/p&gt; &lt;p&gt;Note that we have a try-finally block here, and in the finally block,
on line 49, we call &lt;code&gt;remove()&lt;/code&gt; on the iterator. This is an
important part of the &lt;code&gt;ExceptionHandler&lt;/code&gt; usage contract. If
you handle an exception, you have to remove it from the list of
unhandled exceptions. That way, we know it's safe to call
&lt;code&gt;getWrapped().handle()&lt;/code&gt; on line 55.&lt;/p&gt; &lt;p&gt;Finally, let's see my cheesy &lt;code&gt;viewExpired.xhtml&lt;/code&gt; page in
action, shown at left.&lt;/p&gt; &lt;img src="http://mediacast.sun.com/users/edburns00/media/custom-view-expired-page.png" alt="The customized ViewExpiredException error page" style="float:left;"/&gt; &lt;p&gt;This page is not much more visually appealing than the default one,
but that's not JSF's fault! The one in the JSF2 book will look nicer.
Here's the source for this cheesy one.&lt;/p&gt; &lt;div class="html4strict" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#00bbdd;"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/html.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;html&lt;/span&gt;&lt;/a&gt; xmlns&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"http://www.w3.org/1999/xhtml"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:h&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"http://java.sun.com/jsf/html"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:f&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"http://java.sun.com/jsf/core"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;h:head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/title.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;title&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;Nice View Expired Page&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/title.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;title&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;h:head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;h:body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;h:form&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/p.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;p&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;To protect your security, we have taken the liberty of logging you&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; out. Those who sacrifice liberty for security deserve to have&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; their views expired.&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/p.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;p&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/p.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;p&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;You were on page #{currentViewId}. &amp;nbsp;Maybe that's useful.&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/p.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;p&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;h:form&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;h:body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/html.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;html&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;p&gt;Note that we show the data from the exception on line 15.&lt;/p&gt; &lt;p&gt;This entry showed you how to programmatically intercept the
&lt;code&gt;ViewExpiredException&lt;/code&gt; and do something nice with it. If you
have any other state that you can show in the page, it's easy to include
it in the Facelets view.&lt;/p&gt; &lt;style type="text/css"&gt;body{background:#fff;color:#000;font-family:"Lucida Sans Unicode", "Lucida Grande", sans-serif;font-size:12px;}img{border:0;}#content{border:1px solid #eee;margin-left:auto;margin-right:auto;width:800px;}#content #header{height:78px;width:254px;}#content #navigation{height:29px;font-size:12px;width:100%;font-family:"Lucida Sans Unicode", "Lucida Grande";}#content #navigation .menu{line-height:29px;margin-left:20px;}#content #navigation .menu .link{margin:0 5px 0 5px;}#content #navigation a,#content #navigation a:hover{background:transparent;color:#666;text-decoration:none;}#content #navigation a:hover{border:0;}#content .main{padding:10px;}#content .main a,#content .main a:hover{background:transparent;border-bottom:1px dotted #666;color:#666;text-decoration:none;}#content .main a:hover{border:0;}#content .main .adserv{background:#efefef;border:1px dotted #666;padding-left:3px;padding-right:3px;margin-left:auto;margin-right:auto;width:772px;font-size:12px;}#content .main .adserv a{padding:5px 0px 5px 0px;margin:0;border:none;color:#1c3954;display:block;}#content .main .adserv:hover{background:#e6e6e6;}#content .main .adserv b{color:#588bbb;}#content .main .multiline{border:1px solid #8eaecc;height:300px;margin-top:10px;margin-bottom:10px;margin-left:auto;margin-right:auto;padding:2px;width:774px;}#content .main .singline{border:1px solid #8eaecc;padding:2px;font-size:11px;width:150px;}#content .main .button{border:1px solid #eee;padding:2px;font-family:"Lucida Sans Unicode", "Lucida Grande";font-size:15px;}#content #data td{padding:5px;}#content .main h1{font-family:"Lucida Sans Unicode", "Lucida Grande";}#footer{font-size:9px;margin:5px 0 5px 0;text-align:center;font-family:"Lucida Sans Unicode", "Lucida Grande", "Verdana";}label{float:left;padding:0 3px;margin-right:10px;margin-top:2px;width:80px;text-align:right;}#tabbing,#tabbingDesc,#taboptions{display:none;}#tabbingDesc{width:140px;}&lt;/style&gt; &lt;p&gt;&lt;span class="technoratitag"&gt; Technorati Tags: &lt;a rel="nofollow" target="_blank" href="http://www.technorati.com/tags/edburns"&gt;edburns&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt;</description>
         <guid isPermaLink="false">263817 at http://www.java.net</guid>
         <pubDate>Thu, 03 Sep 2009 19:55:54 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/edburns/archive/2009/09/03/dealing-gracefully-viewexpiredexception-jsf2</feedburner:origLink></item>
      <item>
         <title>Latest functionality in GlassFish v3 logging.</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/a-ZTlB5Gb0c/latest-functionality-glassfish-v3-logging</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;p&gt;This blog highlights some of the changes that are part of GlassFish v3 logging.&amp;nbsp; Since Prelude I have added 3 asadmin commands related to logging. I have updated the set-log-level command and changed the syntax. See below for details. The new commands are:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; * &lt;em&gt;asadmin rotate-log&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; * asadmin list-logger-levels&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; * asadmin set-log-level&lt;/em&gt; logger-name=level:logger-name=level&lt;br /&gt;
&lt;br /&gt;
The first command rotates the log files immediately.&amp;nbsp; Users can now use native scheduling software such as &lt;em&gt;cron&lt;/em&gt; to rotate the logs.&amp;nbsp; We still support rotating logs based on file size or elapsed time since the last log rotation and this new command allows more flexibility when rotating log files.&amp;nbsp; The second command lists the loggers and their current level.&amp;nbsp; This command reports on all the known loggers that are listed in &lt;em&gt;logging.properties&lt;/em&gt; file.&amp;nbsp; Note that in some cases the loggers may not have been created by the respective containers however they will still appear in the list. The third command,&amp;nbsp; asadmin set-log-level, sets the level for aone or more loggers.&amp;nbsp;&amp;nbsp; For example, to set the log level of the web container logger level to WARNING&amp;nbsp; simply type:&amp;nbsp; &lt;em&gt;asadmin set-log-level javax.enterprise.system.container.web=WARNING.&lt;/em&gt; This command updates the logging.properties file which means that the values are persisted across server restart.&amp;nbsp; Use &lt;em&gt;asadmin list-logger-levels&lt;/em&gt;&amp;nbsp; to get the names of the loggers. &lt;br /&gt;
&lt;br /&gt;
Finally, I've added a property to &lt;em&gt;logging.properties&lt;/em&gt; file in the domain &lt;em&gt;config&lt;/em&gt; directory that controls&amp;nbsp; the number of message written to the server log file.&amp;nbsp; GlassFish v3 logging code writes messages to a queue instead of directly to&amp;nbsp; the server log file.&amp;nbsp; Log messages are taken off the queue and written to the server log file as cycles become available.&amp;nbsp; The property name is &lt;em&gt;com.sun.enterprise.server.logging.GFFileHandler.flushFrequency&lt;/em&gt;.&amp;nbsp; This propertys controls the number of messages that are taken off the queue and written to a file a time.&amp;nbsp; The actual number written is the value of this property or less depending on the number of messages in the queue.&amp;nbsp; The default value is 1.&lt;br /&gt;
&amp;nbsp;&lt;/p&gt;</description>
         <guid isPermaLink="false">263778 at http://www.java.net</guid>
         <pubDate>Wed, 02 Sep 2009 17:33:50 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/carlavmott/archive/2009/09/02/latest-functionality-glassfish-v3-logging</feedburner:origLink></item>
      <item>
         <title>JSF2 Composite Component Metadata</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/bb0WGY5bV-4/jsf2-composite-component-metadata</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;img border="0" align="left"/&gt;
&lt;p&gt;This ultra-quick blog entry shows how to use the JSF runtime to
access metadata for a composite component. Note that most of the
metadata is optional when creating a composite component, therefore,
this entry will be of interest to tool vendors and those wishing to
write composite components that stand a chance of showing up nicely in
tools.&lt;/p&gt; &lt;h1&gt;The Using Page&lt;/h1&gt; &lt;p&gt;When showing a composite component demo, I always like to start out
with the using page. &lt;/p&gt; &lt;h2&gt;Listing 1: the using page&lt;/h2&gt; &lt;div class="html4strict" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#00bbdd;"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/html.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;html&lt;/span&gt;&lt;/a&gt; xmlns&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"http://www.w3.org/1999/xhtml"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:h&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"http://java.sun.com/jsf/html"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:f&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"http://java.sun.com/jsf/core"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:my&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"http://java.sun.com/jsf/composite/cc"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:meta&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"http://mojarra.dev.java.net/cc-metadata"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;h:head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/title.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;title&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;A Simple JavaServer Faces 2.0 View&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/title.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;title&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/style.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;style&lt;/span&gt;&lt;/a&gt; &lt;span style="color:#000066;"&gt;type&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"text/css"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;.grayBox { padding: 8px; margin: 10px 0; border: 1px solid #CCC; background-color: #f9f9f9; &amp;nbsp;}&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/style.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;style&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;h:head&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;h:body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;h:form&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/p.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;p&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;Composite Component usage:&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/p.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;p&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/div.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;div&lt;/span&gt;&lt;/a&gt; &lt;span style="color:#000066;"&gt;id&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"cc"&lt;/span&gt; &lt;span style="color:#000066;"&gt;class&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"grayBox"&lt;/span&gt; &lt;span style="color:#000066;"&gt;style&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"border: 1px solid #090;"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;my:myComponent loginAction&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"#{userBean.loginAction}"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/div.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;div&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/h2.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;h2&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;Metada for This Composite Component&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/h2.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;h2&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/div.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;div&lt;/span&gt;&lt;/a&gt; &lt;span style="color:#000066;"&gt;id&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"foo"&lt;/span&gt; &lt;span style="color:#000066;"&gt;class&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"grayBox"&lt;/span&gt; &lt;span style="color:#000066;"&gt;style&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"border: 1px solid #090;"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/pre.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;pre&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;meta:printMetadata viewName&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"main.xhtml"&lt;/span&gt; libraryName&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"cc"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;resourceName&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"myComponent.xhtml"&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/pre.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;pre&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/div.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;div&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/p.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;p&lt;/span&gt;&lt;/a&gt;&amp;gt;&amp;lt;h:commandButton &lt;span style="color:#000066;"&gt;value&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"submit"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/p.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;p&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;h:form&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;h:body&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/html.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;html&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;p&gt;Line 5 declares the namespace “my” using the handy
composite component namespace prefix
“http://java.sun.com/jsf/composite” followed by
“cc”. JSF 2 interprets this to mean: treat any .xhtml files
in the directory &lt;code&gt;/resources/cc&lt;/code&gt; as a JSF composite
component. &lt;/p&gt; &lt;p&gt;Line 6 declares a Facelet custom tag library with the namespace
“http://mojarra.dev.java.net/cc-metadata”.&lt;/p&gt; &lt;p&gt;Line 20 uses the composite component named “myComponent”
in the “cc” library. &lt;/p&gt; &lt;p&gt;Line 27 uses the “printMetadata” component from the
Facelet custom tag library. We must pass in the name of a Facelet page,
the library name, and the resource name.&lt;/p&gt; &lt;h1&gt;The Composite Component&lt;/h1&gt; &lt;p&gt;Let's examine the composite component itself. As I mentioned
earlier, most of this metadata is optional and is included here just to
show what the system understands. This component has just about every
kind of metadata that is in the JSF2 spec.&lt;/p&gt; &lt;h2&gt;Listing 2 the composite component&lt;/h2&gt; &lt;div class="html4strict" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#00bbdd;"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/html.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;html&lt;/span&gt;&lt;/a&gt; xmlns&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"http://www.w3.org/1999/xhtml"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:h&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"http://java.sun.com/jsf/html"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:f&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"http://java.sun.com/jsf/core"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:ui&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"http://java.sun.com/jsf/facelets"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:fmd&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"http://java.sun.com/xml/ns/javaee/faces/design-time-metadata"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:cc&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"http://java.sun.com/jsf/composite"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/head.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;head&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/title.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;title&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;Not present in rendered output&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/title.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;title&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/head.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;head&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/body.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;body&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;cc:interface&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;&lt;span style="color:#000066;"&gt;name&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"component"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;displayName&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"A really fancy composite component"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;expert&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"true"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;hidden&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;preferred&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"true"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;shortDescription&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"This component has all the supported metadata."&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;extraTopLevelAttribute&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"Whatever I want here"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#808080;font-style:italic;"&gt;&amp;lt;!-- start top level attributes --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;cc:attribute&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;&lt;span style="color:#000066;"&gt;name&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"model"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;required&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"true"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;displayName&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"model"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;expert&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;hidden&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;preferred&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"true"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;shortDescription&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"The model for this component"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;extraTopLevelAttribute&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"Whatever I want here"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;cc:extension&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;fmd:expert&amp;gt;&lt;/span&gt;true&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;fmd:expert&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;cc:extension&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;cc:attribute&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color:#000066;"&gt;name&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"userid"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;default&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"guest"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;displayName&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"User Id"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;expert&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;hidden&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;preferred&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"true"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;shortDescription&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"The model must have a userid property"&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;cc:attribute&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color:#000066;"&gt;name&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"password"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;default&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"guest"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;displayName&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"Password"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;expert&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;hidden&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;preferred&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"true"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;shortDescription&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"The model must have a password property"&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;cc:attribute&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;cc:attribute &lt;span style="color:#000066;"&gt;name&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"useridLabel"&lt;/span&gt; default&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"Userid:"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;cc:attribute &lt;span style="color:#000066;"&gt;name&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"passwordLabel"&lt;/span&gt; default&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"Password:"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;cc:attribute &lt;span style="color:#000066;"&gt;name&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"loginButtonLabel"&lt;/span&gt; default&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"Login"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;cc:attribute &lt;span style="color:#000066;"&gt;name&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"loginAction"&lt;/span&gt; method-signature&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"java.lang.String f()"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;required&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"true"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#808080;font-style:italic;"&gt;&amp;lt;!-- end top level attributes --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#808080;font-style:italic;"&gt;&amp;lt;!-- start facets --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;cc:facet&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;&lt;span style="color:#000066;"&gt;name&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"header"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;displayName&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"The header facet for the fancy component"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;expert&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"true"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;hidden&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;preferred&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;shortDescription&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"If you want a header, this is where you put it"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;anotherExtraAttribute&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"Lots of metadata"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;cc:facet&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;&lt;span style="color:#000066;"&gt;name&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"footer"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;displayName&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"The footer facet for the fancy component"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;expert&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"true"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;hidden&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;preferred&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;shortDescription&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"If you want a footer, this is where you put it"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;anotherExtraAttribute&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"Lots of metadata"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#808080;font-style:italic;"&gt;&amp;lt;!-- end facets --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#808080;font-style:italic;"&gt;&amp;lt;!-- start attached objects --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;cc:editableValueHolder&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;&lt;span style="color:#000066;"&gt;name&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"userid"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;displayName&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"Userid field"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;expert&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"true"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;hidden&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;preferred&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;shortDescription&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"Attach a converter or validator here, if you like"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;someExtraMetadata&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"userid metadata"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;cc:editableValueHolder&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;&lt;span style="color:#000066;"&gt;name&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"password"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;displayName&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"Password field"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;expert&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"true"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;hidden&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;preferred&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;shortDescription&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"Attach a converter or validator here, if you like"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;someExtraMetadata&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"password metadata"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;cc:actionSource&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;&lt;span style="color:#000066;"&gt;name&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"login"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;displayName&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"Login button"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;expert&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"true"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;hidden&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;preferred&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"false"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;shortDescription&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"Attach an actionListener here, if you like"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp;someExtraMetadata&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"login metadata"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#808080;font-style:italic;"&gt;&amp;lt;!-- end attached objects --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;cc:interface&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;cc:implementation&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;cc:renderFacet &lt;span style="color:#000066;"&gt;name&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"header"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/p.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;p&lt;/span&gt;&lt;/a&gt;&amp;gt;&amp;lt;h:outputLabel &lt;span style="color:#000066;"&gt;for&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"#{cc.clientId}:userid"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color:#000066;"&gt;value&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"#{cc.attrs.useridLabel}"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color:#009900;"&gt;&amp;lt;h:inputText &lt;span style="color:#000066;"&gt;id&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"userid"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/p.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;p&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/p.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;p&lt;/span&gt;&lt;/a&gt;&amp;gt;&amp;lt;h:outputLabel &lt;span style="color:#000066;"&gt;for&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"#{cc.clientId}:password"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color:#000066;"&gt;value&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"#{cc.attrs.passwordLabel}"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color:#009900;"&gt;&amp;lt;h:inputText &lt;span style="color:#000066;"&gt;id&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"password"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/p.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;p&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/p.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;p&lt;/span&gt;&lt;/a&gt;&amp;gt;&amp;lt;h:commandButton &lt;span style="color:#000066;"&gt;value&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"#{cc.attrs.loginButtonLabel}"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color:#000066;"&gt;action&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"#{cc.attrs.loginAction}"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/p.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;p&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &lt;span style="color:#009900;"&gt;&amp;lt;cc:renderFacet &lt;span style="color:#000066;"&gt;name&lt;/span&gt;&lt;span style="color:#66cc66;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;"footer"&lt;/span&gt; &lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;cc:implementation&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/body.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;body&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&amp;lt;&lt;span style="color:#66cc66;"&gt;/&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://december.com/html/4/element/html.html"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;html&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;p&gt;Lines 16 - 23 declare the top level composite component metadata.&lt;/p&gt; &lt;p&gt;Lines 25 - 65 declare the attributes that may be passed as XML
elements on the composite component instance in the using page. Note
that the &lt;code&gt;loginAction&lt;/code&gt; attribute is declared as required on
line 63. This is useful because Facelets will put up a helpful error if
the page author doesn't supply a value here.&lt;/p&gt; &lt;p&gt;Lines 68 - 88 declare the allowable facets. In this case, they're optional.&lt;/p&gt; &lt;p&gt;Lines 90 - 119 declare the attached objects within the implementation
section that are publically accessible from the using page.&lt;/p&gt; &lt;h1&gt;Programmatically accessing the metadata&lt;/h1&gt; &lt;p&gt;Up to this point, everything I've shown has been included in other
blog entries elsewhere. What hasn't been shown is how the JSF runtime
uses the metadata API to actually conjure up the composite component
instance. This API is also accessible to tools that want to embed a JSF
runtime into their tool environment. To show this off, I've created a
non-composite JSF component and exposed it in the usual way, with a
Facelet taglib. This still requires a descriptor, which is placed in
&lt;code&gt;WEB-INF/classes/META-INF&lt;/code&gt;.&lt;/p&gt; &lt;h2&gt;Listing 3 the cc-metadata.taglib.xml&lt;/h2&gt; &lt;div class="xml" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;facelet-taglib&lt;/span&gt; &amp;nbsp;&lt;span style="color:#000066;"&gt;xmlns:xsi&lt;/span&gt;=&lt;span style="color:#ff0000;"&gt;'http://www.w3.org/2001/XMLSchema-instance'&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &lt;span style="color:#000066;"&gt;xmlns&lt;/span&gt;=&lt;span style="color:#ff0000;"&gt;'http://java.sun.com/xml/ns/javaee'&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &lt;span style="color:#000066;"&gt;xsi:schemaLocation&lt;/span&gt;=&lt;span style="color:#ff0000;"&gt;'http://java.sun.com/xml/ns/javaee web-facelettaglibrary_2_0.xsd'&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt; &amp;nbsp; &lt;span style="color:#000066;"&gt;version&lt;/span&gt;=&lt;span style="color:#ff0000;"&gt;"2.0"&lt;/span&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;namespace&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;http://mojarra.dev.java.net/cc-metadata&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/namespace&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;tag&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;tag-name&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;printMetadata&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/tag-name&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;component&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;component-type&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;jsf2.PrintMetadata&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/component-type&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/component&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#808080;font-style:italic;"&gt;&amp;lt;!-- these are advisory and not enforced by the runtime --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;attribute&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;name&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;viewName&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/name&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;required&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;true&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/required&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/attribute&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;attribute&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;name&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;libraryName&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/name&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;required&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;true&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/required&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/attribute&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;attribute&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;name&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;resourceName&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/name&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;required&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;true&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/required&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/attribute&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/tag&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;lt;/facelet-taglib&lt;span style="color:#000000;font-weight:bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;p&gt;Lines 11 - 23 are optional but I like to include them for explicit
documentation.&lt;/p&gt; &lt;p&gt;The JSF Component that shows how to access the metadata is in Listing
4 A. This listing covers obtaining a reference to the
&lt;code&gt;BeanInfo&lt;/code&gt; that is the composite component metadata.&lt;/p&gt; &lt;h2&gt;Listing 4 A, Accessing the composite component metadata programmatically&lt;/h2&gt; &lt;div class="java" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;package&lt;/span&gt; &lt;span style="color:#006699;"&gt;jsf2&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;java.beans.BeanInfo&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;java.io.IOException&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.FacesException&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.application.Resource&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.component.FacesComponent&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.component.UIOutput&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.context.FacesContext&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.context.ResponseWriter&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.ViewDeclarationLanguage&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;@FacesComponent&lt;span style="color:#009900;"&gt;(&lt;/span&gt;value&lt;span style="color:#339933;"&gt;=&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;"jsf2.PrintMetadata"&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;class&lt;/span&gt; PrintMetadata &lt;span style="color:#000000;font-weight:bold;"&gt;extends&lt;/span&gt; UIOutput &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; @Override&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000066;font-weight:bold;"&gt;void&lt;/span&gt; encodeAll&lt;span style="color:#009900;"&gt;(&lt;/span&gt;FacesContext context&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;throws&lt;/span&gt; &lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;IOException&lt;/span&gt;&lt;/a&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ResponseWriter writer &lt;span style="color:#339933;"&gt;=&lt;/span&gt; context.&lt;span style="color:#006633;"&gt;getResponseWriter&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;String&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; viewName,&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; libraryName,&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; resourceName&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;try&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; viewName &lt;span style="color:#339933;"&gt;=&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;this&lt;/span&gt;.&lt;span style="color:#006633;"&gt;getAttributes&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;.&lt;span style="color:#006633;"&gt;get&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;"viewName"&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;.&lt;span style="color:#006633;"&gt;toString&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; libraryName &lt;span style="color:#339933;"&gt;=&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;this&lt;/span&gt;.&lt;span style="color:#006633;"&gt;getAttributes&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;.&lt;span style="color:#006633;"&gt;get&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;"libraryName"&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;.&lt;span style="color:#006633;"&gt;toString&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; resourceName &lt;span style="color:#339933;"&gt;=&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;this&lt;/span&gt;.&lt;span style="color:#006633;"&gt;getAttributes&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;.&lt;span style="color:#006633;"&gt;get&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;"resourceName"&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;.&lt;span style="color:#006633;"&gt;toString&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;catch&lt;/span&gt; &lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Anullpointerexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;NullPointerException&lt;/span&gt;&lt;/a&gt; e&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;throw&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;new&lt;/span&gt; FacesException&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;"Must supply viewName, libraryName and resourceName attributes"&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ViewDeclarationLanguage vdl &lt;span style="color:#339933;"&gt;=&lt;/span&gt; context.&lt;span style="color:#006633;"&gt;getApplication&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;.&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#006633;"&gt;getViewHandler&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;.&lt;span style="color:#006633;"&gt;getViewDeclarationLanguage&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;context, viewName&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Resource compositeComponentResource &lt;span style="color:#339933;"&gt;=&lt;/span&gt; context.&lt;span style="color:#006633;"&gt;getApplication&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;.&lt;span style="color:#006633;"&gt;getResourceHandler&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;.&lt;span style="color:#006633;"&gt;createResource&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;resourceName, libraryName&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abeaninfo+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;BeanInfo&lt;/span&gt;&lt;/a&gt; metadata &lt;span style="color:#339933;"&gt;=&lt;/span&gt; vdl.&lt;span style="color:#006633;"&gt;getComponentMetadata&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;context, compositeComponentResource&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CompositeComponentMetadataUtils.&lt;span style="color:#006633;"&gt;writeMetadata&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;metadata, writer&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;p&gt;On lines 24 - 29 we extract the required attributes that have been
passed to us via the page author.&lt;/p&gt; &lt;p&gt;On line 32, we obtain a reference to the
&lt;code&gt;ViewDeclarationLanguage&lt;/code&gt; instance for Facelets.&lt;/p&gt; &lt;p&gt;On line 34, we create a &lt;code&gt;Resource&lt;/code&gt; instance using the
passed in composite component library name and resource name.&lt;/p&gt; &lt;p&gt;Line 36 features the call o &lt;code&gt;getComponentMetadata()&lt;/code&gt;. It
is safe to call this method only during the context of the JSF request
processing lifecycle. Because we're doing it from inside the rendering
of a component, we know that this is such a context.&lt;/p&gt; &lt;p&gt;Finally, Listing 4 B shows a traversal of the metadata.&lt;/p&gt; &lt;h2&gt;Listing 4 B, what you can do with the metadata&lt;/h2&gt; &lt;div class="java" style="font-family:monospace;"&gt;&lt;ol&gt;&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;package&lt;/span&gt; &lt;span style="color:#006699;"&gt;jsf2&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;java.beans.BeanDescriptor&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;java.beans.BeanInfo&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;java.beans.FeatureDescriptor&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;java.beans.PropertyDescriptor&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;java.io.IOException&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;java.util.Enumeration&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;java.util.List&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;java.util.Map&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.el.ValueExpression&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.component.UIComponent&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.context.FacesContext&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.context.ResponseWriter&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;import&lt;/span&gt; &lt;span style="color:#006699;"&gt;javax.faces.view.AttachedObjectTarget&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;class&lt;/span&gt; CompositeComponentMetadataUtils &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#008000;font-style:italic;font-weight:bold;"&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#008000;font-style:italic;font-weight:bold;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* &amp;lt;p&amp;gt;Use the composite component metadata specification&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#008000;font-style:italic;font-weight:bold;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* in section JSF.3.6.2.1 to print out the metadata to&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#008000;font-style:italic;font-weight:bold;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* the argument writer.&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#008000;font-style:italic;font-weight:bold;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @throws IOException&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#008000;font-style:italic;font-weight:bold;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;static&lt;/span&gt; &lt;span style="color:#000066;font-weight:bold;"&gt;void&lt;/span&gt; writeMetadata&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abeaninfo+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;BeanInfo&lt;/span&gt;&lt;/a&gt; metadata, &lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ResponseWriter writer&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;throws&lt;/span&gt; &lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;IOException&lt;/span&gt;&lt;/a&gt;&lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#666666;font-style:italic;"&gt;// Print out the top level BeanDescriptor stuff.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abeandescriptor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;BeanDescriptor&lt;/span&gt;&lt;/a&gt; descriptor &lt;span style="color:#339933;"&gt;=&lt;/span&gt; metadata.&lt;span style="color:#006633;"&gt;getBeanDescriptor&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writeFeatureDescriptor&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;"composite-component-BeanDescriptor"&lt;/span&gt;, descriptor,&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writeFeatureDescriptorValues&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#0000ff;"&gt;"composite-component-BeanDescriptor"&lt;/span&gt;, descriptor,&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Apropertydescriptor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;PropertyDescriptor&lt;/span&gt;&lt;/a&gt; attributes&lt;span style="color:#009900;"&gt;[&lt;/span&gt;&lt;span style="color:#009900;"&gt;]&lt;/span&gt; &lt;span style="color:#339933;"&gt;=&lt;/span&gt; metadata.&lt;span style="color:#006633;"&gt;getPropertyDescriptors&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;for&lt;/span&gt; &lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Apropertydescriptor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;PropertyDescriptor&lt;/span&gt;&lt;/a&gt; cur &lt;span style="color:#339933;"&gt;:&lt;/span&gt; attributes&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writeFeatureDescriptor&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;"composite-component-attribute"&lt;/span&gt;, cur,&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writeFeatureDescriptorValues&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;"composite-component-attribute"&lt;/span&gt;, cur,&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;static&lt;/span&gt; &lt;span style="color:#000066;font-weight:bold;"&gt;void&lt;/span&gt; writeFeatureDescriptor&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;String&lt;/span&gt;&lt;/a&gt; prefix,&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Afeaturedescriptor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;FeatureDescriptor&lt;/span&gt;&lt;/a&gt; fd, ResponseWriter writer&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;throws&lt;/span&gt; &lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;IOException&lt;/span&gt;&lt;/a&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer.&lt;span style="color:#006633;"&gt;write&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;prefix &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"-name:"&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fd.&lt;span style="color:#006633;"&gt;getName&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"&lt;span style="color:#000099;font-weight:bold;"&gt;&amp;#92;n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer.&lt;span style="color:#006633;"&gt;write&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;prefix &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"-displayName:"&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fd.&lt;span style="color:#006633;"&gt;getDisplayName&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"&lt;span style="color:#000099;font-weight:bold;"&gt;&amp;#92;n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer.&lt;span style="color:#006633;"&gt;write&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;prefix &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"-shortDescription:"&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fd.&lt;span style="color:#006633;"&gt;getShortDescription&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"&lt;span style="color:#000099;font-weight:bold;"&gt;&amp;#92;n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer.&lt;span style="color:#006633;"&gt;write&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;prefix &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"-expert:"&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fd.&lt;span style="color:#006633;"&gt;isExpert&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"&lt;span style="color:#000099;font-weight:bold;"&gt;&amp;#92;n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer.&lt;span style="color:#006633;"&gt;write&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;prefix &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"-hidden:"&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fd.&lt;span style="color:#006633;"&gt;isHidden&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"&lt;span style="color:#000099;font-weight:bold;"&gt;&amp;#92;n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer.&lt;span style="color:#006633;"&gt;write&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;prefix &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"-preferred:"&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fd.&lt;span style="color:#006633;"&gt;isPreferred&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"&lt;span style="color:#000099;font-weight:bold;"&gt;&amp;#92;n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;public&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;static&lt;/span&gt; &lt;span style="color:#000066;font-weight:bold;"&gt;void&lt;/span&gt; writeFeatureDescriptorValues&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;String&lt;/span&gt;&lt;/a&gt; prefix,&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Afeaturedescriptor+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;FeatureDescriptor&lt;/span&gt;&lt;/a&gt; fd, ResponseWriter writer&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;throws&lt;/span&gt; &lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;IOException&lt;/span&gt;&lt;/a&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Enumeration&lt;span style="color:#339933;"&gt;&amp;lt;&lt;/span&gt;String&lt;span style="color:#339933;"&gt;&amp;gt;&lt;/span&gt; extraValues &lt;span style="color:#339933;"&gt;=&lt;/span&gt; fd.&lt;span style="color:#006633;"&gt;attributeNames&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;String&lt;/span&gt;&lt;/a&gt; curName&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;while&lt;/span&gt; &lt;span style="color:#009900;"&gt;(&lt;/span&gt;extraValues.&lt;span style="color:#006633;"&gt;hasMoreElements&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; curName &lt;span style="color:#339933;"&gt;=&lt;/span&gt; extraValues.&lt;span style="color:#006633;"&gt;nextElement&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;if&lt;/span&gt; &lt;span style="color:#009900;"&gt;(&lt;/span&gt;curName.&lt;span style="color:#006633;"&gt;equals&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;AttachedObjectTarget.&lt;span style="color:#006633;"&gt;ATTACHED_OBJECT_TARGETS_KEY&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List&lt;span style="color:#339933;"&gt;&amp;lt;&lt;/span&gt;AttachedObjectTarget&lt;span style="color:#339933;"&gt;&amp;gt;&lt;/span&gt; attachedObjects &lt;span style="color:#339933;"&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;(&lt;/span&gt;List&lt;span style="color:#339933;"&gt;&amp;lt;&lt;/span&gt;AttachedObjectTarget&lt;span style="color:#339933;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; fd.&lt;span style="color:#006633;"&gt;getValue&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;curName&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;for&lt;/span&gt; &lt;span style="color:#009900;"&gt;(&lt;/span&gt;AttachedObjectTarget curTarget &lt;span style="color:#339933;"&gt;:&lt;/span&gt; attachedObjects&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer.&lt;span style="color:#006633;"&gt;write&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;prefix &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"-attached-object-"&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt; curTarget.&lt;span style="color:#006633;"&gt;getName&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"&lt;span style="color:#000099;font-weight:bold;"&gt;&amp;#92;n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;else&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;if&lt;/span&gt; &lt;span style="color:#009900;"&gt;(&lt;/span&gt;curName.&lt;span style="color:#006633;"&gt;equals&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;UIComponent.&lt;span style="color:#006633;"&gt;FACETS_KEY&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Map&lt;span style="color:#339933;"&gt;&amp;lt;&lt;/span&gt;String, PropertyDescriptor&lt;span style="color:#339933;"&gt;&amp;gt;&lt;/span&gt; facets &lt;span style="color:#339933;"&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;(&lt;/span&gt;Map&lt;span style="color:#339933;"&gt;&amp;lt;&lt;/span&gt;String, PropertyDescriptor&lt;span style="color:#339933;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; fd.&lt;span style="color:#006633;"&gt;getValue&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;curName&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#000000;font-weight:bold;"&gt;for&lt;/span&gt; &lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;String&lt;/span&gt;&lt;/a&gt; cur &lt;span style="color:#339933;"&gt;:&lt;/span&gt; facets.&lt;span style="color:#006633;"&gt;keySet&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a rel="nofollow" target="_blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color:#003399;"&gt;String&lt;/span&gt;&lt;/a&gt; facetPrefix &lt;span style="color:#339933;"&gt;=&lt;/span&gt; prefix &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"-facet-"&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt; cur&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writeFeatureDescriptor&lt;span style="color:#009900;"&gt;(&lt;/span&gt;facetPrefix, facets.&lt;span style="color:#006633;"&gt;get&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;cur&lt;span style="color:#009900;"&gt;)&lt;/span&gt;,&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writeFeatureDescriptorValues&lt;span style="color:#009900;"&gt;(&lt;/span&gt;facetPrefix,&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; facets.&lt;span style="color:#006633;"&gt;get&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;cur&lt;span style="color:#009900;"&gt;)&lt;/span&gt;, writer&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold;"&gt;else&lt;/span&gt; &lt;span style="color:#009900;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ValueExpression ve &lt;span style="color:#339933;"&gt;=&lt;/span&gt; &lt;span style="color:#009900;"&gt;(&lt;/span&gt;ValueExpression&lt;span style="color:#009900;"&gt;)&lt;/span&gt; fd.&lt;span style="color:#006633;"&gt;getValue&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;curName&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; writer.&lt;span style="color:#006633;"&gt;write&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;prefix &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"-extra-attribute-"&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt; curName &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;": "&lt;/span&gt; &lt;span style="color:#339933;"&gt;+&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ve.&lt;span style="color:#006633;"&gt;getValue&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;FacesContext.&lt;span style="color:#006633;"&gt;getCurrentInstance&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;.&lt;span style="color:#006633;"&gt;getELContext&lt;/span&gt;&lt;span style="color:#009900;"&gt;(&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#339933;"&gt;+&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;"&lt;span style="color:#000099;font-weight:bold;"&gt;&amp;#92;n&lt;/span&gt;"&lt;/span&gt;&lt;span style="color:#009900;"&gt;)&lt;/span&gt;&lt;span style="color:#339933;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt; &lt;li style="background:#f0f0f0;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&lt;span style="color:#009900;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="background:#fcfcfc;"&gt;&lt;div style="font:normal normal 1em/1.2em monospace;margin:0;padding:0;background:none;vertical-align:top;"&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt; &lt;p&gt;On line 30, we ask the argument &lt;code&gt;BeanInfo&lt;/code&gt; for its
&lt;code&gt;BeanDescriptor&lt;/code&gt;. We pass this to the helper method
&lt;code&gt;writeFeatureDescriptor()&lt;/code&gt;. This simple method just prints
out the standard &lt;code&gt;FeatureDescriptor&lt;/code&gt; metadata.&lt;/p&gt; &lt;p&gt;On line 33, we pass the same descriptor to the helper method
&lt;code&gt;writeFeatureDescriptorValues()&lt;/code&gt;. This method steps through
the &lt;code&gt;Enumeration&lt;/code&gt; returned from
&lt;code&gt;attributeNames()&lt;/code&gt;, calls &lt;code&gt;getValue()&lt;/code&gt; on each
entry, and takes appropriate action on each entry, based on the metadata
specification. Currently there are three kinds of entries. &lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;p&gt;Lines 70 - 75 deal with the attached objects. The type for this entry is &lt;code&gt;List&amp;lt;AttachedObjectTarget&amp;gt;&lt;/code&gt;. &lt;code&gt;AttachedObjectTarget&lt;/code&gt; encapsulates how an attached object, in this declared on lines 90 through 119 of Listing 1, exposes an inner component to the page author.&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;Lines 76 - 85 deal with the exposed facets. The type for this entry is &lt;code&gt;Map&amp;lt;String, PropertyDescriptor&amp;gt;&lt;/code&gt;, where the key is the facet name and the &lt;code&gt;PropertyDescriptor&lt;/code&gt; represents each individual &lt;code&gt;&amp;lt;cc:facet&amp;gt;&lt;/code&gt; element. These are on lines 68 - 88 of Listing 1.&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;Lines 87 - 91 deal with the else case, which can be characterized as “if it's not the attached objects, and it's not the facets, then it'll just come to you as a &lt;code&gt;ValueExpression&lt;/code&gt;. &lt;/p&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Back up on line 36, we ask the metadata for the
&lt;code&gt;PropertyDescriptor []&lt;/code&gt; using
&lt;code&gt;getPropertyDescriptors()&lt;/code&gt;. This is specified to return a
&lt;code&gt;PropertyDescritor&lt;/code&gt; for each of the attributes, in this case
show on lines 25 - 64 of Listing 1. For each attribute, we print out
the &lt;code&gt;FeatureDescriptor&lt;/code&gt; and the values. However, note that
in the case of attributes, there will only be
&lt;code&gt;ValueExpression&lt;/code&gt; instances in the &lt;code&gt;getValue()&lt;/code&gt;
data structure. A screengrab of the running page is show here.&lt;/p&gt; &lt;p&gt;&lt;img src="http://mediacast.sun.com/users/edburns00/media/cc-metadata-grab.png" alt="screen grab of page showing component metadata"/&gt;&lt;/p&gt; &lt;p&gt;When the Expert Group designed this api, we wanted to make it as easy
as possible to provide tool support for composite components. I hope
this is helpful to tool authors for this purpose.&lt;/p&gt; &lt;p&gt;&lt;span class="technoratitag"&gt; Technorati Tags: &lt;a rel="nofollow" target="_blank" href="http://www.technorati.com/tags/edburns"&gt;edburns&lt;/a&gt;&lt;/span&gt;
&lt;/p&gt; &lt;style type="text/css"&gt;body{background:#fff;color:#000;font-family:"Lucida Sans Unicode", "Lucida Grande", sans-serif;font-size:12px;}img{border:0;}#content{border:1px solid #eee;margin-left:auto;margin-right:auto;width:800px;}#content #header{height:78px;width:254px;}#content #navigation{height:29px;font-size:12px;width:100%;font-family:"Lucida Sans Unicode", "Lucida Grande";}#content #navigation .menu{line-height:29px;margin-left:20px;}#content #navigation .menu .link{margin:0 5px 0 5px;}#content #navigation a,#content #navigation a:hover{background:transparent;color:#666;text-decoration:none;}#content #navigation a:hover{border:0;}#content .main{padding:10px;}#content .main a,#content .main a:hover{background:transparent;border-bottom:1px dotted #666;color:#666;text-decoration:none;}#content .main a:hover{border:0;}#content .main .adserv{background:#efefef;border:1px dotted #666;padding-left:3px;padding-right:3px;margin-left:auto;margin-right:auto;width:772px;font-size:12px;}#content .main .adserv a{padding:5px 0px 5px 0px;margin:0;border:none;color:#1c3954;display:block;}#content .main .adserv:hover{background:#e6e6e6;}#content .main .adserv b{color:#588bbb;}#content .main .multiline{border:1px solid #8eaecc;height:300px;margin-top:10px;margin-bottom:10px;margin-left:auto;margin-right:auto;padding:2px;width:774px;}#content .main .singline{border:1px solid #8eaecc;padding:2px;font-size:11px;width:150px;}#content .main .button{border:1px solid #eee;padding:2px;font-family:"Lucida Sans Unicode", "Lucida Grande";font-size:15px;}#content #data td{padding:5px;}#content .main h1{font-family:"Lucida Sans Unicode", "Lucida Grande";}#footer{font-size:9px;margin:5px 0 5px 0;text-align:center;font-family:"Lucida Sans Unicode", "Lucida Grande", "Verdana";}label{float:left;padding:0 3px;margin-right:10px;margin-top:2px;width:80px;text-align:right;}#tabbing,#tabbingDesc,#taboptions{display:none;}#tabbingDesc{width:140px;}&lt;/style&gt;</description>
         <guid isPermaLink="false">263772 at http://www.java.net</guid>
         <pubDate>Wed, 02 Sep 2009 09:53:21 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/edburns/archive/2009/09/02/jsf2-composite-component-metadata</feedburner:origLink></item>
      <item>
         <title>Jython 2.5.1 Release Candidate 1 is out!</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/fecF_h6L0M0/jython-251-release-candidate-1-is-out.html</link>
         <description>On behalf of the Jython development team, I'm pleased to announce that Jython 2.5.1rc1 is available for &lt;a rel="nofollow" target="_blank" href="https://sourceforge.net/projects/jython/files/jython-dev/2.5.1rc1/jython_installer-2.5.1rc1.jar/download"&gt;download&lt;/a&gt;. See the &lt;a rel="nofollow" target="_blank" href="http://wiki.python.org/jython/InstallationInstructions"&gt;installation instructions&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Jython 2.5.1rc1 fixes a number of bugs, including some major errors when using&lt;br /&gt;coroutines and when using relative imports. Please see the NEWS file for&lt;br /&gt;detailed release notes.&lt;br /&gt;&lt;br /&gt;Please &lt;a rel="nofollow" target="_blank" href="http://bugs.jython.org"&gt;report any bugs&lt;/a&gt; that you find. Thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14276139-3823294679113365874?l=fwierzbicki.blogspot.com'/&gt;&lt;/div&gt;</description>
         <author>Frank Wierzbicki</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-14276139.post-3823294679113365874</guid>
         <pubDate>Tue, 01 Sep 2009 04:07:00 -0700</pubDate>
      <feedburner:origLink>http://fwierzbicki.blogspot.com/2009/09/jython-251-release-candidate-1-is-out.html</feedburner:origLink></item>
      <item>
         <title>What's New: Releases and Oh Right, a New Gig</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/H1H_bfLAzGY/whats-new-releases-and-oh-right-a-new-gig</link>
         <description>&lt;p&gt;So, after a long, busy summer, I&amp;#8217;m finally back onto support of the various bits for JRuby web application development (meaning &lt;a rel="nofollow" target="_blank" href="http://warbler.kenai.com/"&gt;Warbler&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://jruby-rack.kenai.com/"&gt;JRuby&amp;#45;Rack&lt;/a&gt;)&amp;#46; I&amp;#8217;m pleased to announce the 0&amp;#46;9&amp;#46;5 release of JRuby&amp;#45;Rack and the 0&amp;#46;9&amp;#46;14 release of Warbler! All of this brought to you courtesy of Engine Yard, my &lt;a rel="nofollow" target="_blank" href="http://www.engineyard.com/blog/2009/jrubys-future-at-engine-yard/"&gt;new employer&lt;/a&gt;!&lt;/p&gt; &lt;p&gt;Both of these are long&amp;#45;overdue releases&amp;#46; Here&amp;#8217;s the low&amp;#45;down on each:&lt;/p&gt; &lt;h2&gt;JRuby&amp;#45;Rack 0&amp;#46;9&amp;#46;5&lt;/h2&gt; &lt;p&gt;For the full history, see the &lt;a rel="nofollow" target="_blank" href="http://github.com/nicksieger/jruby-rack/blob/805edcc003f96c4eb30b073f24b35cd92dce056a/History.txt"&gt;0&amp;#46;9&amp;#46;5 entry in the History&amp;#46;txt file&lt;/a&gt;&amp;#46;&lt;/p&gt; &lt;p&gt;One &lt;a rel="nofollow" target="_blank" href="http://kenai.com/jira/browse/JRUBY_RACK-18"&gt;bad bug in particular&lt;/a&gt; prevented you from running Rack&amp;#45;powered Rails 2&amp;#46;3 out of the box at all because JRuby&amp;#45;Rack bundled an older version of Rack than needed by Rails&amp;#46; This has been fixed for good by not forcing JRuby&amp;#45;Rack&amp;#8217;s bundled copy of Rack on your application; any version of Rack you include (either via gems or vendor&amp;#8217;ed in Rails or your application) will take precedence&amp;#46;&lt;/p&gt; &lt;p&gt;Another major upgrade is the introduction of rewindable requests&amp;#46; The &lt;a rel="nofollow" target="_blank" href="http://rack.rubyforge.org/doc/SPEC.html"&gt;Rack spec dictates that the request IO object be rewindable&lt;/a&gt; and that server/handler writers (such as myself) need to buffer the input&amp;#46; You&amp;#8217;d think that Java application servers would do this for you, but, as is the case with Java so often, servers perform the bare minimum amount of work and leave the grunt work to the application developer&amp;#46; So JRuby&amp;#45;Rack takes care of the input buffering for you&amp;#46; The first 64k of input data are buffered entirely in memory; above that the request body is dumped into a temp file&amp;#46; (64k is a default and is configurable&amp;#46; If you have a better suggestion for a default, let me know&amp;#46;)&lt;/p&gt; &lt;p&gt;Finally, this release brings back Java Servlet&amp;#45;based sessions for use with the Rack&amp;#45;based session mechanism&amp;#46; For those of you experimenting with hybrid Rails/Java applications and want to share session data between them, you&amp;#8217;ll want this&amp;#46; Servlet sessions are not the default; you need to turn them on by setting &lt;code&gt;ActionController::Base.session_store = :java_servlet_store&lt;/code&gt;&amp;#46;&lt;/p&gt; &lt;h2&gt;Warbler 0&amp;#46;9&amp;#46;14&lt;/h2&gt; &lt;p&gt;Warbler&amp;#8217;s main change this release is to unbundle JRuby&amp;#46; When you install Warbler as a gem, you&amp;#8217;ll now get a dependent gem called &lt;code&gt;jruby-jars&lt;/code&gt; installed for you&amp;#46; We&amp;#8217;ll be releasing a new version of this gem with every release of JRuby, and you&amp;#8217;ll be able to upgrade JRuby versions without having to update Warbler&amp;#46;&lt;/p&gt; &lt;p&gt;JRuby&amp;#45;Rack is still bundled with Warbler for now (0&amp;#46;9&amp;#46;14 comes with JRuby&amp;#45;Rack 0&amp;#46;9&amp;#46;5 of course), but the jar file is not that big and the two projects tend to be released around the same time&amp;#46; By Warbler 1&amp;#46;0 I hope to have a mechanism to unbundle all jar files so that Warbler is just a lightweight Rake library with enough smarts to fetch the binaries your application needs&amp;#46;&lt;/p&gt; &lt;h2&gt;Future&lt;/h2&gt; &lt;p&gt;The projects seem to be headed for a 1&amp;#46;0 release soon&amp;#46; For these releases, I hope to ensure that they are both ready to take advantage of Rails 3 out of the box&amp;#46; One of the ways is to use &lt;a rel="nofollow" target="_blank" href="http://github.com/wycats/bundler/tree/master"&gt;Bundler&lt;/a&gt; in Warbler to manage gems&amp;#46; Hopefully as Rails 3 and other applications start to standardize Bundler manifests, it means less custom configuration for Warbler&amp;#46;&lt;/p&gt; &lt;p&gt;Since the core of JRuby&amp;#45;Rack seems to be stabilizing, the next promising step is to explore more ways to integrate with existing Java code and Java applications&amp;#46; This should dovetail nicely with JRuby&amp;#8217;s plan for better Java integration in the upcoming JRuby 1&amp;#46;4 release&amp;#46; For example, &lt;a rel="nofollow" target="_blank" href="http://markmail.org/message/xck6goqc22ob454l"&gt;Christian Seiler explained how he&amp;#8217;s using JRuby&amp;#45;Rack&lt;/a&gt; to integrate JMS while running an in&amp;#45;memory ActiveMQ server for his site &lt;a rel="nofollow" target="_blank" href="http://www.blissmessage.com/"&gt;blissmessage&amp;#46;com&lt;/a&gt;&amp;#46; These kinds of ease&amp;#45;of&amp;#45;use scenarios where you can start a single process with all of your application needs: web server, message queue, timer for periodic tasks etc&amp;#46; present a great way to jumpstart a project&amp;#46; I&amp;#8217;d like to see some of these APIs &lt;a rel="nofollow" target="_blank" href="http://github.com/wireframe/backgrounded/tree"&gt;standardize&lt;/a&gt; so that we can transition from all&amp;#45;in&amp;#45;one development servers up to scalable production clusters where app, message queue, and other servers are separated and standalone&amp;#46;&lt;/p&gt; &lt;p&gt;The fellows over at Google have been busy this summer with the &lt;a rel="nofollow" target="_blank" href="http://code.google.com/p/appengine-jruby/"&gt;appengine&amp;#45;jruby&lt;/a&gt; project, and there are opportunities for tuning that experience as well&amp;#46;&lt;/p&gt; &lt;p&gt;Of course, your suggestions are welcome too&amp;#46; I&amp;#8217;d appreciate it if you&amp;#8217;d drop me a line if you&amp;#8217;re doing something novel with these tools, so I can help shape future directions around people like you who are Getting Things Done with them!&lt;/p&gt; &lt;p&gt;&lt;em&gt;(Postlude: Both these projects need a logo&amp;#46; If you can mock something up, I&amp;#8217;d love to see some ideas!)&lt;/em&gt;&lt;/p&gt;</description>
         <author>Nick Sieger</author>
         <guid isPermaLink="false">urn:uuid:29c2d853-8c43-4d1c-b09a-3f6f6ff88690</guid>
         <pubDate>Thu, 27 Aug 2009 13:12:00 -0700</pubDate>
      <feedburner:origLink>http://blog.nicksieger.com/articles/2009/08/27/whats-new-releases-and-oh-right-a-new-gig</feedburner:origLink></item>
      <item>
         <title>Introducing Surinx</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/mAvphJAGD5Y/introducing-surinx.html</link>
         <description>In June of this year, I spent a few hours formulating a dynamic cousin to &lt;a rel="nofollow" target="_blank" href="http://blog.headius.com/2008/08/duby-update.html"&gt;Duby&lt;/a&gt;. Duby, if you don't remember, is a static-typed language with Ruby's syntax and Java's type system. Duby supports all Ruby's literals, uses local type inference (only argument types *must* be declared), and runs as fast as Java (because it produces nearly identical bytecode). But with the advent of invokedynamic, Duby needed a playmate.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enter "Juby". Juby is intended to be basically like Duby, in that it uses Java's types and Ruby's syntax. But it takes advantage of the new invokedynamic opcode to be 100% dynamic. Juby is a dynamic Duby, or perhaps a dynamic Java with Ruby syntax. It's not hard to comprehend.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But the name was a problem. Juby sounds like "Jewbie", a pejorative term for a Jewish person. So I sent out a call for names to the Twitterverse, ultimately ending up with far more names than I could choose from.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The name I have chosen, &lt;a rel="nofollow" target="_blank" href="http://github.com/headius/surinx/tree/master"&gt;Surinx&lt;/a&gt;, has a simple story attached. You see, when James Gosling created Java, he originally named it "Oak", after the tree outside his window. So I followed his lead; the tree (a bush, really) outside my window is a lilac, &lt;i&gt;Syringa vulgaris&lt;/i&gt;. The genus "Syringa" is derived from New Latin, based on a Greek word "surinx" meaning "shepherd's pipe" from the use of the &lt;i&gt;Syringa&lt;/i&gt; plant's hollow stems to make pipes. Perhaps Surinx is building on the "hollow stem" of the JVM to produce something you can smoke (other dynamic languages) with. Combined with its cousin "Duby", we have quite a pair.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And in other news, the simple Surinx implementation of "fib" below (identical to Ruby) manages to run fib(40) in only 7 seconds on current MLVM (OpenJDK7 + invokedynamic and other tidbits), a five-fold improvement over JRuby's fastest mode (jruby --fast).&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;def fib(a)&lt;br /&gt; if a &amp;lt; 2&lt;br /&gt; a&lt;br /&gt; else&lt;br /&gt; fib(a - 1) + fib(a - 2)&lt;br /&gt; end&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;Given that JRuby has started to support invokedynamic, the solid performance of Surinx bodes very well for JRuby's future.&lt;br /&gt;&lt;br /&gt;Please welcome &lt;a rel="nofollow" target="_blank" href="http://github.com/headius/surinx/tree/master"&gt;Surinx&lt;/a&gt; to your language repertoire!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20975090-5872747522426190002?l=blog.headius.com'/&gt;&lt;/div&gt;</description>
         <author>Charles Oliver Nutter</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-20975090.post-5872747522426190002</guid>
         <pubDate>Tue, 25 Aug 2009 20:52:00 -0700</pubDate>
      <feedburner:origLink>http://blog.headius.com/2009/08/introducing-surinx.html</feedburner:origLink></item>
      <item>
         <title>Tricks and Tips with Comet part 1: The Browser difference</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/M6gB-nSWKXE/tricks-and-tips-comet-part-1-browser-difference</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;div class="field field-type-filefield field-field-thumb-100x70"&gt;&lt;div class="field-items"&gt;&lt;div class="field-item odd"&gt;&lt;img class="imagefield imagefield-field_thumb_100x70" width="3472" height="2604" alt="" src="http://www.java.net/sites/default/files/100_0782.JPG?1251236325"/&gt;    &lt;/div&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Writing Comet application is more and more simple, thanks to framework like LIft and Atmosphere. On the Client side, the difference between Safari, Opera, Firefox, IE and Chrome can make your application completely unresponsive or broken. Of course, there is some tricks to make it work.&lt;/p&gt;
&lt;p&gt;First, if you are new to Comet, I recommend you take a look at &lt;a rel="nofollow" target="_blank" href="http://weblogs.java.net/blog/jfarcand/archive/2007/05/new_adventures.html"&gt;this introduction&lt;/a&gt;. For this serie, I will use my new project called &lt;a rel="nofollow" target="_blank" href="http://atmosphere.dev.java.net"&gt;Atmosphere&lt;/a&gt;, which is a framework for writing portable Comet and REST applications. I always use Firefox for developping, and recently I've got surprise when I 've realized all Atmosphere's sample did work on WebKit (Chrome, Safari) and Opera.&lt;/p&gt;
&lt;p&gt;First, to make Safari works properly with the Comet technique called http streaming or forever frame, make sure, on the server side, you set the content-type properly and disable the cache.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.setContentType("text/html");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.addHeader("Cache-Control", "private");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.addHeader("Pragma", "no-cache");&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That works well with GlassFish and Jetty...but not Tomcat. Why? Because both Jetty and GlassFish append the charset for you all the time, and Tomcat don't. Safari seems to not like it. So the proper code consist of:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.setContentType("text/html;charset=ISO-8859-1");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.addHeader("Cache-Control", "private");&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.addHeader("Pragma", "no-cache");&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Note that Firefox will work without the above, same for IE. Now the above will make the Comet technique called Long-polling working, but http streaming will still be broken on Safari. Why? Because when you suspend the response, if you don't fill out Safari with some data (~2k), all events that will happen once the response has been suspended will be written by the server, but never read/displayed in Safari, Chrome, IE and Opera.&amp;nbsp; As an example, I&amp;nbsp;always output the following junk before I suspend a response in Atmosphere:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private final static String JUNK = "&amp;lt;!-- Comet is a programming technique that enables web " +&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "servers to send data to the client without having any need " +&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "for the client to request it. --&amp;gt;&amp;#92;n";&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...... &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i =0; i&amp;lt; 10; i++){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.getWriter().write(JUNK);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; res.getWriter().flush();&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you are using &lt;a rel="nofollow" target="_blank" href="http://weblogs.java.net/blog/jfarcand/archive/2009/07/writing_comet_b.html"&gt;Atmosphere REST&amp;nbsp;module using Scala&lt;/a&gt;, you also need to do something like:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var JUNK : String = "&amp;lt;!-- Comet is a programming technique that enables web " +&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "servers to send data to the client without having any need " +&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "for the client to request it. --&amp;gt;&amp;#92;n"&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Suspend&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @GET&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @Produces(Array("text/html;charset=ISO-8859-1"))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; def suspend() = {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var s = new StringBuilder()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i &amp;lt;- 0 to 10){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.append(JUNK)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.toString()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Quite paintfull but until &lt;a rel="nofollow" target="_blank" href="http://dev.w3.org/html5/websockets/"&gt;websocket &lt;/a&gt;are widely adopted (will they?), you will need a little bit of hacking. But once you know them, that should be easy. Client library like JQuery and Dojo's Cometd implementation already do that for you, but if are using pure javascript (or iframe for the http streaming support), make sure you recall that simple tip. You can download many Comet samples from &lt;a rel="nofollow" target="_blank" href="http://download.java.net/maven/2/org/atmosphere/samples/"&gt;here&lt;/a&gt;. They work on any Java WebServer.&lt;/p&gt;
&lt;p&gt;If you have any questions, post them on &lt;a rel="nofollow" target="_blank" href="mailto:users@atmosphere.dev.java.net"&gt;users@atmosphere.dev.java.net&lt;/a&gt;, use &lt;a rel="nofollow" target="_blank" href="http://n2.nabble.com/Atmosphere-users-mailling-list-f2493822.html"&gt;Nabble&lt;/a&gt; or or &lt;a rel="nofollow" target="_blank" href="http://twitter.com/atmosphere_java"&gt;tweet them&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
 
 
technorati: &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/atmosphere+framework"&gt;atmosphere framework&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/browser"&gt;browser&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/comet"&gt;comet&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/scala"&gt;scala&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://technorati.com/tag/ajax"&gt;ajax&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
         <guid isPermaLink="false">259748 at http://www.java.net</guid>
         <pubDate>Tue, 25 Aug 2009 14:39:36 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/jfarcand/archive/2009/08/25/tricks-and-tips-comet-part-1-browser-difference</feedburner:origLink></item>
      <item>
         <title>Thursday at GooglePlex for an Eclipse Day</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/jR00yJNLFtw/thursday-googleplex-eclipse-day</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;&lt;p&gt;Bonjour, Comment Java?&lt;/p&gt;
&lt;p&gt;This coming Thursday(08/27/09) 'll be at GooglePlex (Mountain View) for an Eclipse Day...The entire genda is at &lt;a rel="nofollow" target="_blank" href="http://wiki.eclipse.org/Eclipse_Day_At_Googleplex_2009"&gt;http://wiki.eclipse.org/Eclipse_Day_At_Googleplex_2009&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;2 presos seem to be very interesting so far:&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://wiki.eclipse.org/Eclipse_Day_At_Googleplex_2009/Session_Abstacts#OSGi_for_Eclipse_Developers"&gt;OSGi for Eclipse Developers&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://wiki.eclipse.org/Eclipse_Day_At_Googleplex_2009/Session_Abstacts#Deploying_Successful_Enterprise_Tools"&gt;Deploying Successful Entreprise Tools&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and possibly others...The Google crowd is impressive.&lt;/p&gt;
&lt;p&gt;There is a waiting list for people who did not register in time:-) But I am sure online videos of the conference will be available as well.&lt;/p&gt;
&lt;p&gt;Ludo (Testing the new Java.net Blog system)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
         <guid isPermaLink="false">258357 at http://www.java.net</guid>
         <pubDate>Mon, 24 Aug 2009 14:19:24 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/ludo/archive/2009/08/24/thursday-googleplex-eclipse-day</feedburner:origLink></item>
      <item>
         <title>Reviving Project WOM - WSDL Object Model</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/1beNotLMElA/reviving-project-wom-wsdl-object-model</link>
         <description>&lt;span class='print-link'&gt;&lt;/span&gt;Sometime back I started a project - &lt;a rel="nofollow" target="_blank" href="http://wom.dev.java.net"&gt;WOM&lt;/a&gt;,
short for WSDL Object Model. The idea was to come up with a library
that provides efficient parsing and provides a WSDL Object Model that
can be used to inspect, traverse/navigate and will be useful for IDEs
such as NetBeans and also WSDL 2 Java generators, such as &lt;a rel="nofollow" target="_blank" href="http://metro.dev.java.net"&gt;Metro&lt;/a&gt;
&lt;a rel="nofollow" target="_blank" href="https://jax-ws.dev.java.net/nonav/2.1.7/docs/wsimport.html"&gt;wsimport&lt;/a&gt;.
&lt;br&gt;
&lt;br&gt;
After some initial (90%) of work I left the project ideal to get back
to it after I get past some other interesting things I was involved
with. Recently someone from community sent me mail and asked whats up
with this project and he plans to build some custome API using WOM and
XSOM APIs for schema object model. I fixed some bugs, added
documentations and released 0.9.0 version of WOM to maven. &lt;br&gt;
&lt;br&gt;
The design of WOM is largely based on &lt;a rel="nofollow" target="_blank" href="http://xsom.dev.java.net"&gt;XSML Schema Object
Model (XSOM).&lt;/a&gt; It is very
extensible. For example, you can use your own ContentHandler to parse
the XML Schema. Use your own extension handlers to parse WSDL
extensibility elements. I need to do more work on adding documentation
for these.
But what I have there should be sufficient for you to start playing
with it.&lt;br&gt;
&lt;pre&gt;WOMParser parser = new WOMParser();&lt;br&gt;WSDLSet wsdls = parser.parse(new File("sample.wsdl"));&lt;br&gt;WSDLDefinitions def = wsdls.getWSDLs().next();&lt;br&gt;&lt;/pre&gt;
Refer to &lt;a rel="nofollow" target="_blank" href="https://wom.dev.java.net/nonav/apidocs/"&gt;API doc&lt;/a&gt;
on how to navigate and do some interesting things with the WSDL
components.&lt;br&gt;
&lt;br&gt;
See the &lt;a rel="nofollow" target="_blank" href="http://wom.dev.java.net"&gt;project
page&lt;/a&gt; for details and send your
feedback.&lt;br&gt;</description>
         <guid isPermaLink="false">257032 at http://www.java.net</guid>
         <pubDate>Thu, 20 Aug 2009 14:56:32 -0700</pubDate>
      <feedburner:origLink>http://www.java.net/blog/archive/2009/08/20/reviving-project-wom-wsdl-object-model</feedburner:origLink></item>
      <item>
         <title>InvokeDynamic and Jython part I</title>
         <link>http://feedproxy.google.com/~r/GlassFish-webtier/~3/lG8crifq878/invokedynamic-and-jython-part-i.html</link>
         <description>The invokedynamic work from the &lt;a rel="nofollow" target="_blank" href="http://openjdk.java.net/projects/mlvm/"&gt;Da Vinci Machine Project&lt;/a&gt; has come a long way. In fact, it has started to make it's way into OpenJDK 7 builds. To try the bleeding edge version out for yourself, follow these &lt;a rel="nofollow" target="_blank" href="http://wikis.sun.com/display/mlvm/Building"&gt;instructions&lt;/a&gt; to patch and build your own. But, be warned, it's a bit tricky to get started. You may find that these examples will work with &lt;a rel="nofollow" target="_blank" href="http://download.java.net/jdk7/binaries/"&gt;OpenJDK 7 binaries&lt;/a&gt; (sooner or later they should!). For those who haven't heard about this work yet, invokedynamic, which is a part of &lt;a rel="nofollow" target="_blank" href="http://jcp.org/en/jsr/detail?id=292"&gt;JSR-292&lt;/a&gt;, allows a program to dynamically call methods with (potentially) the same performance characteristics as static calls. Here is about the simplest invokedynamic program you can write:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import java.dyn.CallSite;&lt;br /&gt;import java.dyn.InvokeDynamic;&lt;br /&gt;import java.dyn.Linkage;&lt;br /&gt;import java.dyn.MethodType;&lt;br /&gt;import java.dyn.MethodHandles;&lt;br /&gt;&lt;br /&gt;public class Example {&lt;br /&gt; public static void main(String... av) throws Throwable {&lt;br /&gt; for (String a : av) {&lt;br /&gt; InvokeDynamic. call(a);&lt;br /&gt; }&lt;br /&gt; InvokeDynamic. call2(av[0]);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public static void foo(String x) {&lt;br /&gt; System.out.println("Hello, " + x);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; static { Linkage.registerBootstrapMethod("linkDynamic"); }&lt;br /&gt; private static CallSite linkDynamic(Class caller, String name, MethodType type) {&lt;br /&gt; System.out.println("linking:" + name);&lt;br /&gt; CallSite c = new CallSite(caller, name, type);&lt;br /&gt; c.setTarget(MethodHandles.lookup().findStatic(Example1.class, "foo",&lt;br /&gt; MethodType.make(void.class, String.class)));&lt;br /&gt; return c;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt; First notice the linkDynamic method. The static initializer above it registers that method as a special bootstrap method that invokedynamic will use when you want to call a method dynamically. The interesting bit to notice are the two calls to methods on InvokeDynamic. InvokeDynamic has no actual methods of its own. You can call any method on it (here I use "call" and "call2", but it could just as well have been "foo123" or "sasquatch") When you make these calls, control is passed to the bootstrap method (linkDynamic in this case). linkDynamic gets passed the Class of the caller, the name that was used ("call" and "call2" in this program) and the MethodType of the call, which specifieds the signature of the dynamic call.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To compile the above code, execute:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;javac -XDinvokedynamic Example.java&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To run it:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;java -XX:+EnableMethodHandles -XX:+EnableInvokeDynamic Example a b c&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Which should produce:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;linking:call&lt;br /&gt;Hello, a&lt;br /&gt;Hello, b&lt;br /&gt;Hello, c&lt;br /&gt;linking:call2&lt;br /&gt;Hello, a&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Notice that we called "call" three times, but it only needed to be linked once. We then called call2 and it was separately linked. Had we invoked call2 again it would not have needed linking. Next in my exploration, I'll wire it up with some Python internal dispatch logic:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package org.python.compiler;&lt;br /&gt;&lt;br /&gt;import java.dyn.CallSite;&lt;br /&gt;import java.dyn.InvokeDynamic;&lt;br /&gt;import java.dyn.Linkage;&lt;br /&gt;import java.dyn.MethodType;&lt;br /&gt;import java.dyn.MethodHandle;&lt;br /&gt;import java.dyn.MethodHandles;&lt;br /&gt;import java.dyn.MethodType;&lt;br /&gt;&lt;br /&gt;import org.python.core.Py;&lt;br /&gt;import org.python.core.PyCode;&lt;br /&gt;import org.python.core.PyFunction;&lt;br /&gt;import org.python.core.PyInteger;&lt;br /&gt;import org.python.core.PyObject;&lt;br /&gt;import org.python.core.PyString;&lt;br /&gt;import org.python.core.PyTuple;&lt;br /&gt;import org.python.core.ThreadState;&lt;br /&gt;&lt;br /&gt;public class IndyTest {&lt;br /&gt;&lt;br /&gt; public static void run() throws Throwable {&lt;br /&gt; PyObject result = InvokeDynamic. foo(new PyInteger(4), Py.None,&lt;br /&gt; Py.EmptyObjects, new PyTuple());&lt;br /&gt; System.out.println("result = " + result);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; static { Linkage.registerBootstrapMethod("linkDynamic"); }&lt;br /&gt; private static CallSite linkDynamic(Class caller, String name, MethodType type) {&lt;br /&gt; System.out.println("linkDynamic...");&lt;br /&gt; CallSite site = new CallSite(caller, name, type);&lt;br /&gt; ThreadState ts = Py.getThreadState();&lt;br /&gt; PyCode func_code = ((PyFunction)ts.frame.getname(name)).func_code;&lt;br /&gt;&lt;br /&gt; MethodType oneArgCall = MethodType.make(&lt;br /&gt; PyObject.class, //return type&lt;br /&gt; ThreadState.class, // state&lt;br /&gt; PyObject.class, // arg1&lt;br /&gt; PyObject.class, // globals&lt;br /&gt; PyObject[].class, // defaults&lt;br /&gt; PyObject.class // closure&lt;br /&gt; );&lt;br /&gt; MethodHandle call = MethodHandles.lookup().findVirtual(PyCode.class, "call", oneArgCall);&lt;br /&gt; call = MethodHandles.insertArguments(call, 0, func_code, ts);&lt;br /&gt; call = MethodHandles.convertArguments(call, type);&lt;br /&gt; site.setTarget(call);&lt;br /&gt;&lt;br /&gt; return site;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There is a bit more going on here. In short, we look up the current state of the Jython interpreter when this is invoked and look for a function called "foo". We pass the PyInteger 4 (plus some boilerplate at the end -- in the future we should be able to only pass the 4, but MethodHandles.insertArguments can only add three arguments at the moment.) to the foo(), and then print the result out. Again "foo" is bound the first time it is called. When we create a CallSite, grab the current ThreadState and get our "foo" object from the current Jython frame. We then create a MethodType that corresponds to the way that we call Jython methods internally, and use methods off of MethodHandles (insertArguments and convertArguments) to coerce our call to the internal call semantics. Then our "foo" call is permanently bound to the function we found. Ultimately this is not what we will want since "foo" could be rebound in Jython in a number of ways. We'll get to this problem in a future post. To try this code out, we need a Jython program with a foo method:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def foo(x):&lt;br /&gt;print "hello %s!" % x&lt;br /&gt;foo("test")&lt;br /&gt;&lt;br /&gt;from org.python.compiler import IndyTest&lt;br /&gt;IndyTest.run()&lt;br /&gt;&lt;br /&gt;def foo(x):&lt;br /&gt;print "goodbye %s!" % x&lt;br /&gt;foo("test")&lt;br /&gt;&lt;br /&gt;IndyTest.run()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Run it like this (requires a Jython 2.5 install and we need to call Jython with --boot to put the Jython internals into the boot classpath):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jython --boot -J-XX:+EnableMethodHandles -J-XX:+EnableInvokeDynamic indy.py&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;hello test!&lt;br /&gt;foo = 1&lt;br /&gt;linkDynamic...&lt;br /&gt;hello 4!&lt;br /&gt;result = None&lt;br /&gt;goodbye test!&lt;br /&gt;foo = 2&lt;br /&gt;hello 4!&lt;br /&gt;result = None&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The first IndyTest.run() looks great (hello 4!) -- but the second call still emits "hello 4!" even though foo() has been redefined. We'll look at fixing this in the next post.&lt;br /&gt;&lt;br /&gt;By the way, to *really* learn about the guts of invokedynamic look to the posts from &lt;a rel="nofollow" target="_blank" href="http://blogs.sun.com/jrose/"&gt;John Rose&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://blogs.oracle.com/ohrstrom/"&gt;Fredrik Öhrström&lt;/a&gt; along with the &lt;a rel="nofollow" target="_blank" href="http://openjdk.java.net/projects/mlvm/"&gt;Da Vinci Machine site&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14276139-841874523317958837?l=fwierzbicki.blogspot.com'/&gt;&lt;/div&gt;</description>
         <author>Frank Wierzbicki</author>
         <guid isPermaLink="false">tag:blogger.com,1999:blog-14276139.post-841874523317958837</guid>
         <pubDate>Mon, 17 Aug 2009 04:26:00 -0700</pubDate>
      <feedburner:origLink>http://fwierzbicki.blogspot.com/2009/08/invokedynamic-and-jython-part-i.html</feedburner:origLink></item>
   </channel>
</rss><!-- fe1.pipes.re3.yahoo.com uncompressed/chunked Fri Nov 13 17:24:49 PST 2009 -->
