dev@jsftemplating.java.net

Re: JSFTemplating: Working w/ ResourceBundles

From: Ana Caballero <Ana.Caballero_at_Sun.COM>
Date: Tue, 18 Jul 2006 18:02:32 -0700

Thanks Anissa. This works!

Anissa Lam wrote:

>
> I talked with Ken regarding this, it may be better to use the
> $resource{resourceBundleName.resourceKey} syntax, that way, you can
> have the "." in the resourceKey.
> But to use $resource, you need to create the bundle during the
> beforeCreate event. btw, beforeCreate doesn't need to be inside an
> <event> tag.
>
> eg
> <sun:page id="page">
> <!beforeCreate
> setResourceBundle(key="i18n"
> bundle="com.sun.enterprise.tools.admingui.resources.Strings")
> />
> <sun:html id="html">
> <sun:head id="head" title="$resource{i18n.common.title}" />
>
> Anissa.
>
> Ana Caballero wrote:
>
>> Hi Ken,
>>
>> This works fine as long as I don't use "." in the key name. For
>> example the following will not work" #{resource.jvm.GeneralTitle}"
>> for key name "jvm.GeneralTitle" and bundle name "resource".
>>
>> If I change the key name to "JVMGeneralTitle" and use the following
>> #{resource.JVMGeneralTitle} it will work.
>>
>> If I use the following syntax #{resourceBundleName, resourceKey} I
>> get the exception below:
>>
>> javax.servlet.ServletException: Encountered "," at line 1, column 7.
>> Was expecting one of:
>> "}" ...
>> "." ...
>> "[" ...
>> ">" ...
>> "gt" ...
>> "<" ...
>> "lt" ...
>> ">=" ...
>> "ge" ...
>> "<=" ...
>> "le" ...
>> "==" ...
>> "eq" ...
>> "!=" ...
>> "ne" ...
>> "&&" ...
>> "and" ...
>> "||" ...
>> "or" ...
>> "*" ...
>> "+" ...
>> "-" ...
>> "?" ...
>> "/" ...
>> "div" ...
>> "%" ...
>> "mod" ...
>> <FUNCTIONSUFFIX> ...
>> "(" ...
>> javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
>> com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:73)
>>
>> com.sun.enterprise.web.VirtualServerPipeline.invoke(VirtualServerPipeline.java:120)
>>
>>
>> org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:231)
>>
>> com.sun.enterprise.web.connector.grizzly.ProcessorTask.invokeAdapter(ProcessorTask.java:602)
>>
>>
>> com.sun.enterprise.web.connector.grizzly.ProcessorTask.processNonBlocked(ProcessorTask.java:542)
>>
>>
>> com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:762)
>>
>>
>> com.sun.enterprise.web.connector.grizzly.ReadTask.executeProcessorTask(ReadTask.java:322)
>>
>>
>> com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:247)
>>
>>
>> com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:201)
>>
>>
>> com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:252)
>>
>> com.sun.enterprise.web.connector.grizzly.WorkerThreadImpl.run(WorkerThreadImpl.java:103)
>>
>>
>>
>> Ken Paulsen wrote:
>>
>>>
>>> Hi...
>>>
>>> To reference a ResourceBundle key, this can be done using JSF EL
>>> (i.e. #{resourceBundleName, resourceKey}). I also provide a
>>> $resouce{resouceBundleName.resourceBundleKey} syntax which does the
>>> same thing (actually it provides better error messages, is more
>>> explicit, and works more easily w/ key's containing '.' characters
>>> -- but for now I'll focus on the #{} syntax). The problem is that
>>> while you can refer to keys in a RB that already exists, you need to
>>> ensure that bundle exists... which until now I didn't provide a way
>>> to load the bundle into the request scope.
>>>
>>> Here's how to load the bundle into the request scope:
>>>
>>> <!beforeEncode
>>> setResourceBundle(key="resource" bundle="full.path.to.Bundle");
>>> />
>>> ...
>>> "Some string which refers to: #{resource.key}
>>>
>>> You should do this in a beforeEncode as it must happen each request
>>> (beforeCreate will only happen on the first request). This event
>>> should happen under the 1st element in the page (for now). This is
>>> because this type of event doesn't get fired if it is nested deep in
>>> the UIComponent tree. If you don't want to do it there, you can
>>> wrap it in an "event" component and put it anywhere before you use it:
>>>
>>> <event>
>>> <!beforeEncode
>>> setResourceBundle(key="foo" bundle="a.b.c.Resouces")
>>> />
>>> </event>
>>>
>>> That's it...
>>>
>>> If you want to know the alternate syntax, read on.... The
>>> $resource{bundle.key} syntax is faster, provides better error
>>> detection, better error messages, etc. The down side is that it
>>> does not perform "deferred" evaluation. This means that it only
>>> gets evaluated 1 time if you set it on a UIComponent property. It
>>> also means that you will likely need to use a "beforeCreate" instead
>>> of "beforeEncode" (depending on where you're using the expression).
>>> The setResourceBundle{} command is the same.
>>>
>>> I'll be looking at ways to improve this area, I may provide a new
>>> event type which executes in the "beforeCreate" time-frame but
>>> executes every request... this would be more appropriate for this
>>> initialization-type code and would make the 2 syntaxes more
>>> interchangeable.
>>>
>>> Let me know if you have problems...
>>>
>>> Ken
>>