You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by he...@dnbnor.no on 2007/03/08 07:10:47 UTC

RE: how do you pass/set parameters upon ActionListener execution?-puzzled

Hi

This is nicely solved by Shale. There you define your bundles at any scope, in the faces-config.xml file.

	<!-- Make resources available to the pages by defining it here (in a page use messages['propertyname'] as value -->
	<managed-bean>
		<managed-bean-name>messages</managed-bean-name>
		<managed-bean-class>
			org.apache.shale.util.LoadBundle
		</managed-bean-class>
		<managed-bean-scope>application</managed-bean-scope>
		<managed-property>
			<property-name>basename</property-name>
			<value>
				org.apache.shale.clay.sample.resources.ResourceBundle
			</value>
		</managed-property>
	</managed-bean>

Hermod

-----Original Message-----
From: Simon Kitching [mailto:simon.kitching@rhe.co.nz]
Sent: Thursday, March 08, 2007 12:13 AM
To: MyFaces Discussion
Subject: Re: how do you pass/set parameters upon ActionListener
execution?-puzzled



Ok, I looked at the LoadBundleTag class, and there is a nice comment at 
the start :-)

/**
  * TODO:
  * We should find a way to save loaded bundles in the state, because 
otherwise
  * on the next request the bundle map will not be present before the 
render phase
  * and value bindings that reference to the bundle will always log annoying
  * "Variable 'xxx' could not be resolved" error messages.
  *
  * @author Manfred Geiler (latest modification by $Author: bdudney $)
  * @version $Revision: 225368 $ $Date: 2005-07-27 06:14:51 +1200 (Wed, 
27 Jul 2005) $
  */

This code is the same in Tomahawk 1.1.3 and trunk:
http://svn.apache.org/repos/asf/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/taglib/core/LoadBundleTag.java

So there's the explanation. The f:loadBundle tag doesn't do anything 
until the render phase, ie #{msg} is not valid during previous phases.

However the t:updateActionListener obviously must evaluate its 
expression at update-model phase, so the message bundle has not yet been 
loaded.

As the comment says, what is really needed is for the f:loadBundle tag 
to attach the name(s) of resource bundles to be loaded to the component 
tree (eg as attributes in UIViewRoot) and for these to be loaded during 
restore-view phase.

Regards,

Simon

