[jsr-314-open] h:outputScript doesn't work inside composite components
David Geary
clarity.training at GMAIL.COM
Mon May 11 14:04:13 EDT 2009
2009/5/11 Jim Driscoll <Jim.Driscoll at sun.com>
> On 5/11/09 9:30 AM, David Geary wrote:
>
>> 2009/5/11 Ryan Lubke <Ryan.Lubke at sun.com <mailto:Ryan.Lubke at sun.com>>
>>
>>
>> On 5/11/09 7:40 AM, David Geary wrote:
>>
>> I have a login composite component that looks like this:
>>
>> <composite:interface>...</composite:interface>
>> ...
>> <composite:implementation>
>> <script type="text/javascript">
>> function checkForm(form) {
>> var name = form['#{cc.clientId}:name'].value;
>> var pwd = form['#{cc.clientId}:password'].value;
>>
>> if (name == "" || pwd == "") {
>> alert("Please enter name and password.");
>> return false;
>> }
>> return true;
>> }
>> </script>
>> ...
>> </composite:implementation>
>>
>> I have components with "name" and "password" component ids in a
>> form in the ... part of the implementation. That works fine.
>>
>> However, if I pull the JS out into its own file, and do this:
>>
>> <composite:interface>...</composite:interface>
>> ...
>> <composite:implementation>
>> <h:outputScript library="components/login" name="login.js"/>
>> ...
>> </composite:implementation>
>>
>> h:outputScript puts the JS in the page, but the JS no longer
>> works because the expression cc.clientId evaluates to an empty
>> string.
>>
>> That's a bug, is it not?
>>
>> No, I don't believe it is. The javascript file will be served in a
>> separate request. There is no way to determine the
>> component at that time.
>>
>>
>> That's what I figured, but that's not going to be obvious to the average
>> developer. This is a pretty serious violation of the principle of least
>> astonishment, and JSF has enough of those violations, IMO.
>>
>> If there's no way to make it work, it should be documented, preferably
>> in the pdl (or is it vdl now?) docs that h:outputScript will not work
>> when the corresponding JS references a composite component.
>>
>>
> I agree that we should document how to do this: Which is why I wrote a
> demo that does this (basic-ezcomp/spinner-final) - and blogged about it
> http://weblogs.java.net/blog/driscoll/archive/2008/11/jsf_20_writing.html
>
> The problem is not solvable the way that you think it is: I struggled with
> this too, until Ryan walked me through it. The problem is one of the web,
> not one of the JSF, exactly.
>
> So, look at it this way: The JavaScript file is served ONCE, from ONE
> known address. This is good - it allows us to cache the javascript file.
> This is bad - because we do the # variable substitution *before* we serve
> the file, we can't do #{cc} substitutions in it, that file could (and will)
> be shared across views - and even across different websurfing sessions,
> after all, that's the whole point of the resource mechanism... Efficient
> use of caching for resources.
>
> So, how to address this? One way is in the demo - just set the cc.clientId
> as a context, and use that context in the function calls.
> In a different demo (ajax-switchlist) I save that context into state, and
> use that in each call. Either way works, and both require about four lines
> of (javascript) code.
>
> If you make it so that we make those substitutions into the javascript
> file, then you also need to output that javascript file with a view unique
> name. And that's probably a bad idea for most uses, since that shoots
> caching in the head. We could add a "perview" attribute to each resource, I
> guess, but since the workaround is so easy, once you know it, and the cost
> is the loss of caching, I'd argue this isn't a good idea.
>
> I urge you to run through the demos I wrote (basic-ajax, basic-ezcomp,
> basic-ajax-edittext, ajax-switchlist) - they're all small, and in each of
> them, I try to tackle one small problem and solve it. In many of them, I
> ran into problems just like this, and worked through them. They're not
> documented (except in blogs), but they are all small pieces of code.
Okay, I'll do that. Thanks for the insights--I hadn't stopped to think about
caching.
david
>
>
> Jim
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jsr-314-open-mirror/attachments/20090511/97884301/attachment.html
More information about the jsr-314-open-mirror
mailing list