java.lang.IllegalStateException: duplicate Id for a component Services
at org.ajax4jsf.application.TreeStructureNode.apply(TreeStructureNode.java:68)
at org.ajax4jsf.application.TreeStructureNode.apply(TreeStructureNode.java:92)
at org.ajax4jsf.application.TreeStructureNode.apply(TreeStructureNode.java:92)
at org.ajax4jsf.application.TreeStructureNode.apply(TreeStructureNode.java:92)
at org.ajax4jsf.application.TreeStructureNode.apply(TreeStructureNode.java:92)
at org.ajax4jsf.application.TreeStructureNode.apply(TreeStructureNode.java:92)
at org.ajax4jsf.application.AjaxStateManager.getTreeStructureToSave(AjaxStateManager.java:189)
at org.ajax4jsf.application.AjaxStateManager.buildViewState(AjaxStateManager.java:514)
at org.ajax4jsf.application.AjaxStateManager$SeamStateManagerWrapper.saveView(AjaxStateManager.java:106)
at org.jboss.seam.jsf.SeamStateManager.saveView(SeamStateManager.java:89)
at org.ajax4jsf.application.AjaxStateManager.saveSerializedView(AjaxStateManager.java:470)
at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:615)
at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:309)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:324)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242)
at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:381)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:274)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)
at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:274)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:181)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.event(CatalinaContext.java:285)
at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.invoke(CatalinaContext.java:261)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:88)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:100)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:567)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:53)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951)
at java.lang.Thread.run(Thread.java:679)
- <AjaxViewRoot id="_viewRoot" immediate="false" inView="true" locale="en" renderKitId="HTML_BASIC" renderRegionOnly="false" rendered="true" selfRendered="false" submitted="false" transient="false" viewId="/richfaces-jboss-inplace-input/inplace-input-textarea.xhtml">
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
- <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Chiral Software, Inc. GSA IT70 Java, Android, security
software developers in Los Angeles</title>
<link rel="shortcut icon" href="#{request.contextPath}/favicon.ico"/>
- <HtmlLoadStyle id="j_id4" inView="true" rendered="true" src="/stylesheet/theme.xcss" transient="false"/>
- <HtmlLoadStyle id="j_id5" inView="true" rendered="true" src="/stylesheet/theme.css" transient="false"/>
- <HtmlLoadStyle id="j_id6" inView="true" rendered="true" src="/stylesheet/theme.css" transient="false"/>
- <HtmlLoadStyle id="j_id7" inView="true" rendered="true" src="/stylesheet/universal.css" transient="false"/>
- <HtmlLoadStyle id="j_id8" inView="true" rendered="true" src="/stylesheet/richstyles.css" transient="false"/>
- </head>
<body>
<div class="nav-div">
- <HtmlToolBar id="j_id10" inView="true" itemSeparator="none" rendered="true" style="vertical-align:middle;" transient="false" width="100%">
- <HtmlLink action=" disabled="false" id="j_id11" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" style="color:black;font-size:4.2mm;" styleClass="menu-link" transient="false" value="Chiral Software, Inc." view="/index.xhtml"/>
- <HtmlOutputText escape="true" id="j_id12" inView="true" rendered="true" transient="false" value=" "/>
- <HtmlOutputText escape="true" id="j_id13" inView="true" rendered="true" style="color:black;font-size:4mm;white-space:nowrap;" transient="false" value="310-356-7869"/>
- <HtmlToolBarGroup id="j_id14" inView="true" itemSeparator="none" location="right" rendered="true" style="white-space:no-wrap;" transient="false">
- <form xmlns="http://www.w3.org/1999/xhtml" style="white-space:nowrap;" action="/search-results.seam" method="get">
<input disabled="disabled" type="text" name="queryString" style="margin:0px;background-color:#fff06c" value="#{searchAction.queryString}"/>
<input disabled="disabled" type="submit" style="font-size:2.7mm;margin:0px;" value="Search"/>
</form>
- </HtmlToolBarGroup>
- </HtmlToolBar>
- <HtmlToolBar id="j_id16" inView="true" itemSeparator="none" rendered="true" styleClass="navbar" transient="false" width="100%">
- <HtmlToolBarGroup id="j_id17" inView="true" itemSeparator="none" location="left" rendered="true" transient="false">
- <HtmlDropDownMenu direction="auto" disabled="false" disabledItemClass="" disabledItemStyle="" disabledLabelClass="" hideDelay="0" horizontalOffset="0" id="j_id18" inView="true" itemClass="" itemStyle="" jointPoint="auto" labelClass="" oncollapse="" onexpand="" ongroupactivate="" onitemselect="" onmousemove="" onmouseout="" onmouseover="" rendered="true" selectItemClass="" selectedLabelClass="" showDelay="250" submitMode="none" transient="false" verticalOffset="0">
- label
- Services
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id20" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="Services" immediate="false" inView="true" includePageParams="false" propagation="none" rendered="true" transient="false" value="Service description" view="/services.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id21" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="Services" immediate="false" inView="true" includePageParams="false" propagation="none" rendered="true" transient="false" value="GSA Services" view="/gsa-it70-price-list.xhtml"/>
- </HtmlMenuItem>
- </HtmlDropDownMenu>
- <HtmlDiv id="j_id22" inView="true" rendered="true" style="padding:0px 5px 2px 5px;" transient="false">
- <HtmlLink action=" disabled="false" id="j_id23" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" styleClass="menu-link" transient="false" value="Company" view="/company.xhtml"/>
- </HtmlDiv>
- <HtmlDiv id="j_id24" inView="true" rendered="true" style="padding:0px 5px 2px 5px;" transient="false">
- <HtmlLink action=" disabled="false" id="j_id25" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" styleClass="menu-link" transient="false" value="Downloads" view="/downloads.xhtml"/>
- </HtmlDiv>
- <HtmlDropDownMenu direction="auto" disabled="false" disabledItemClass="" disabledItemStyle="" disabledLabelClass="" hideDelay="800" horizontalOffset="0" id="j_id26" inView="true" itemClass="" itemStyle="" jointPoint="auto" labelClass="" oncollapse="" onexpand="" ongroupactivate="" onitemselect="" onmousemove="" onmouseout="" onmouseover="" rendered="true" selectItemClass="" selectedLabelClass="" showDelay="50" submitMode="none" transient="false" value="Articles" verticalOffset="0">
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id27" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id28" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Programming for Google Android" view="/google-android-introduction/android.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuGroup disabled="false" event="onmouseover" id="j_id29" inView="true" rendered="true" showDelay="300" transient="false" value="VoIP with Asterisk">
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id30" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id31" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Configuring Asterisk VoIP PBX over OpenVPN, Part 1: the basics" view="/asterisk-article/voip-sip-asterisk-configuration-part-1.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id32" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id33" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Configuring Asterisk VoIP PBX over OpenVPN, Part 2: extensions" view="/asterisk-article/voip-sip-asterisk-configuration-part-2.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id34" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id35" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Configuring Asterisk VoIP PBX over OpenVPN, Part 3: client configuration checklist" view="/asterisk-article/openvpn-client-setup.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id36" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id37" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Configuring Asterisk VoIP PBX over OpenVPN, Part 4: Linux Softphone reviews" view="/asterisk-article/linux-softphone-comparison.xhtml"/>
- </HtmlMenuItem>
- </HtmlMenuGroup>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id38" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id39" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="JBoss Seam and Googlebot" view="/launching-a-jboss-seam-site/jboss-seam-problems.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id40" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id41" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="RichFaces 3.2: Inplace input and select" view="/richfaces-jboss-inplace-input/inplace-input-textarea.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id42" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id43" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Hibernate Full Text Search within JBoss Seam" view="/hibernate-full-text-search-with-seam/jboss-search.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id44" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id45" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Expert systems for access control: Seam security with JBoss Rules" view="/seam-security-rules/jboss-rules.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuGroup disabled="false" event="onmouseover" id="j_id46" inView="true" rendered="true" showDelay="300" transient="false" value="Linux and JBoss">
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id47" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id48" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Using iptables to run JBoss as non-root" view="/linux-system-administration/ubuntu-firewall-iptables.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id49" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id50" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Deploying JBoss Aplication Server on Ubuntu" view="/linux-system-administration/jboss-server-deployment.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id51" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id52" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Using VirtualBox to test server configurations" view="/linux-system-administration/virtualbox-server-testing.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id53" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id54" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Configuring Postfix, SpamAssassin, Amavisd-new, and Razor in Ubuntu" view="/linux-system-administration/ubuntu-postfix-imap-dovecot-setup.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id55" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id56" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Secure mail relaying with Postfix and Dovecot SASL" view="/linux-system-administration/secure-relaying-postfix-sasl-tls-dovecot.xhtml"/>
- </HtmlMenuItem>
- </HtmlMenuGroup>
- </HtmlDropDownMenu>
- <HtmlDropDownMenu direction="auto" disabled="false" disabledItemClass="" disabledItemStyle="" disabledLabelClass="" hideDelay="800" horizontalOffset="0" id="j_id57" inView="true" itemClass="" itemStyle="" jointPoint="auto" labelClass="" oncollapse="" onexpand="" ongroupactivate="" onitemselect="" onmousemove="" onmouseout="" onmouseover="" rendered="true" selectItemClass="" selectedLabelClass="" showDelay="50" submitMode="none" transient="false" value="Blog" verticalOffset="0">
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id58" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="false" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id59" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Create blog entry" view="/blog-entry-edit.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id60" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id61" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="UnsupportedOperationException: setProperty must be overridden by all subclasses of SOAPMessage" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id62" inView="true" name="str" rendered="true" transient="false" value="UnsupportedOperationException-setProperty-must-be-overridden-by-2d62921791a5df00"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id63" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id64" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="InstantiationException: Could not instantiate Seam component" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id65" inView="true" name="str" rendered="true" transient="false" value="InstantiationException-Could-not-instantiate-Seam-component-f621c0533182585e"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id66" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id67" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Google Android first look" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id68" inView="true" name="str" rendered="true" transient="false" value="Google-Android-first-look-46567a48554f5318"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id69" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id70" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="DTD declarations in XML files are evil" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id71" inView="true" name="str" rendered="true" transient="false" value="DTD-declarations-in-XML-files-are-d69ec4c5afaa0922"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id72" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id73" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="What I'd like to see in Java Persistence" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id74" inView="true" name="str" rendered="true" transient="false" value="What-I-d-like-to-see-65eff5e570e51650"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id75" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id76" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Annotations, inheritance, EJBs and JBoss Seam" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id77" inView="true" name="str" rendered="true" transient="false" value="Annotations-inheritance-EJBs-and-JBoss-Seam-aeb5d89dd0fdbe82"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id78" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id79" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Finding the right JAR" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id80" inView="true" name="str" rendered="true" transient="false" value="Finding-the-right-JAR-b29918d6a5eaaf8f"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id81" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id82" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="No route to host while parsing XML?" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id83" inView="true" name="str" rendered="true" transient="false" value="No-route-to-host-while-parsing-b6b5f0cbb79e5cd8"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id84" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id85" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="JFreeCharts in PDF with JSF and Seam" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id86" inView="true" name="str" rendered="true" transient="false" value="JFreeCharts-in-PDF-with-JSF-and-c47ae72d938fe060"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id87" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id88" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="JBoss Seam iText PDF custom JSF tags" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id89" inView="true" name="str" rendered="true" transient="false" value="JBoss-Seam-iText-PDF-custom-JSF-4642a90cb4d7412d"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id90" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id91" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Securing Dovecot IMAP, VSFTPD with TLS" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id92" inView="true" name="str" rendered="true" transient="false" value="Securing-Dovecot-IMAP-VSFTPD-with-TLS-40e2c75c8a19e636"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id93" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id94" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Secure relaying with Postfix TLS" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id95" inView="true" name="str" rendered="true" transient="false" value="Secure-relaying-with-Postfix-TLS-a03e00a8fb8ac1d0"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id96" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id97" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="IllegalArgumentException: no such setter method: conversationIsLongRunningParameter" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id98" inView="true" name="str" rendered="true" transient="false" value="IllegalArgumentException-no-such-setter-method-conversationIsLongRunningParameter-f391bab57e867183"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id99" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id100" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="NetBeans 6 is cool" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id101" inView="true" name="str" rendered="true" transient="false" value="NetBeans-6-is-cool-4318914ee235035f"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id102" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id103" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Virtual hosts in JBoss" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id104" inView="true" name="str" rendered="true" transient="false" value="Virtual-hosts-in-JBoss-a8d9cad39474c390"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id105" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id106" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Bean binding Swing example" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id107" inView="true" name="str" rendered="true" transient="false" value="Bean-binding-Swing-example-597a56fe458d8892"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id108" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id109" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="JBoss Incomplete Deployment listing" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id110" inView="true" name="str" rendered="true" transient="false" value="JBoss-Incomplete-Deployment-listing-8022714d44d21700"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id111" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id112" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="SpamAssassin: it works" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id113" inView="true" name="str" rendered="true" transient="false" value="SpamAssassin-it-works-e76a18d20a4c85ef"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id114" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id115" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="ERROR: syntax error at or near TXID" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id116" inView="true" name="str" rendered="true" transient="false" value="ERROR-syntax-error-at-or-near-7f4b4f1201c176bb"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id117" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id118" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="XML Parsing Error: mismatched tag. Expected: tbody" view="/old-blog-entry.xhtml">
- <UIParameter disable="false" id="j_id119" inView="true" name="str" rendered="true" transient="false" value="XML-Parsing-Error-mismatched-tag-Expected-a19c52f150df9094"/>
- </HtmlLink>
- </HtmlMenuItem>
- <HtmlMenuSeparator id="j_id120" inView="true" rendered="true" transient="false"/>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id121" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id122" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="More..." view="/old-blog.xhtml"/>
- </HtmlMenuItem>
- </HtmlDropDownMenu>
- <HtmlDropDownMenu direction="auto" disabled="false" disabledItemClass="" disabledItemStyle="" disabledLabelClass="" hideDelay="800" horizontalOffset="0" id="j_id123" inView="true" itemClass="" itemStyle="" jointPoint="auto" labelClass="" oncollapse="" onexpand="" ongroupactivate="" onitemselect="" onmousemove="" onmouseout="" onmouseover="" rendered="true" selectItemClass="" selectedLabelClass="" showDelay="50" submitMode="none" transient="false" value="Seminars" verticalOffset="0">
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id124" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id125" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Crash Course Seminar Series" view="/seminars/seminars.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id126" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id127" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Programming for Google Android" view="/seminars/android.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id128" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id129" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Web application security with JBoss Seam Security and JBoss Rules" view="/seminars/jboss-seam-security-rules.xhtml"/>
- </HtmlMenuItem>
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id130" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id131" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Enterprise Web Application with JBoss Seam" view="/seminars/jboss-seam.xhtml"/>
- </HtmlMenuItem>
- </HtmlDropDownMenu>
- <HtmlDropDownMenu direction="auto" disabled="false" disabledItemClass="" disabledItemStyle="" disabledLabelClass="" hideDelay="800" horizontalOffset="0" id="j_id132" inView="true" itemClass="" itemStyle="" jointPoint="auto" labelClass="" oncollapse="" onexpand="" ongroupactivate="" onitemselect="" onmousemove="" onmouseout="" onmouseover="" rendered="true" selectItemClass="" selectedLabelClass="" showDelay="50" submitMode="none" transient="false" value="Contact" verticalOffset="0">
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id133" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id134" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Contact information" view="/contact.xhtml"/>
- </HtmlMenuItem>
- </HtmlDropDownMenu>
- <HtmlDropDownMenu direction="auto" disabled="false" disabledItemClass="" disabledItemStyle="" disabledLabelClass="" hideDelay="800" horizontalOffset="0" id="j_id135" inView="true" itemClass="" itemStyle="" jointPoint="auto" labelClass="" oncollapse="" onexpand="" ongroupactivate="" onitemselect="" onmousemove="" onmouseout="" onmouseover="" rendered="true" selectItemClass="" selectedLabelClass="" showDelay="50" submitMode="none" transient="false" value="Android store" verticalOffset="0">
- <HtmlMenuItem ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id136" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" target="" timeout="-2147483648" transient="false">
- <HtmlLink action=" disabled="false" id="j_id137" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="Android BIP-6000 rugged handset" view="/android-store/buy-htc-hero.xhtml"/>
- </HtmlMenuItem>
- </HtmlDropDownMenu>
- </HtmlToolBarGroup>
- <HtmlToolBarGroup id="j_id138" inView="true" itemSeparator="none" location="right" rendered="true" transient="false">
- <HtmlOutputText escape="true" id="menuWelcomeId" inView="true" rendered="false" transient="false" value="signed in as: "/>
- <HtmlLink action=" disabled="false" id="menuLoginId" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="false" transient="false" value="Login" view="/login.xhtml"/>
- <HtmlLink action="#{identity.logout}" actionExpression="#{identity.logout}" disabled="false" id="menuLogoutId" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="false" transient="false" value="Logout" view="/home.xhtml"/>
- </HtmlToolBarGroup>
- </HtmlToolBar>
- </div>
- <div class="content">
- <HtmlRichMessages ajaxRendered="true" errorClass="errormsg" globalOnly="true" id="messages" inView="true" infoClass="infomsg" keepTransient="false" layout="list" redisplay="true" rendered="true" showDetail="false" showSummary="true" styleClass="message" tooltip="false" transient="false" warnClass="warnmsg"/>
- <style>
.inplace{
border: none;
}
.hover {
color: #{a4jSkin.generalTextColor};
background-color :#{a4jSkin.tipBorderColor};
}
</style>
<h1>Great new features in RichFaces 3.2: Inplace input and select</h1>
<p style="font-style:italic;">July 12th, 2008</p>
<h2>Introduction</h2>
<p>If you're using JBoss Seam to build sites, you're probably
using the RichFaces components which are automatically
included in Seam-Gen projects. RichFaces provides good-looking
components which satisfy most of the Web 2.0 and AJAX needs
of developers. RichFaces is great because it lets
developers create complex AJAX interactions with tags
which are as simple as plain old HTML tags. You
want to create a toggle panel, for example?
Put this in:</p>
<pre><rich:simpleTogglePanel switchType="client"
label="A RichFaces simpleTogglePanel">
This is a simple Web 2.0 type effect created using
RichFaces. As you can see, this component is just
as easy to create as any ordinary HTML.
</rich:simpleTogglePanel>
</pre>
<p>and the result is:</p>
- <HtmlSimpleTogglePanel ajaxSingle="false" bypassUpdates="false" id="j_id142" ignoreDupResponses="false" immediate="false" inView="true" iterationState="[Ljava.lang.Object;@6219de46" label="A RichFaces simpleTogglePanel" limitToList="false" oncollapse="" onexpand="" opened="true" rendered="true" requestDelay="-2147483648" switchType="client" timeout="-2147483648" transient="false" width="">
- This is a simple Web 2.0 type effect created using
RichFaces. As you can see, this component is just
as easy to create as any ordinary HTML.
- </HtmlSimpleTogglePanel>
- <p>RichFaces 3.2 added two particularlly great
new input components: rich:inplaceInput
and rich:inplaceSelect. We'll show how to use
these great inputs, and we'll
also create a new textarea input that uses
the same input style.</p>
<h2>rich:inplaceInput
and rich:inplaceSelect</h2>
<p>The documentation gives all the details
on these components. I'll just show my
favorite style of using them. Try it out,
by double-clicking:</p>
- <HtmlForm enctype="application/x-www-form-urlencoded" id="j_id145" inView="true" prependId="true" rendered="true" submitted="false" transient="false">
- <HtmlPanel id="inplace-demo-panel" inView="true" rendered="true" style="width:6cm;" transient="false">
- <HtmlInplaceInput changedClass="inplace" changedHoverClass="hover" controlsHorizontalPosition="right" controlsVerticalPosition="center" defaultLabel="" editEvent="ondblclick" id="testInput" immediate="false" inView="true" layout="block" localValueSet="false" maxInputWidth="500px" maxlength="-2147483648" minInputWidth="40px" onviewactivated="A4J.AJAX.Submit('j_id145',event,{'similarityGroupingId':'j_id145:j_id146','parameters':{'j_id145:j_id146':'j_id145:j_id146'} ,'actionUrl':'/richfaces\x2Djboss\x2Dinplace\x2Dinput/inplace\x2Dinput\x2Dtextarea.seam;jsessionid=D0ED2F48384016C2B4F27107C673791B'} )" rendered="true" required="true" selectOnEdit="true" showControls="true" tabindex="-2147483648" transient="false" valid="true" viewClass="inplace" viewHoverClass="hover">
- org.ajax4jsf.ajax.SUPPORTonviewactivated
- <HtmlAjaxSupport ajaxSingle="false" bypassUpdates="false" disableDefault="false" disabled="false" event="onviewactivated" id="j_id146" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" timeout="-2147483648" transient="false"/>
- </HtmlInplaceInput>
- <HtmlMessage for="testInput" id="j_id147" inView="true" redisplay="true" rendered="true" showDetail="true" showSummary="false" style="color: red;" tooltip="false" transient="false"/>
- </HtmlPanel>
- </HtmlForm>
- <p>Use the small controls that pop up to the right
to set the value, or to cancel the change.
Try setting it to a blank value to see a validation
error.</p>
<p>We use an A4J support component to AJAX-submit:</p>
<pre>
<h:form>
<rich:panel style="width:6cm;"
id="inplace-demo-panel">
<rich:inplaceInput id="testInput" layout="block"
value="#{inplaceDemos.value}"
required="true"
showControls="true"
changedHoverClass="hover"
viewHoverClass="hover"
viewClass="inplace"
changedClass="inplace"
selectOnEdit="true"
editEvent="ondblclick">
<a:support
event="onviewactivated"
reRender="inplace-demo-panel"/>
</rich:inplaceInput>
<h:message style="color: red;"
for="testInput" />
</rich:panel>
</h:form>
</pre>
<p>This is a great component of a form. You can display
the values in a panel layout, and if the user
wants to change a value, he double-clicks on it,
enters it, and hits the submit control. It keeps your display
looking like a display of information, not like a web form,
and it provides a good way for a user to selectively
edit one field at a time.</p>
<p>There's a select-one counterpart to the
rich:inplaceInput field. Try this:</p>
- <HtmlForm enctype="application/x-www-form-urlencoded" id="j_id149" inView="true" prependId="true" rendered="true" submitted="false" transient="false">
- <HtmlPanel id="selectPanel" inView="true" rendered="true" style="width:5cm;" transient="false">
- <HtmlInplaceSelect changedClass="inplace" controlsHorizontalPosition="right" controlsVerticalPosition="center" defaultLabel="Please select" editEvent="ondblclick" editOnTab="true" id="j_id150" immediate="false" inView="true" layout="block" listHeight="200px" listWidth="200px" localValueSet="false" maxSelectWidth="200px" minSelectWidth="100px" onviewactivated="A4J.AJAX.Submit('j_id149',event,{'similarityGroupingId':'j_id149:j_id155','parameters':{'j_id149:j_id155':'j_id149:j_id155'} ,'actionUrl':'/richfaces\x2Djboss\x2Dinplace\x2Dinput/inplace\x2Dinput\x2Dtextarea.seam;jsessionid=D0ED2F48384016C2B4F27107C673791B'} )" openOnEdit="true" rendered="true" required="false" selectOnEdit="true" selectWidth="" showControls="true" showValueInView="false" tabindex="-2147483648" transient="false" valid="true" viewClass="inplace" viewHoverClass="hover">
- org.ajax4jsf.ajax.SUPPORTonviewactivated
- <HtmlAjaxSupport ajaxSingle="false" bypassUpdates="false" disableDefault="false" disabled="false" event="onviewactivated" id="j_id155" ignoreDupResponses="false" immediate="false" inView="true" limitToList="false" rendered="true" requestDelay="-2147483648" timeout="-2147483648" transient="false"/>
- <UISelectItem id="j_id151" inView="true" itemDisabled="false" itemEscaped="true" itemLabel="Spicy" itemValue="1" noSelectionOption="false" rendered="true" transient="false"/>
- <UISelectItem id="j_id152" inView="true" itemDisabled="false" itemEscaped="true" itemLabel="Medium" itemValue="2" noSelectionOption="false" rendered="true" transient="false"/>
- <UISelectItem id="j_id153" inView="true" itemDisabled="false" itemEscaped="true" itemLabel="Mild" itemValue="3" noSelectionOption="false" rendered="true" transient="false"/>
- <UISelectItem id="j_id154" inView="true" itemDisabled="false" itemEscaped="true" itemLabel="None" itemValue="4" noSelectionOption="false" rendered="true" transient="false"/>
- </HtmlInplaceSelect>
- </HtmlPanel>
- </HtmlForm>
- <p>The source is similar to the text input:</p>
<pre>
<h:form>
<rich:panel id="selectPanel" style="width:5cm;">
<rich:inplaceSelect value="#{inplaceDemos.selectValue}"
openOnEdit="true"
showControls="true"
editEvent="ondblclick"
layout="block"
viewClass="inplace"
changedClass="inplace"
changedHoverClass="hover"
defaultLabel="Please select"
viewHoverClass="hover">
<f:selectItem itemValue="1" itemLabel="Spicy"/>
<f:selectItem itemValue="2" itemLabel="Medium"/>
<f:selectItem itemValue="3" itemLabel="Mild"/>
<f:selectItem itemValue="4" itemLabel="None"/>
<a:support
event="onviewactivated"
reRender="selectPanel"/>
</rich:inplaceSelect>
</rich:panel>
</h:form>
</pre>
<h2>What about text areas?</h2>
<p>These are great, but what about text areas? Unfortunately,
there is no textarea input component.</p>
<p>What we want is a text area that allows this in-place style
of editting. It should also accept Seam text,
and show Seam text validation messages. Fortunately,
with a little bit of JavaScript, we can build this.</p>
<p>First, here's what it looks like in action. Go
ahead and double-click to edit. Make some changes.
Use some <a target="_blank" href="http://docs.jboss.com/seam/latest/reference/en-US/html/text.html">Seam text</a>.
Make a Seam text error and click the "submit"
control to see the validation error. An easy error is
to leave an unclosed format directive, such as
a single =.
</p>
- <div xmlns="http://www.w3.org/1999/xhtml">
<script>
function showEdit() {
document.getElementById("editDiv").style.display="block";
document.getElementById("displayDiv").style.display="none";
}
function hideEditIfValid() {
// check to see if the error div is
// empty or not
if(document.getElementById("textError").hasChildNodes()) {
// FAIL
document.getElementById("displayDiv").style.display="none";
return;
}
document.getElementById("displayDiv").style.display="block";
document.getElementById("editDiv").style.display="none";
}
function cancelEdit() {
document.getElementById("editForm:editArea").value =
document.getElementById("savedText").value;
document.getElementById("displayDiv").style.display="block";
document.getElementById("editDiv").style.display="none";
var errorNode = document.getElementById("textError");
if(errorNode.hasChildNodes())
while (errorNode.childNodes.length >= 1)
errorNode.removeChild(errorNode.firstChild);
return false;
}
</script>
<style>.error { color: red; }</style>
- <HtmlPanel id="displayDiv" inView="true" ondblclick="showEdit();" rendered="true" transient="false">
- <HtmlFormattedText id="j_id158" inView="true" rendered="true" transient="false"/>
- </HtmlPanel>
- <HtmlPanel id="editDiv" inView="true" rendered="true" style="display:none;" transient="false">
- <HtmlForm enctype="application/x-www-form-urlencoded" id="editForm" inView="true" prependId="true" rendered="true" submitted="false" transient="false">
- <HtmlInputTextarea cols="-2147483648" disabled="false" id="editArea" immediate="false" inView="true" localValueSet="false" readonly="false" rendered="true" required="false" rows="-2147483648" style="width:100%;" transient="false" valid="true"/>
- <div style="text-align:right;margin-top:-0.5cm;">
- <HtmlAjaxCommandButton ajaxSingle="false" bypassUpdates="false" disabled="false" id="j_id160" ignoreDupResponses="false" image="/richfaces-jboss-inplace-input/ok.png" immediate="false" inView="true" limitToList="false" oncomplete="hideEditIfValid();" rendered="true" requestDelay="-2147483648" size="-2147483648" style="background-color:#ECF4FE;border:solid;border-width:1px;" timeout="-2147483648" transient="false" value="save"/>
- <HtmlGraphicImage id="j_id161" inView="true" ismap="false" onclick="cancelEdit();" rendered="true" style="background-color:#ECF4FE;margin:0px;padding:0px;border:solid;border-width:1px;cursor:pointer;" transient="false" url="/richfaces-jboss-inplace-input/cancel.png" value="/richfaces-jboss-inplace-input/cancel.png"/>
- </div>
- </HtmlForm>
- <HtmlDiv id="textError" inView="true" rendered="true" transient="false">
- <HtmlMessage for="editArea" id="j_id163" inView="true" redisplay="true" rendered="true" showDetail="true" showSummary="false" styleClass="error" tooltip="false" transient="false"/>
- </HtmlDiv>
- <div style="clear:both;"/>
- </HtmlPanel>
- <HtmlInputTextarea cols="-2147483648" disabled="false" id="savedText" immediate="false" inView="true" localValueSet="false" readonly="false" rendered="true" required="false" rows="-2147483648" style="display:none;" transient="false" valid="true"/>
- </div>
- <p>This is the nice way to do text input. How does it work?</p>
<h2>Building the inplace edit textarea</h2>
<p>Download the source:
<a href="richfaces-sample-code.zip">richfaces-sample-code.zip</a>.
This file contains the XHTML for the component, a test
page that uses it, and the simple Seam component that
it interacts with.</p>
<p>The display of the text is simple. We put it in
a rich:panel, using s:formattedText to render
the Seam text. This shows how easy it is to attach
a JavaScript function to any RichFaces component:</p>
<pre>
<rich:panel id="displayDiv" <u>ondblclick</u>="showEdit();" >
<s:formattedText value="#{text}"/>
</rich:panel>
</pre>
<p>This is the function that happens when the user
double-clicks:</p>
<pre>
function showEdit() {
document.getElementById("editDiv").style.display="block";
document.getElementById("displayDiv").style.display="none";
}
</pre>
<p>All it does is switch the editDiv display
style to <code>block</code> and sets the
displayDiv style to <code>none</code>, hiding it.</p>
<p>Now let's look at the editDiv:</p>
<pre>
<rich:panel id="editDiv" style="display:none;">
<h:form id="editForm">
<h:inputTextarea
id="editArea" value="#{text}"
style="width:100%;">
<s:validateFormattedText />
</h:inputTextarea>
<div style="text-align:right;margin-top:-0.5cm;">
<a:commandButton style="background-color:#ECF4FE;border:solid;border-width:1px;"
image="/components/ok.png"
value="save" reRender="displayDiv,savedText,textError"
oncomplete="hideEditIfValid();"/>
<h:graphicImage
onclick="cancelEdit();"
url="/components/cancel.png"
style="background-color:#ECF4FE;margin:0px;padding:0px;border:solid;border-width:1px;cursor:pointer;"/>
</div>
</h:form>
<s:div id="textError">
<h:message for="editArea" styleClass="error"/>
</s:div>
<div style="clear:both;"/>
</rich:panel>
</pre>
<p>We have a basic <code>h:inputTextarea</code>
with a <code>s:validateFormattedText</code>. That's the
universal way of doing Seam text input.</p>
<p>We've also created a <code>div</code> to hold the controls.
We've right-aligned it and bumped it up by 0.5cm
with a negative <code>margin-top</code> setting.</p>
<p>Within the controls <code>div</code> we have two controls:
one to save the changes and the other to cancel the changes.</p>
<p>Here's the save changes button:</p>
<pre><a:commandButton style="background-color:#ECF4FE;border:solid;border-width:1px;"
image="/components/ok.png"
value="save" reRender="displayDiv,savedText,textError"
<u>oncomplete</u>="hideEditIfValid();"/>
</pre>
<p>This is an A4J <code>commandButton</code>, which allows
an AJAX-style submit and re-rendering of selected components.
We want it to rerender three components:</p>
<ul>
<li><code>displayDiv</code></li>
<li><code>textError</code></li>
<li><code>savedText</code></li>
</ul>
<p>Why we re-render <code>displayDiv</code> and
<code>textError</code> is clear. <code>savedText</code>
is more interesting:</p>
<pre>
<h:inputTextarea id="savedText"
style="display:none;"
value="#{text}"/>
</pre>
<p>The purpose of <code>savedText</code> is to hold
the value of the text before the user edits it. The
save button must re-render <code>savedText</code>
when the value binding changes, so that the
<code>savedText</code> will always reflect the last
successfully saved text. Note that if validation
fails (ie, there is a Seam text error)
<code>savedText</code> is not updated because the
apply values phase doesn't succeed, so the value
binding is not changed.</p>
<p>There's a key bit of JavaScript on this <code>a:commandButton</code>:
<code>oncomplete="hideEditIfValid();"</code>. The
<code>oncomplete</code> event is triggered <i>after</i>
the apply values phase is complete and the UI has been re-rendered
on the browser. This is your hook for executing JavaScript
after RichFaces and JSF are done with their work.
And we'll use this hook to decide which divs to display.
If the save was successful, we want to hide the edit div and
the error div. If the save was not successful, there was a validation
error, and we want to show the error and the edit div, and hide
the display div. Here's the function that does it:</p>
<pre>
function hideEditIfValid() {
// check to see if the error div is
// empty or not. It would be nice
// if there were a RichFaces function
// to check a component for errors, but
// it works fine to do it this way.
if(document.getElementById("textError").hasChildNodes()) {
// re-hide the display, and let the editing continue
document.getElementById("displayDiv").style.display="none";
return;
}
// The update was valid, so hide the edit div.
document.getElementById("displayDiv").style.display="block";
document.getElementById("editDiv").style.display="none";
}
</pre>
<p>Note that within JSF you can check to see if there
are Faces messages using this idiom:</p>
<pre>rendered="#{facesContext.maximumSeverity==null}"</pre>
<p>In this case, we did it within JavaScript,
so we checked for child elements. Could the
idiom above be used instead? That's left as an
excercise for the reader.</p>
<p>Now on to the cancel control:</p>
<pre><h:graphicImage
onclick="cancelEdit();"
url="/components/cancel.png"
style="background-color:#ECF4FE;margin:0px;padding:0px;border:solid;border-width:1px;cursor:pointer;"/>
</pre>
<p>First, why isn't this an HTML <code>button</code>? I tried
using a button first, putting an <code>onclick</code> event
binding on it. It worked as epxected. Unfortunately, the different
browsers render to <code>button</code> in significantly
different ways.
For instance, FireFox 3 added left and right padding in the
<code>button</code> even if I set <code>padding:0px;</code>.
Konqueror didn't do that. I don't understand this. I tried
a few things, but couldn't make something that was clean and
cross-browser. Rather than fight that, it was easiest
to turn an image into a button, using the right CSS
and JavaScript. The key is the <code>onclick</code> event
listener, to detect when the user clicks, and the
<code>cursor:pointer;</code> style, to give the user
the visual cue that this is a clickable button. With those
two elements in place, it is a button in every respect,
except it doesn't go to a "depressed" look when clicked.
In this case, the button disappears as soon as it is clicked,
so no depressed button image is needed. If one were needed,
that could also be done with JavaScript. We have built our
own faux button control, without using a button.</p>
<p>Second, how does this cancel button work? It has
an <code>onclick</code> listener which calls the <code>cancelEdit()</code>
function:</p>
<pre>
function cancelEdit() {
document.getElementById("editForm:editArea").value =
document.getElementById("savedText").value;
document.getElementById("displayDiv").style.display="block";
document.getElementById("editDiv").style.display="none";
var errorNode = document.getElementById("textError");
if(errorNode.hasChildNodes())
while (errorNode.childNodes.length >= 1)
errorNode.removeChild(errorNode.firstChild);
return false;
}
</pre>
<p>This function grabs the saved text value
from the hidden <code>textarea</code>,
and saves it to the visible <code>textarea</code>.
Also, because we're cancelling the edit, any validation
errors can be cleared out. Invalid input is never
bound to the value binding, so the errors that
were there are irrelevant. We clear the error
div by simply removing all the child nodes.
And of course we need to change the display
style settings to make the view div visible
<code>display:block;</code>and the
edit div invisible (<code>display:none;</code>).</p>
<h2>Conclusion</h2>
<p>We have used the two new inplace components
that come with RichFaces 3.2. We have also built
a component for Seam which allows inplace style
editing of a textarea, with Seam text validation.
These components are a great way to do a user
interface. Check back later, and we'll put up
screen shots of these components being used in
actual applications.</p>
<h2>If you want to learn JBoss Seam</h2>
<p>We're offering a
- <HtmlOutputText escape="true" id="j_id167" inView="true" rendered="true" transient="false" value=" "/>
- <HtmlLink action=" disabled="false" id="j_id168" immediate="false" inView="true" includePageParams="true" propagation="" rendered="true" transient="false" value="JBoss Seam seminar" view="/seminars/jboss-seam.xhtml"/>
- <HtmlOutputText escape="true" id="j_id169" inView="true" rendered="true" transient="false" value=" "/>
- where you can accelerate
yourself and your team and start building great web applications
with all the power of RichFaces and JBoss Seam.</p>
<h2>Download the source for this article</h2>
<p>Download the source:
<a href="richfaces-sample-code.zip">richfaces-sample-code.zip</a>.</p>
- </div>
<p class="footer">Copyright 2003-
- <HtmlOutputText escape="true" id="j_id172" inView="true" rendered="true" transient="false" value="2013"/>
- , Chiral Software, Inc.
- <HtmlOutputText escape="true" id="j_id174" inView="true" rendered="true" transient="false" value=" "/>
- <HtmlLink action=" disabled="false" id="j_id175" immediate="false" inView="true" includePageParams="true" propagation="none" rendered="true" transient="false" value="colophon" view="/colophon.xhtml"/>
- </p>
</body>
</html>
- </AjaxViewRoot>
| Name | Value |
|---|---|
| None | |
| Name | Value |
|---|---|
| ajaxContext | org.ajax4jsf.context.AjaxContextImpl@104ff7fb |
| calendarComponents | com.chiralsoftware.chiralv3.session.CalendarComponents@7221881a |
| oldBlogEntryQuery | com.chiralsoftware.chiralv3.session.OldBlogEntryQuery@776e9d7f |
| Name | Value |
|---|---|
| None | |
| Name | Value |
|---|---|
| a4jSkin | SkinImpl: {warningBackgroundColor=#FF0000, headerWeightFont=bold, tableBorderColor=#C0C0C0, controlTextColor=#000000, headerTextColor=#000000, generalTextColor=#000000, selectControlColor=#E79A00, headerGradientColor=#F2F7FF, tableSubfooterBackgroundColor=#f1f1f1, trimColor=#D6E6FB, shadowOpacity=1, tipBorderColor=#E5973E , calendarCurrentBackgroundColor=#FF7800, subBorderColor=#ffffff, editorBackgroundColor=#F1F1F1, generalLinkColor=#0078D0, gradientType=plain, tabSizeFont=11, calendarHolidaysTextColor=#FF7800, buttonSizeFont=11, headerBackgroundColor=#BED6F8, hoverLinkColor=#0090FF, tabFamilyFont=Arial, Verdana, sans-serif, calendarSpecBackgroundColor=#E4F5E2, calendarHolidaysBackgroundColor=#FFEBDA, tabDisabledTextColor=#8DB7F3, tableBorderWidth=1px, buttonFamilyFont=Arial, Verdana, sans-serif, generalFamilyFont=Arial, Verdana, sans-serif , tableBackgroundColor=#FFFFFF, calendarWeekBackgroundColor=#F5F5F5, tipBackgroundColor=#FAE6B0 , calendarCurrentTextColor=#FFEBDA, editBackgroundColor=#FEFFDA, shadowBackgroundColor=#000000, headerFamilyFont=Arial, Verdana, sans-serif, tableFooterBackgroundColor=#cccccc, additionalBackgroundColor=#ECF4FE, panelBorderColor=#BED6F8, visitedLinkColor=#0090FF, controlBackgroundColor=#ffffff, calendarSpecTextColor=#000000, tabBackgroundColor=#C6DEFF, generalBackgroundColor=#FFFFFF, generalSizeFont=11px, warningColor=#FFE6E6, headerSizeFont=11px} |
| csfcff | com.sun.faces.context.flash.ELFlash@1255fb01 |
| securityRules | org.jboss.seam.drools.RuleBase@4ad2080e |