Madhav Bhargava wrote:
> I guess I know what the problem is.
> 
> The EL expression that I have used is: #{msg['breadcrumb.label.reminders']}
> 
> This expression refers to a key (breadcrumb.label.reminders) in the 
> message bundle(Messages.properties)
> 
> When this value goes to the updateActionListener tag's doStartTag method > it tries to create a ValueBinding out of this EL expression. This is 
> where it returns null as the value binding cannot be created.
> 
> To circumvent this problem in the setter method for displayText I added > the following:
> 
> ...
> 
> ...
> 
> ResourceBundle bundle = ResourceBundle.getBundle(resourceBundleName, 
> locale, getCurrentClassLoader(params));
> 
> this.displayText= Bundle.getString(key);
> 
> In the JSP I pass:
> 
> <t:updateActionListener
> 
> property="#{breadCrumbNavigatorBean.displayText}"
> 
> value="breadcrumb.label.reminders"/>
> 
> *Now it works!!*
> 
> I guess you cannot pass a EL that references a message bundle as a value > for t:updateActionListener.
> 
> The only thing that I cannot understand is -
> 
> I have <f:loadBundle basename="com.bingo.tringo.bundle.Messages" 
> var="msg"/> in the Jsp.
> 
> The same EL expression works when given as a value to <t:outputLabel> 
> component but then it does not work when given as a value to 
> <t:updateActionListener>
> 
> If someone can throw some light then that will be great.
> 
> Regards,
> 
> madhav
> 
>>  -----Original Message-----
> 
>>  From: Madhav Bhargava [mailto:Madhav_Bhargava@infosys.com]
> 
>>  Sent: Wednesday, March 07, 2007 1:36 PM
> 
>>  To: MyFaces Discussion
> 
>>  Subject: RE: how do you pass/set parameters upon ActionListener
> 
>>  execution?-puzzled
> 
>>
> 
>>  Thanks a lot Simon for all the help. I will have to debug the component.
> 
>>  If I find something interesting then I will share with the list.
> 
>>
> 
>>  Cheers,
> 
>>  madhav
> 
>>
> 
>>
> 
>>  > -----Original Message-----
> 
>>  > From: Simon Kitching [mailto:simon.kitching@rhe.co.nz]
> 
>>  > Sent: Wednesday, March 07, 2007 1:07 PM
> 
>>  > To: MyFaces Discussion
> 
>>  > Subject: Re: how do you pass/set parameters upon ActionListener
> 
>>  > execution?-puzzled
> 
>>  >
> 
>>  > Madhav,
> 
>>  >
> 
>>  > Well, people here seem to be quite sure that the
> 
>>  t:updateActionListener
> 
>>  > is correct; I certainly don't *see* any problems with it, nor do I
> 
>>  > *experience* any problems.
> 
>>  >
> 
>>  > If you are going to say "It should not be a problem with getter and
> 
>>  > setter" then I'm not sure that this list can be much more help. Looks
> 
>>  > like you'll have to step through the updateActionListener with a
> 
>>  > debugger - or build your own custom version with extra logging in it.
> 
>>  >
> 
>>  > Regards,
> 
>>  >
> 
>>  > Simon
> 
>>  >
> 
>>  > Madhav Bhargava wrote:
> 
>>  > > Hi Simon,
> 
>>  > >
> 
>>  > > The version of Myfaces that I am using is from a nightly build
> 
>>  version
> 
>>  > > 1.1.5.
> 
>>  > > Tomahawk version is 1.1.5 as well (some nightly build)
> 
>>  > >
> 
>>  > > displayText is a String property and getter and setter have been
> 
>>  > > generated using Eclipse so I am sure that there is no problem with
> 
>>  the
> 
>>  > > signature.
> 
>>  > >
> 
>>  > > It should not be a problem with getter and setter as literal String
> 
>>  > > values are getting set properly in the backing bean.
> 
>>  > >
> 
>>  > > Regards,
> 
>>  > > Madhav
> 
>>  > >
> 
>>  > >> -----Original Message-----
> 
>>  > >> From: Simon Kitching [mailto:simon.kitching@rhe.co.nz]
> 
>>  > >> Sent: Wednesday, March 07, 2007 12:35 PM
> 
>>  > >> To: MyFaces Discussion
> 
>>  > >> Subject: Re: how do you pass/set parameters upon ActionListener
> 
>>  > >> execution?-puzzled
> 
>>  > >>
> 
>>  > >> Sorry I didn't read the whole mail.
> 
>>  > >>
> 
>>  > >> How exactly is "msg" defined?
> 
>>  > >>
> 
>>  > >> I don't see here what version of Tomahawk you are working with. For
> 
>>  > >> version 1.1.3 (which is what I have at hand) the value is fetched
> 
>>  just
> 
>>  > >> using a standard call to "getValue()", so there's nothing special
> 
>>  > > there.
> 
>>  > >> However afterwards it tries to do some type-conversion:
> 
>>  > >>
> 
>>  > >>      Object v = getValue();
> 
>>  > >>      if (v != null &&
> 
>>  > >>          v instanceof String)
> 
>>  > >>      {
> 
>>  > >>          Class type = updateBinding.getType(context);
> 
>>  > >>           ....
> 
>>  > >>      }
> 
>>  > >>      updateBinding.setValue(context, v);
> 
>>  > >>
> 
>>  > >> If expression breadCrumbNavigatorBean.displayText doesn't reference
> 
>>  a
> 
>>  > >> String property then there might be a conversion problem. Note that
> 
>>  > >> exactly what defines a javabean "property" is slightly more complex
> 
>>  > > than
> 
>>  > >> just having a setter method. For example, the setter must not be
> 
>>  > > static,
> 
>>  > >> and there must not be a getter method with a conflicting signature.
> 
>>  > > You
> 
>>  > >> could check by using java.bean.Introspector on this class and
> 
>>  verify
> 
>>  > >> that it does agree that there is indeed a writeable String property
> 
>>  > >> "displayText". Ok, it's not likely that this is wrong but
> 
>>  > >> t:updateActionListener is in wide use and there are no known
> 
>>  problems
> 
>>  > >> with it so something odd is going on..
> 
>>  > >>
> 
>>  > >> Cheers,
> 
>>  > >>
> 
>>  > >> Simon
> 
>>  > >>
> 
>>  > >>
> 
>>  > >> Madhav Bhargava wrote:
> 
>>  > >>> As I mentioned in point number 2 it works. displayText property in
> 
>>  > > the
> 
>>  > >>> backing bean will get populated with "dummyValue"
> 
>>  > >>>
> 
>>  > >>> The immediate inference of this result was that there is something
> 
>>  > > wrong
> 
>>  > >>> with my EL expression. But then when I used <t:outputLabel> tag
> 
>>  with
> 
>>  > > the
> 
>>  > >>> same EL expression it outputted the correct value.
> 
>>  > >>>
> 
>>  > >>> This means that there is nothing wrong with the EL expression. The
> 
>>  > > key
> 
>>  > >>> is properly defined in the Messages.properties file as well.
> 
>>  > >>>
> 
>>  > >>> ~madhav
> 
>>  > >>>
> 
>>  > >>>> -----Original Message-----
> 
>>  > >>>> From: Simon Kitching [mailto:simon.kitching@rhe.co.nz]
> 
>>  > >>>> Sent: Wednesday, March 07, 2007 12:20 PM
> 
>>  > >>>> To: MyFaces Discussion
> 
>>  > >>>> Subject: Re: how do you pass/set parameters upon ActionListener
> 
>>  > >>>> execution?- puzzled
> 
>>  > >>>>
> 
>>  > >>>> What happens if you do this?
> 
>>  > >>>> <t:updateActionListener
> 
>>  > >>>>   property="#{breadCrumbNavigatorBean.displayText}"
> 
>>  > >>>>   value="dummyValue"/>
> 
>>  > >>>>
> 
>>  > >>>> Madhav Bhargava wrote:
> 
>>  > >>>>> Hi Werner,
> 
>>  > >>>>>
> 
>>  > >>>>> I double checked the jsp and the backing bean but it just
> 
>>  refuses
> 
>>  > > to
> 
>>  > >>>>> parse the EL expression.
> 
>>  > >>>>>
> 
>>  > >>>>> This is what I have done:
> 
>>  > >>>>>
> 
>>  > >>>>> *Jsp Code:*
> 
>>  > >>>>>
> 
>>  > >>>>> <t:commandLink value="Add Reminders" styleClass="linkClass"
> 
>>  > >>>>> action="#{reminderController.getExistingRemindersList}"
> 
>>  > >>>>>
> 
>>  > >>>>> actionListener="#{breadCrumbNavigatorBean.updateBreadCrumb}"
> 
>>  > >>>>> rendered="#{!physicianHomeController.showRemindersMoreLink}">
> 
>>  > >>>>>
> 
>>  > >>>>> <t:updateActionListener
> 
>>  > >>>>> property="#{breadCrumbNavigatorBean.displayText}"
> 
>>  > >>>>> value="#{msg['breadcrumb.label.reminders']}"/>
> 
>>  > >>>>>
> 
>>  > >>>>> </t:commandLink>
> 
>>  > >>>>>
> 
>>  > >>>>> In the* backing bean* I just defined a String property with the
> 
>>  > > name
> 
>>  > >>>>> displayText.
> 
>>  > >>>>>
> 
>>  > >>>>>
> 
>>  > >>>>> */Following is the observation:/*
> 
>>  > >>>>>
> 
>>  > >>>>> 1. The displayText in the backing bean is null. In other words
> 
>>  the
> 
>>  > >>> EL
> 
>>  > >>>>> expression does not get parsed resulting in a null value.
> 
>>  > >>>>>
> 
>>  > >>>>> 2. If a literal string is given in place of an EL expression
> 
>>  then
> 
>>  > >>> the
> 
>>  > >>>>> value is correctly populated in the backing bean.
> 
>>  > >>>>>
> 
>>  > >>>>> 3. Based on the result from point number 2 - I tried just
> 
>>  > > outputting
> 
>>  > >>> the
> 
>>  > >>>>> value of the EL expression using: <t:outputLabel
> 
>>  > >>>>> value="#{msg['breadcrumb.label.reminders']}"
> 
>>  > >>>>> styleClass="outputLabelText"/> The same expression is now parsed
> 
>>  > >>>>> properly and the value appears on the page. This means that
> 
>>  there
> 
>>  > > is
> 
>>  > >>>>> nothing wrong with the EL expression.
> 
>>  > >>>>>
> 
>>  > >>>>> I am not sure what is going on? Why will
> 
>>  <t:updateActionListener>
> 
>>  > >>> refuse
> 
>>  > >>>>> to parse an EL expression that references a message bundle?
> 
>>  > >>>>>
> 
>>  > >>>>> Regards,
> 
>>  > >>>>>
> 
>>  > >>>>> Madhav
> 
>>  > >>>>>
> 
>>  > >>>>>>  -----Original Message-----
> 
>>  > >>>>>>  From: news [mailto:news@sea.gmane.org] On Behalf Of Werner
> 
>>  Punz
> 
>>  > >>>>>>  Sent: Tuesday, March 06, 2007 4:10 PM
> 
>>  > >>>>>>  To: users@myfaces.apache.org
> 
>>  > >>>>>>  Subject: Re: how do you pass/set parameters upon
> 
>>  ActionListener
> 
>>  > >>>> execution?
> 
>>  > >>>>>>  I had similar usescases (although not using
> 
>>  > > internationalisation)
> 
>>  > >>>>>>  in my current up a dozend times, the mechanism itself works,
> 
>>  > >>>>>>  I can only guess here,
> 
>>  > >>>>>>  first of all which myfaces version do you use and which
> 
>>  tomahawk
> 
>>  > >>>> version.
> 
>>  > >>>>>>  I can recommend to go to the latest 1.1.5 stable and use the
> 
>>  > >>> tomahawk
> 
>>  > >>>>>>  and sandbox nightlies.
> 
>>  > >>>>>>  Secondly check for typos nav.msg.remiders seems like one
> 
>>  > >>>>>>  there is an "n" missing in reminders typowise, which could
> 
>>  > >>>>>>  be the cause for an empty string issued.
> 
>>  > >>>>>>  Werner
> 
>>  > >>>>>>  Madhav Bhargava schrieb:
> 
>>  > >>>>>>  > Hi Werner,
> 
>>  > >>>>>>  >
> 
>>  > >>>>>>  > Yes, you are right. But I still cannot get the values in my
> 
>>  > >>> backing
> 
>>  > >>>>>>  bean.
> 
>>  > >>>>>>  >
> 
>>  > >>>>>>  > *Jsp code:*
> 
>>  > >>>>>>  >
> 
>>  > >>>>>>  > <t:commandLink value="Add Reminders" styleClass="linkClass"
> 
>>  > >>>>>>  > action="#{reminderController.showAddReminderScreen}"
> 
>>  > >>>>>>  >
> 
>>  > >>>>>>  > actionListener="#{breadCrumbNavigatorBean.updateBreadCrumb}"
> 
>>  > >>>>>>  >
> 
>>  rendered="#{!physicianHomeController.showRemindersMoreLink}">
> 
>>  > >>>>>>  >
> 
>>  > >>>>>>  > <t:updateActionListener
> 
>>  > >>>>>>  >
> 
>>  property="#{breadCrumbNavigatorBean.participant.displayText}"
> 
>>  > >>>>>>  > value="#{msg['nav.msg.remiders']}"/>
> 
>>  > >>>>>>  >
> 
>>  > >>>>>>  > </t:commandLink>
> 
>>  > >>> **************** CAUTION - Disclaimer *****************
> 
>>  > >>> This e-mail contains PRIVILEGED AND CONFIDENTIAL INFORMATION
> 
>>  > > intended
> 
>>  > >> solely for the use of the addressee(s). If you are not the intended
> 
>>  > >> recipient, please notify the sender by e-mail and delete the
> 
>>  original
> 
>>  > >> message. Further, you are not to copy, disclose, or distribute this
> 
>>  > > e-mail
> 
>>  > >> or its contents to any other person and any such actions are
> 
>>  unlawful.
> 
>>  > >> This e-mail may contain viruses. Infosys has taken every reasonable
> 
>>  > >> precaution to minimize this risk, but is not liable for any damage
> 
>>  you
> 
>>  > > may
> 
>>  > >> sustain as a result of any virus in this e-mail. You should carry
> 
>>  out
> 
>>  > > your
> 
>>  > >> own virus checks before opening the e-mail or attachment. Infosys
> 
>>  > > reserves
> 
>>  > >> the right to monitor and review the content of all messages sent to
> 
>>  or
> 
>>  > >> from this e-mail address. Messages sent to or from this e-mail
> 
>>  address
> 
>>  > > may
> 
>>  > >> be stored on the Infosys e-mail system.
> 
>>  > >>> ***INFOSYS******** End of Disclaimer ********INFOSYS***
> 
>>  > >
> 



* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

This email with attachments is solely for the use of the individual or
entity to whom it is addressed. Please also be aware that DnB NOR cannot
accept any payment orders or other legally binding correspondence with
customers as a part of an email. 

This email message has been virus checked by the anti virus programs used
in the DnB NOR Group.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *