1 2 Previous Next 19 Replies Latest reply on Mar 30, 2007 10:08 AM by ilya_shaikovsky

    IceFaces VS RichFaces

    thomasdetoulon

      Hi,

      I tested RichFaces and IceFaces, solutions opensources for make RIA and I d like know if someone have already do this ?
      In my mind, IceFaces is better for partial rendering, but it uses 2 servlets for do this other hand RichFaces no.

      Please, could you add your arguments & experiences ?

        • 1. Re: IceFaces VS RichFaces
          amitev

          For now IceFaces works with jsf 1.1 only. RichFaces supports jsf 1.2

          • 2. Re: IceFaces VS RichFaces

            RichFaces support both - 1.1 and 1.2

            • 3. Re: IceFaces VS RichFaces
              demetrio812

              I have some experience in IceFaces, it's a good framework but it suffers of a ot of problem, here some post I made:

              http://www.icefaces.org/JForum/posts/list/3642.page

              http://www.icefaces.org/JForum/posts/list/3641.page

              http://www.icefaces.org/JForum/posts/list/1561.page

              http://www.icefaces.org/JForum/posts/list/3596.page

              For me it is a very good idea, but still not usable in production because of those problems.

              About RichFaces (and Ajax4Jsf) I am having some problem with rich:dataTable (so I'm using t:dataTable) but I'm working great with other components. It is also great the response of developers (thanks to all!) in those forums. Also the use of JSF 1.2 is good.

              So I picked JSF 1.2 + Tomahawk + Ajax4Jsf + RichFaces and sometime I use also Jenia4Faces (for example to user the calendar component, a must for next version of Rich Faces ;))

              Demetrio

              • 4. Re: IceFaces VS RichFaces
                thomasdetoulon

                Ok, thanks a lot for your answer. I ll see your links immediately ! I am wondering if its a good idea to mix Javascript framework such as Rico or Dojo or JQuery with ajax4jsf because RichFaces is not quite "Rich" !

                • 5. Re: IceFaces VS RichFaces
                  thomasdetoulon

                  But demetrio812, IceFaces is an AJAX framework, so, I am not expect that it works with Navigation-rules of JSF.

                  I think that its better to use this techno in a one page project (like a Multi Documents Interface) using AJAX panel such as TabPanel or StackPanel and in this case, in my mind of course, all is all right !

                  Dont you ???

                  • 6. Re: IceFaces VS RichFaces
                    demetrio812

                    IceFaces is a JSF RenderKit so I aspect it *must* works with JSF navigation rules...

                    Demetrio

                    • 7. Re: IceFaces VS RichFaces
                      thomasdetoulon

                      Yes you right, in addition to, IceFaces works with its servlet and page must have .iface extension, no provide a proper way for a framework !

                      • 8. Re: IceFaces VS RichFaces

                        We have used IceFaces for three months now, but not without headaches.... Actually we are in process of switching to ajax4jsf/richfaces + something more.
                        IceFaces has a lot of nice features, but to many bugs.

                        But if you wan't you can use icefaces and ajax4jsf in the same application. *.iface for icefaced pages, and *.jsf (or something else) for your normal pages:

                        - Replace icefaces.jar with just-ice.jar (found in /lib/ of icefaces)
                        - Edit faces-config.xml in both ajax4jsf.jar and just-ice.jar and remove the view-handlers.
                        - Use the following viewhandlers (in this exact order!) in your own faces-config.xml:

                        <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
                        <view-handler>org.ajax4jsf.framework.ajax.AjaxViewHandler</view-handler>
                        <view-handler>com.icesoft.faces.application.D2DViewHandlerDelegating</view-handler>
                         <view-handler>com.icesoft.faces.facelets.D2DFaceletViewHandler</view-handler>
                        

                        - Add this to you web.xml
                        <context-param>
                         <param-name>com.icesoft.faces.delegateNonIface</param-name>
                         <param-value>true</param-value>
                        </context-param>
                        


                        /carl

                        • 9. Re: IceFaces VS RichFaces
                          dustismo

                          I worked with icefaces on a project for a few months and was impressed with many of its features (though I think to much time was spent integrating the scriptaculous effects rather then fixing bugs) but I have moved over to ajax4jsf+richfaces.

                          My two problems with icefaces that eventually forced me to switch to aj4jsf were the massive amount of bugs and that there was very little opportunity to integrate javascript (I hate javascript, but it often necessary). Ajax4jsf has very nice javascript hooks, where icefaces has none.

                          my 2 cents,
                          -Dustin

                          • 10. Re: IceFaces VS RichFaces
                            thomasdetoulon

                            Ok !

                            For the moment, I use richfaces+ajax4jsf+script.aculo.us, its necessary to add JavaScript to provide a true Rich interface and none of JSF frameworks bring this.

                            Its true that ajax4jsf + javascript is easy to mix.

                            Another question, do you have a look on ADF from oracle ??

                            • 11. Re: IceFaces VS RichFaces
                              ilya_shaikovsky

                              ADF project now is Apache Trinidad. We did not check the compatibility with the old ADF, but on the newest Trinidad library you must not have any problems.

                              • 12. Re: IceFaces VS RichFaces
                                thomasdetoulon

                                So, to sum up we can say that ajax4jsf is the best solution (stability, integration ...) ??

                                To my part, I am very disappointed by AJAX support of ajax4jsf. It seems refresh just a part of page but if you have a look on server response of a ajax request, you ll see that the content is bigger than you expect (like AJAX.NET from Microsoft).

                                I used AJAX with PHP for a little company and partial rendering was faster, but code was ... beurk ! Mix DHTML, JavaScript & PHP ... But this solution is really more optimized than JSF + AJAX trust me !

                                I ll try to make my own AJAX support for JSF using a servelt or Phase Listener, I found an excellent topix on it :

                                http://www.jroller.com/page/cagataycivici?entry=jsf_with_ajax_phase_listener

                                • 13. Re: IceFaces VS RichFaces

                                  This is annotated illustration of typical response for Ajax request in Ajax4jsf environment.

                                  <?xml version="1.0"?>
                                   <html lang="en_US" xmlns="http://www.w3.org/1999/xhtml">
                                   <head>
                                   <title></title>
                                   <meta name="Ajax-Update-Ids" content="counter,form:repeat:0:item" />
                                   <meta id="Ajax-Response" name="Ajax-Response" content="true"/>
                                   <script type="text/javascript" src="/a4j-repeat-rerender/a4j.res/org.ajax4jsf.framework.ajax.AjaxScript.jsf">
                                   </script>
                                   </head>
                                   <body>
                                   <span id="counter" class="output">8</span>
                                   <span id="form:repeat:0:item" class="output">2</span>
                                   <span id="ajax-update-ids">
                                   <input type="hidden" name="jsf_sequence" value="1" />
                                   <input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="j_id5947:j_id5956" />
                                   </span>
                                   </body>
                                   </html>
                                  

                                  Green is actual html to update, red is overhead. I do not think this is too much.


                                  • 14. Re: IceFaces VS RichFaces

                                    For illustration this is full page from same example. You can see the difference:


                                    <html xmlns="http://www.w3.org/1999/xhtml"><head><style type="text/css">/*<![CDATA[*/
                                    body {
                                     font-family: Verdana, Arial, Helvetica, sans-serif;
                                     font-size: 12px;
                                    }
                                    .col1 {
                                     font-size: 10px;
                                     width: 120px;
                                     vertical-align: top;
                                    }
                                    .col2 {
                                     font-size: 12px;
                                     vertical-align: top;
                                    }
                                    .output {
                                     font-size: 12px;
                                    }
                                    .desc {
                                     font-size: 12px;
                                     padding: 10px
                                    }
                                    .codediv {
                                     border: 1px solid #800080;
                                     padding: 10px;
                                     background: #ffffcc;
                                    }
                                    
                                    code {
                                    color: rgb(0,0,0); font-family: monospace; font-size: 12px; white-space: nowrap;
                                    }
                                    .xml_tag_symbols {
                                    color: rgb(0,59,255);
                                    }
                                    .xml_rife_tag {
                                    color: rgb(0,0,0); background-color: rgb(228,230,160);
                                    }
                                    .xml_plain {
                                    color: rgb(0,0,0);
                                    }
                                    .xml_comment {
                                    color: rgb(147,147,147); background-color: rgb(247,247,247);
                                    }
                                    .xml_attribute_name {
                                    color: rgb(0,0,0); font-weight: bold;
                                    }
                                    h1 {
                                    font-family: sans-serif; font-size: 16pt; font-weight: bold; color: rgb(0,0,0); background: rgb(210,210,210); border: solid 1px black; padding: 5px; text-align: center;
                                    }
                                    .xml_tag_name {
                                    color: rgb(0,55,255);
                                    }
                                    .xml_char_data {
                                    color: rgb(0,0,0);
                                    }
                                    .xml_processing_instruction {
                                    color: rgb(0,0,0); font-weight: bold; font-style: italic;
                                    }
                                    .xml_attribute_value {
                                    color: rgb(193,0,0);
                                    }
                                    .xml_rife_name {
                                    color: rgb(0,0,196); background-color: rgb(228,230,160);
                                    }
                                    
                                    
                                    /*]]>*/
                                    </style><title/><script type="text/javascript" src="/a4j-repeat-rerender/a4j.res/org.ajax4jsf.framework.ajax.AjaxScript.jsf">
                                    </script></head><script>A4J.AJAX._scriptEvaluated=true;</script><body><script id="j_id2" type="text/javascript">//<![CDATA[
                                     LOG._onkeyUp = document.onkeyup;
                                     document.onkeyup = function(e) {
                                     if (window.event) e = window.event;
                                     if (String.fromCharCode(e.keyCode) == 'M' & e.shiftKey & e.ctrlKey){
                                     LOG.openWindow('','LogWindow','width=800,height=600,toolbar=yes,scrollbars=yes,location=no,statusbar=yes,menubar=yes,resizable=yes,left = 240,top = 212');
                                     } else {
                                     if(LOG._onkeyUp) LOG._onkeyUp(e);
                                     };
                                     };
                                     //]]>
                                    </script><table><tbody><tr><td class="col1"><table><tbody><tr><td><span class="output">Total clicks:</span> <span id="counter" class="output">0</span></td></tr><tr><td><form id="form" name="form" method="post" action="/a4j-repeat-rerender/pages/a4j-repeat-rerender.jsf;jsessionid=299201F065FC7C11CF4FFDC7D6E8AC7B" enctype="application/x-www-form-urlencoded"><input type="hidden" name="form" value="form"/> <input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="j_id5947:j_id5956"/> <table id="form:repeat"><tbody><tr><td><span id="form:repeat:0:item" class="output">0</span></td><td><a href="#" id="form:repeat:0:command_link_up" name="form:repeat:0:command_link_up" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:0:command_link_up':'form:repeat:0:command_link_up'}});return false;" class="output">Up</a></td><td><a href="#" id="form:repeat:0:command_link_down" name="form:repeat:0:command_link_down" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:0:command_link_down':'form:repeat:0:command_link_down'}});return false;" class="output">Down</a></td></tr><tr><td><span id="form:repeat:1:item" class="output">0</span></td><td><a href="#" id="form:repeat:1:command_link_up" name="form:repeat:1:command_link_up" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:1:command_link_up':'form:repeat:1:command_link_up'}});return false;" class="output">Up</a></td><td><a href="#" id="form:repeat:1:command_link_down" name="form:repeat:1:command_link_down" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:1:command_link_down':'form:repeat:1:command_link_down'}});return false;" class="output">Down</a></td></tr><tr><td><span id="form:repeat:2:item" class="output">0</span></td><td><a href="#" id="form:repeat:2:command_link_up" name="form:repeat:2:command_link_up" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:2:command_link_up':'form:repeat:2:command_link_up'}});return false;" class="output">Up</a></td><td><a href="#" id="form:repeat:2:command_link_down" name="form:repeat:2:command_link_down" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:2:command_link_down':'form:repeat:2:command_link_down'}});return false;" class="output">Down</a></td></tr><tr><td><span id="form:repeat:3:item" class="output">0</span></td><td><a href="#" id="form:repeat:3:command_link_up" name="form:repeat:3:command_link_up" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:3:command_link_up':'form:repeat:3:command_link_up'}});return false;" class="output">Up</a></td><td><a href="#" id="form:repeat:3:command_link_down" name="form:repeat:3:command_link_down" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:3:command_link_down':'form:repeat:3:command_link_down'}});return false;" class="output">Down</a></td></tr><tr><td><span id="form:repeat:4:item" class="output">0</span></td><td><a href="#" id="form:repeat:4:command_link_up" name="form:repeat:4:command_link_up" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:4:command_link_up':'form:repeat:4:command_link_up'}});return false;" class="output">Up</a></td><td><a href="#" id="form:repeat:4:command_link_down" name="form:repeat:4:command_link_down" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:4:command_link_down':'form:repeat:4:command_link_down'}});return false;" class="output">Down</a></td></tr><tr><td><span id="form:repeat:5:item" class="output">0</span></td><td><a href="#" id="form:repeat:5:command_link_up" name="form:repeat:5:command_link_up" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:5:command_link_up':'form:repeat:5:command_link_up'}});return false;" class="output">Up</a></td><td><a href="#" id="form:repeat:5:command_link_down" name="form:repeat:5:command_link_down" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:5:command_link_down':'form:repeat:5:command_link_down'}});return false;" class="output">Down</a></td></tr><tr><td><span id="form:repeat:6:item" class="output">0</span></td><td><a href="#" id="form:repeat:6:command_link_up" name="form:repeat:6:command_link_up" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:6:command_link_up':'form:repeat:6:command_link_up'}});return false;" class="output">Up</a></td><td><a href="#" id="form:repeat:6:command_link_down" name="form:repeat:6:command_link_down" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:6:command_link_down':'form:repeat:6:command_link_down'}});return false;" class="output">Down</a></td></tr><tr><td><span id="form:repeat:7:item" class="output">0</span></td><td><a href="#" id="form:repeat:7:command_link_up" name="form:repeat:7:command_link_up" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:7:command_link_up':'form:repeat:7:command_link_up'}});return false;" class="output">Up</a></td><td><a href="#" id="form:repeat:7:command_link_down" name="form:repeat:7:command_link_down" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:7:command_link_down':'form:repeat:7:command_link_down'}});return false;" class="output">Down</a></td></tr><tr><td><span id="form:repeat:8:item" class="output">0</span></td><td><a href="#" id="form:repeat:8:command_link_up" name="form:repeat:8:command_link_up" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:8:command_link_up':'form:repeat:8:command_link_up'}});return false;" class="output">Up</a></td><td><a href="#" id="form:repeat:8:command_link_down" name="form:repeat:8:command_link_down" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:8:command_link_down':'form:repeat:8:command_link_down'}});return false;" class="output">Down</a></td></tr><tr><td><span id="form:repeat:9:item" class="output">0</span></td><td><a href="#" id="form:repeat:9:command_link_up" name="form:repeat:9:command_link_up" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:9:command_link_up':'form:repeat:9:command_link_up'}});return false;" class="output">Up</a></td><td><a href="#" id="form:repeat:9:command_link_down" name="form:repeat:9:command_link_down" onclick="A4J.AJAX.Submit('_viewRoot','form',event,{'parameters':{'form:repeat:9:command_link_down':'form:repeat:9:command_link_down'}});return false;" class="output">Down</a></td></tr></tbody></table></form></td></tr></tbody></table></td><td class="col2"><div class="desc">This example show use of <b><a4j:ajaxListener type="org.ajax4jsf.ajax.ForceRender"/></b> for partial update of elements inside of collection.</div><div class="desc">The problem resides in the nature of "collection" components, like <i><h:dataTable></i> or <i><ui:repeat></i>. Such componets dynamicly create id's for there children components during rendering phase. So given client id's normally does not exists yet, when Ajax4jsf runtime try to put it into re-rendering queue. However, special trick may be used to push rendering to earlier moment during lifecycle - use of <b><a4j:ajaxListener type="org.ajax4jsf.ajax.ForceRender"></b>That imply one major limitation - you cannot use anymore plain HTML even if you use Facelets, everything that is inside re-rendered area must be "regular"JSF component.</div><div class="desc">This example uses <i><h:dataTable ... ></i> implementation to create small collecton of counters. Use "Up" and "Down" command links to change counter values. Note, that <b>all counters are updated by any click, but only selected row will be re-rendered</b>. Try hit "reload" button on browser to see updated values of all counters. At the same time global counter of requests also updated by both links. As general rule you can re-render elements on same or higher levels of hierarchy.</div></td></tr></tbody></table><div class="desc">Here is a fragment of page source for given example. I just replaced '#' with '+' to "cool down" EL engine. Don't forget to replace it back if you copy/paste this code!</div><div class="codediv"><code><span class="xml_tag_symbols"><</span><span class="xml_tag_name">h:panelGrid</span><span class="xml_plain"> </span><span class="xml_attribute_name">columns</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"1"</span><span class="xml_tag_symbols">></span><span class="xml_plain"/><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"><</span><span class="xml_tag_name">h:outputText</span><span class="xml_plain"> </span><span class="xml_attribute_name">id</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"counter"</span><span class="xml_plain"> </span><span class="xml_attribute_name">value</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"+{bean.requestCounter}"</span><span class="xml_plain"> </span><span class="xml_tag_symbols">/></span><span class="xml_plain"/><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"><</span><span class="xml_tag_name">h:form</span><span class="xml_plain"> </span><span class="xml_attribute_name">id</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"form"</span><span class="xml_tag_symbols">></span><span class="xml_plain"/><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"><</span><span class="xml_tag_name">h:dataTable</span><span class="xml_plain"> </span><span class="xml_attribute_name">id</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"repeat"</span><span class="xml_plain"> </span><span class="xml_attribute_name">value</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"+{bean.collection}"</span><span class="xml_plain"> </span><span class="xml_attribute_name">var</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"item"</span><span class="xml_plain"> </span><span class="xml_tag_symbols">></span><span class="xml_plain"/><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"><</span><span class="xml_tag_name">h:column</span><span class="xml_tag_symbols">></span><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"><</span><span class="xml_tag_name">h:outputText</span><span class="xml_plain"> </span><span class="xml_attribute_name">id</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"item"</span><span class="xml_plain"> </span><span class="xml_attribute_name">value</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"+{item}"</span><span class="xml_plain"> </span><span class="xml_tag_symbols">/></span><span class="xml_plain"/><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"><</span><span class="xml_tag_name">/h:column</span><span class="xml_tag_symbols">></span><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"><</span><span class="xml_tag_name">h:column</span><span class="xml_tag_symbols">></span><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"><</span><span class="xml_tag_name">a4j:commandLink</span><span class="xml_plain"> </span><span class="xml_attribute_name">id</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"command_link_up"</span><span class="xml_plain"> </span><span class="xml_attribute_name">value</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"Up"</span><span class="xml_plain"> </span><span class="xml_attribute_name">reRender</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"item, counter"</span><span class="xml_plain"> </span><span class="xml_attribute_name">action</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"+{bean.up}"</span><span class="xml_tag_symbols">></span><span class="xml_plain"/><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"><</span><span class="xml_tag_name">a4j:ajaxListener</span><span class="xml_plain"> </span><span class="xml_attribute_name">type</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"org.ajax4jsf.ajax.ForceRender"</span><span class="xml_plain"> </span><span class="xml_tag_symbols">/></span><span class="xml_plain"> </span><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"></</span><span class="xml_tag_name">a4j:commandLink</span><span class="xml_tag_symbols">></span><span class="xml_plain"/><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"><</span><span class="xml_tag_name">/h:column</span><span class="xml_tag_symbols">></span><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"><</span><span class="xml_tag_name">h:column</span><span class="xml_tag_symbols">></span><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"><</span><span class="xml_tag_name">a4j:commandLink</span><span class="xml_plain"> </span><span class="xml_attribute_name">id</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"command_link_down"</span><span class="xml_plain"> </span><span class="xml_attribute_name">value</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"Down"</span><span class="xml_plain"> </span><span class="xml_attribute_name">reRender</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"item, counter"</span><span class="xml_plain"> </span><span class="xml_attribute_name">action</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"+{bean.down}"</span><span class="xml_tag_symbols">></span><span class="xml_plain"/><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"><</span><span class="xml_tag_name">a4j:ajaxListener</span><span class="xml_plain"> </span><span class="xml_attribute_name">type</span><span class="xml_tag_symbols">=</span><span class="xml_attribute_value">"org.ajax4jsf.ajax.ForceRender"</span><span class="xml_plain"> </span><span class="xml_tag_symbols">/></span><span class="xml_plain"> </span><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"></</span><span class="xml_tag_name">a4j:commandLink</span><span class="xml_tag_symbols">></span><span class="xml_plain"/><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"><</span><span class="xml_tag_name">/h:column</span><span class="xml_tag_symbols">></span><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"></</span><span class="xml_tag_name">h:dataTable</span><span class="xml_tag_symbols">></span><span class="xml_plain"/><br/><span class="xml_plain"> </span><span class="xml_tag_symbols"></</span><span class="xml_tag_name">h:form</span><span class="xml_tag_symbols">></span><span class="xml_plain"/><br/><span class="xml_tag_symbols"></</span><span class="xml_tag_name">h:panelGrid</span><span class="xml_tag_symbols">></span><span class="xml_plain"/><br/></code></div></body></html>
                                    


                                    1 2 Previous Next