On Mon, 2006-12-11 at 20:37 +0100, Martin Grotzke wrote: > On Mon, 2006-12-11 at 09:44 -0700, Andrew Robinson wrote: > > "When myBean.myModel.myOptions is invoked the first time, I do some > > lazy > > initialization, this might cause errors..." > > > > I would recommend that you load this data in the on load method of > > your page. This way, if it fails, you can handle the error in any way > > you want, including redirecting to an error page. > I cannot do this, because I have to initialize the detailStamps of > all rows separately: the details of one item cause several backend > requests that might cost money, and they definitively need time > to return (several seconds per request). > > Now I wrote a CustomHtmlDataTable (extending HtmlDataTable) that > provides an additional MethodBinding "toggleDetailActionListener".
Btw, I just posted the complete example here: http://www.javakaffee.de/blog/2006/12/11/how-to-add-a-new-attribute-to-an-existing-jsf-component-using-facelets/ Perhaps it's useful for someone... Cheers, Martin > > > The toggleDetail method is extended so that it invokes also the method > binding if it's provided. > > The hardest thing was to write the facelets MetaTagHandler that sets > the attribute on the CustomHtmlDataTable: > > public final class CustomHtmlDataTableHandler extends ComponentHandler { > > public CustomHtmlDataTableHandler(ComponentConfig config) { > super( config ); > } > > protected MetaRuleset createMetaRuleset(Class type) { > return super.createMetaRuleset(type).addRule( > ActionSourceRule.Instance ); > } > > static final class ActionSourceRule extends MetaRule { > > private static final String ACTION_LISTENER_ATT_NAME = > "toggleDetailActionListener"; > > public final static Class[] ACTION_LISTENER_SIG = new Class[] { > ActionEvent.class }; > > final static class ActionListenerMapper extends Metadata { > > private final TagAttribute attr; > > public ActionListenerMapper(TagAttribute attr) { > this.attr = attr; > } > > public void applyMetadata(FaceletContext ctx, Object instance) { > ((CustomHtmlDataTable) instance) > .setToggleDetailActionListener( new > LegacyMethodBinding(this.attr > .getMethodExpression(ctx, null, > > ActionSourceRule.ACTION_LISTENER_SIG))); > } > > } > > public final static ActionSourceRule Instance = new > ActionSourceRule(); > > public ActionSourceRule() { > super(); > } > > public Metadata applyRule(String name, TagAttribute attribute, > MetadataTarget meta) { > if (meta.isTargetInstanceOf(CustomHtmlDataTable.class)) { > > if (ACTION_LISTENER_ATT_NAME.equals(name)) { > return new ActionListenerMapper(attribute); > } > } > return null; > } > } > > } > > > I hope this is basically the correct approach... > > Cheers, > Martin > > > > > Use one of these technologies: > > > > 1) JBoss-Seam. Set the action to run in the pages.xml file. Example: > > > > <page view-id="/index.xhtml" > > action="#{welcomeBean.onLoad}" /> > > > > 2) On-load from jsf-comp: > > http://jsf-comp.sourceforge.net/components/onload/index.html > > > > 3) or use Shale (I have no experience with this one): > > http://shale.apache.org/shale-view/index.html > > > > -Andrew > > > > On 12/11/06, Martin Grotzke <[EMAIL PROTECTED]> wrote: > > On Mon, 2006-12-11 at 10:29 -0500, Simon Lessard wrote: > > > Hello Martin, > > > > > > Can you provide a mopre explicit example of the use case > > please? > > Sorry for the few words, if you think about a problem for > > several days > > to you it seems just too clear ;) > > > > What I have is a datatable in a template with the detailStamp > > facet: > > > > <table jsfc="t:dataTable" > > ... > > value="#{myBean.myModel}" > > var="myItem" > > varDetailToggler="detailToggler"> > > > > ... some columns ... > > > > <span jsfc="f:facet" name="detailStamp"> > > <ui:include src=" itemdetails.xhtml"> > > <ui:param name="item" > > value="#{myItem}"/> > > </ui:include> > > </span> > > </table> > > > > The itemdetails.xhtml displays details to the item, e.g. it > > iterates > > over some detail options like the following: > > > > <ui:repeat var="option" value="#{item.myOptions}"> > > #{option.description} > > </ui:repeat> > > > > So the the myBean.myModel.myOptions method is requested when > > the detailStamp > > is displayed for one item, this method is invoked when > > rendering happens. > > > > When myBean.myModel.myOptions is invoked the first time, I do > > some lazy > > initialization, this might cause errors... > > > > I do not see how I could do the processing in the invoke > > application, because > > the detailStamp is shown via HtmlDataTable.toggleDetail, which > > is invoked > > during invoke-application, but there's no possibility of > > specifying a listener > > that is invoked when toggleDetail is invoked... > > > > I hope this clarifies the problem a little bit, if s.th. is > > missing please > > let me know! > > > > Thanx a lot, > > cheers, > > Martin > > > > > > > > > Why can't you do the processing in the invoke application > > phase? > > > Without more details, all I could suggest is to use a render > > response > > > phase listener and add your logic in the beforePhase > > method. > > > > > > > > > Regards, > > > > > > ~ Simon > > > > > > On 12/11/06, Martin Grotzke <[EMAIL PROTECTED]> > > wrote: > > > Hi all, > > > > > > I have a case where I perform some logic during the > > > RENDER_RESPONSE > > > phase where an error might occurs and I want to > > display some > > > error > > > message - which is unfortunately not displayed > > directly. But > > > with the > > > next request/response the error message is > > displayed. I asume > > > that this > > > is the case because the h:messages component is > > already > > > rendered - so > > > the behavior should basically be correct. > > > > > > Do you have any suggestions how to handle this? > > > > > > The concrete case is when the details of a dataTable > > (facet > > > detailStamp) > > > are displayed - just comes into my mind to use a > > > CustomHtmlDataTable > > > component that overrides the toggleDetail method... > > What do > > > you think? > > > > > > Thanx in advance, > > > cheers, > > > Martin > > > > > > > > > > > > > > > > > > > > -- > > Martin Grotzke > > http://www.javakaffee.de/blog/ > > > > > > -- Martin Grotzke http://www.javakaffee.de/blog/
signature.asc
Description: This is a digitally signed message part

