myfaces-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andrew Robinson" <andrew.rw.robin...@gmail.com>
Subject Re: Perfomance Issues with JSF dropdown
Date Tue, 08 May 2007 17:13:51 GMT
I didn't check my code, I just typed it into the email, so there may
be compilation problems and such.

As for the null pointer, can you tell us which line is 271?

On 5/7/07, bansi <mail2bansi@yahoo.com> wrote:
>
> Thank you so much Andrew. Based on your recommendation i tried something like
> this which results in NullPointerException.
> public List getManufacturerList()
> {
>    Map reqMap =
> FacesContext.getCurrentInstance().getExternalContext().getRequestMap();
>   // Note : I am not able to get DefaultContext as you mentioned in the
> posting . Its giving error hence i end using getCurrentInstance of
> FacesContext
>
>   List<SelectItem> manufacturerList =
> (List<SelectItem>)reqMap.get(manufacturerList_KEY);
>   List<Manufacturer> manufResultSet = new ArrayList<Manufacturer>();
>   if (manufacturerList == null)
>   {
>     // TODO: load it
>
>           manufResultSet =  manufManager.getManufacturerList(); //get data from
> Database
>           for (int i=0;  i< manufResultSet.size(); i++) {
>                         Manufacturer namsManufacturer = (Manufacturer) manufResultSet.get(i);
>                         Long manufId = namsManufacturer.getId();
>                         String manufName = namsManufacturer.getName();
>                         manufacturerList.add(new SelectItem(manufId.toString(),manufName));
>                 }
>     reqMap.put(manufacturerList_KEY, manufacturerList);
>   }
>   return manufacturerList;
> }
>
> I know i am doing something wrong or maybe i didn't understood your posting
> correctly.
> Caused by: java.lang.NullPointerException
>         at
> com.boeing.nmt.nams.view.bean.ManufacturerBean.getManufacturerList(ManufacturerBean.java:271)
>
> Any pointers/suggestions to help me fix my code will be highly appreciated
> Regards
> Bansi
>
> Andrew Robinson-5 wrote:
> >
> > private final static String LARGE_STUFF_KEY = "largestuff";
> > @SuppressWarnings("unchecked")
> > public List<Stuff> getLargeStuff()
> > {
> >   Map reqMap = FacesContext.getDefaultInstance()
> >     .getExternalContext().getRequestMap();
> >   List<Stuff> list = (List<Stuff>)reqMap.get(LARGE_STUFF_KEY);
> >   if (list == null)
> >   {
> >     // TODO: load it
> >     reqMap.put(LARGE_STUFF_KEY, list);
> >   }
> >   return list;
> > }
> >
> > The request map will be thrown out at the end of the request. So the
> > "large stuff" will only be loaded once per request.
> >
> > On 5/4/07, bansi <mail2bansi@yahoo.com> wrote:
> >>
> >> Thanks Andrew for quick response. As i am newbie to JSF i would
> >> appreciate
> >> code snippet on how to cache the data pre-request as you correctly
> >> guessed
> >> the  data is constructed inside a get method .
> >> Here is my method in backing bean
> >>
> >> public List getManufacturerList(){
> >>         logger.info(" *** In getManufacturerList Backing Bean*** ");
> >>         List<NamsManufacturer> models = new
> >> ArrayList<NamsManufacturer>();
> >>         List<SelectItem> manufacturers = new ArrayList<SelectItem>();
> >>
> >>         models =  manufManager.getManufacturerList(); //// Calls
> >> Hibernate/Spring
> >> i.e.        database call to retrieve List of Manufacturers
> >>
> >>         // Iterating thru  Loop to wrap into instances of SelectItem so
> >> that it can
> >> be rendered as dropdown
> >>
> >>         for (int i=0;  i< models.size(); i++) {
> >>                 NamsManufacturer namsManufacturer = (NamsManufacturer)
> >> models.get(i);
> >>                 Long manufId = namsManufacturer.getId();
> >>                 String manufName = namsManufacturer.getName();
> >>                 manufacturers.add(new
> >> SelectItem(manufId.toString(),manufName));
> >>         }
> >>                 return manufacturers;
> >>
> >> }
> >>
> >>
> >> Also i would highly appreciate code snippet on how to use the requestMap
> >> from the external context to cache data for
> >> the request to avoid calling twice
> >>
> >> Any pointers/suggestions where i can obtain more info will be highly
> >> appreciated
> >>
> >> Regards
> >> Bansi
> >>
> >>
> >> Andrew Robinson-5 wrote:
> >> >
> >> > UIComponents are free to call their value bindings as many times as
> >> > they want, so you should make sure you cache that data pre-request if
> >> > you are constructing data in a get method (like select items, maps,
> >> > etc).
> >> >
> >> > In your case, it is being called twice because of the two phases it is
> >> > needed. (1) During validation to ensure the value the user submit is a
> >> > valid value (contained in a value of one of the select items) and (2)
> >> > when re-rendering during an encodeXxx method.
> >> >
> >> > You can use the requestMap from the external context to cache data for
> >> > the request that will be left for the GC after the request is
> >> > completed.
> >> >
> >> >
> >> > On 5/4/07, bansi <mail2bansi@yahoo.com> wrote:
> >> >>
> >> >> Here is the situation
> >> >>
> >> >> I have the following dropdown defined with ajax4jsf event onchange
> >> >>
> >> >> Code:
> >> >>
> >> >> <h:panelGrid columns="3" styleClass="detail" columnClasses="label">
> >> >>                          <h:outputText value="Manufacturer" />
> >> >>
> >> >>                          <h:selectOneMenu id="manufList"
> >> >> value="#{manufacturerBean.selectedManufacturer}" >
> >> >>                            <f:selectItem itemLabel="New"
> >> itemValue="New"
> >> >> />
> >> >>
> >> >>               <f:selectItems
> >> value="#{manufacturerBean.manufacturerList}"
> >> >> />
> >> >>               <a4j:support
> >> >> action="#{manufacturerBean.loadManufacturerDetails}" event="onchange"
> >> >> reRender="manufName,manufDescription,manufSource,btnSave,btnDelete"
/>
> >> >>            </h:selectOneMenu>
> >> >>             </h:panelGrid>
> >> >>
> >> >> The perfomance issue is
> >> >>
> >> >>  Whenever i pick a different value from the dropdown, i expect only
> >> >> ajax4jsf
> >> >> action method is called i.e.
> >> >>
> >> >> <a4j:support action="#{manufacturerBean.loadManufacturerDetails}"
> >> >> event="onchange"
> >> >> reRender="manufName,manufDescription,manufSource,btnSave,btnDelete"
/>
> >> >>
> >> >> BUT why is the  method defined in  f:selectItems is getting called
> >> >> twice as seen in log file
> >> >>  <f:selectItems value="#{manufacturerBean.manufacturerList}" />
> >> >>
> >> >> Logs:
> >> >> 2007-05-04 14:16:31,694 INFO
> >> >> [com.boeing.nmt.nams.view.bean.ManufacturerBean] - < *** In
> >> >> getManufacturerList Backing Bean*** >
> >> >> Any pointers/suggestions will be highly appreciated
> >> >>
> >> >> Regards
> >> >> Bansi
> >> >> --
> >> >> View this message in context:
> >> >>
> >> http://www.nabble.com/Perfomance-Issues-with-JSF-dropdown-tf3694314.html#a10330594
> >> >> Sent from the MyFaces - Users mailing list archive at Nabble.com.
> >> >>
> >> >>
> >> >
> >> >
> >>
> >> --
> >> View this message in context:
> >> http://www.nabble.com/Perfomance-Issues-with-JSF-dropdown-tf3694314.html#a10332531
> >> Sent from the MyFaces - Users mailing list archive at Nabble.com.
> >>
> >>
> >
> >
>
> --
> View this message in context: http://www.nabble.com/Perfomance-Issues-with-JSF-dropdown-tf3694314.html#a10367087
> Sent from the MyFaces - Users mailing list archive at Nabble.com.
>
>

Mime
View raw message