Hi Jan, I tried the first option (with @PostConstruct) and works fine for my application, cause I'm using JSF1.2!
Thanks, -- Daniel S. Teixeira [EMAIL PROTECTED] 2008/9/20 Jan-Kees van Andel <[EMAIL PROTECTED]> > Getters being called multiple times is in some way a consequence of the JSF > pull model. > > And to be really honest, I also often put data access inside a getter > (often the easiest option), but there are some other options. > > - If you're using JSF 1.2, you can use the @PostConstruct annotation to > indicate a method that has to be called when the bean is created (after the > constructor and after dependency injection). Without JSF 1.2, you can create > behavior like this, for example by creating your own VariableResolver, but > this may be overkill for your problem. > > - You can also use an action listener to load data into a member. This > option is very explicit, since you know exactly when the method will be > called, but it sometimes doesn't work, since the action listener isn't > called when you access the page directly. So you always need to get to your > page through a commandButton/commandLink. When using a request scoped > managed bean to store your data, this mechanism isn't very reliable, because > when you refresh or press a button on the page itself, the request scoped > data is lost and you have to find a way to re-initialize it. It also only > works when you use forwards, not with redirects, since you lose your request > scoped data with the redirect. > > - A third option is using a library like Shale or Seam, which provide View > Controller like behavior. This means that you can attach a method to your > page. This method will be called with each page request, giving you a hook > to load your data. http://shale.apache.org/shale-view/index.html > > - But IMHO the easiest option is this one: > public class RequestScopedBean { > private SimpleScheduleModel model; > public SimpleScheduleModel getModel() { > if (model == null) { > loadData(); > } > return model; > } > } > > I don't know the context of the system, but if you want a simple solution > in a JSF 1.1 environment, just use the last one, otherwise the first one. > When you see yourself writing data access logic inside getters, consider one > of the other options. I've seen JSF applications become totally > unmaintainable because people use constructs like these all the time instead > of fixing the problem. > > Regards, > > Jan-Kees > > Ps. Seam has an annotation for people who get tired of those null checks: > http://docs.jboss.org/seam/2.0.2.GA/reference/en-US/html/tutorial.html#d0e977 > You can see the data access logic inside a separate method, which get > called when you try to resolve the variable "messageList" and it is not > initialized yet. > > > > > 2008/9/19 Daniel S. Teixeira <[EMAIL PROTECTED]> > >> Hi Jan. >> Thanks for your answer... That helps a lot. >> >> So, I would like to know where should be the better place to fill the >> model object with entries... >> Imagine something like this: >> I have some entries per day.. So, my scheduele view will be show by day >> (ScheduleModel.DAY). By default, I want to fill the schedule at the first >> time with data from the current day... >> So, I need to get entries (in this case, from database). >> >> On my service layer: someService.findByDay(Date day) - this method return >> all messages from my database. >> >> So, where should I call it? >> I'm little bit confuse... >> >> Thanks in advance, >> Daniel >> >> >> 2008/9/19 Jan-Kees van Andel <[EMAIL PROTECTED]> >> >> I don't see what the problem is. Components call getters all the time. >>> Normally this is no problem since there should not be logic in the getter. >>> But your solution is not uncommon. >>> >>> So, the model.isEmpty protects the loadData to be called multiple times. >>> Two things: >>> 1 Are you sure you update your model attribute within loadData()? If not, >>> it's no surprise loadData gets called, since it remains empty. :) >>> 2 When loadData loads an empty model, model.isEmpty() will always return >>> true, even if called multiple times. >>> >>> I think the easiest thing to do (if what I'm describing is really your >>> problem) is replacing the isEmpty check with a "model == null" check, which >>> is more reliable, because it can deal with empty models. Also, it is more >>> fail-fast, instead of lurking in your code until the stars line up. >>> >>> But a getter being called multiple times within a single request is not >>> uncommon. If you want to do stuff inside the getter, just protect the code >>> with a check like the null check I said before. >>> >>> Hope this helps. >>> >>> Regards, >>> >>> Jan-Kees >>> >>> >>> 2008/9/19 Daniel S. Teixeira <[EMAIL PROTECTED]> >>> >>> Hi, >>>> I'm trying to use Schedule component. >>>> I need to load some values from database in order to fill the schedule. >>>> On my backing bean I have 1 private atributte called model (with get/set >>>> methods). >>>> When the page is called, for some reason the getModel method is called a >>>> lot of times... More than 100 times. >>>> Is this a normal behavior? >>>> >>>> Cause I wanted to load data from getModel method like: >>>> >>>> public SimpleScheduleModel getModel() { >>>> if (model.isEmpty()) >>>> loadData(); >>>> return model; >>>> } >>>> >>>> I don't really know if I'm doing something wrong... >>>> >>>> Baking bean scope: request >>>> >>>> Regards, >>>> >>>> >>>> -- >>>> Daniel S. Teixeira >>>> [EMAIL PROTECTED] >>>> >>> >>> >> >> >> -- >> Daniel S. Teixeira >> [EMAIL PROTECTED] >> > >

