You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Davide Vecchi <dv...@amc.dk> on 2013/10/18 11:28:48 UTC

Cannot pass string containing spaces into component event.

In a Tapestry-generated web page I have some Javascript like this:

                var arg = 'StringWithoutSpaces'; // Works only if no spaces in this string.

                var sLink = '/mypage.mycomponent:myevent/' + encodeURIComponent(arg);

                alert(sLink); // Just for debug.

                location.href = sLink;

This works as I expected, that is in the Java class of the component the method

                onMyEvent(String arg)

gets called and it receives the value "StringWithoutSpaces" in arg.

The problem is that if the argument contains spaces (ASCII 32), for ex.

                var arg = 'String With Spaces';

then I get the below exception.

I don't understand why, because from the Javascript alert box I can see that the spaces were correctly encoded into %20, so when the browser executes the Javascript statement

                location.href = sLink;

the variable sLink has a value without any actual space:

/mypage.mycomponent:myevent/String%20With%20Spaces

So I'm wondering what is the right way to pass spaces - and possibly other characters that might have the same problem as the space. I thought a right way was to escape them with encodeURIComponent() in the Javascript that makes the call, but it looks like it's not right.

The exception is:

java.lang.IllegalArgumentException
Input string 'String With Spaces' is not valid; the character ' ' at position 7 is not valid.

Stack trace
org.apache.tapestry5.internal.services.URLEncoderImpl.decode(URLEncoderImpl.java:144)
org.apache.tapestry5.internal.services.ContextPathEncoderImpl.decodePath(ContextPathEncoderImpl.java:92)
org.apache.tapestry5.internal.services.ComponentEventLinkEncoderImpl.validateAndConstructComponentEventRequest(ComponentEventLinkEncoderImpl.java:377)
org.apache.tapestry5.internal.services.ComponentEventLinkEncoderImpl.decodeComponentEventRequest(ComponentEventLinkEncoderImpl.java:329)
org.apache.tapestry5.internal.services.linktransform.LinkTransformerInterceptor.decodeComponentEventRequest(LinkTransformerInterceptor.java:58)
org.apache.tapestry5.internal.services.ComponentEventDispatcher.dispatch(ComponentEventDispatcher.java:42)
org.apache.tapestry5.services.TapestryModule$RequestHandlerTerminator.service(TapestryModule.java:302)
org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:26)
org.apache.tapestry5.services.TapestryModule$3.service(TapestryModule.java:902)
org.apache.tapestry5.services.TapestryModule$2.service(TapestryModule.java:892)
org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:90)
...
...


Re: Cannot pass string containing spaces into component event.

Posted by Thiago H de Paula Figueiredo <th...@gmail.com>.
Instead of using the event context, use a query parameter, so you don't  
need to replicate in JS the logic in URLEncoder(Impl), which is *not* the  
same as regular URL encoding.

On Fri, 18 Oct 2013 06:28:48 -0300, Davide Vecchi <dv...@amc.dk> wrote:

> In a Tapestry-generated web page I have some Javascript like this:
>
>                 var arg = 'StringWithoutSpaces'; // Works only if no  
> spaces in this string.
>
>                 var sLink = '/mypage.mycomponent:myevent/' +  
> encodeURIComponent(arg);
>
>                 alert(sLink); // Just for debug.
>
>                 location.href = sLink;
>
> This works as I expected, that is in the Java class of the component the  
> method
>
>                 onMyEvent(String arg)
>
> gets called and it receives the value "StringWithoutSpaces" in arg.
>
> The problem is that if the argument contains spaces (ASCII 32), for ex.
>
>                 var arg = 'String With Spaces';
>
> then I get the below exception.
>
> I don't understand why, because from the Javascript alert box I can see  
> that the spaces were correctly encoded into %20, so when the browser  
> executes the Javascript statement
>
>                 location.href = sLink;
>
> the variable sLink has a value without any actual space:
>
> /mypage.mycomponent:myevent/String%20With%20Spaces
>
> So I'm wondering what is the right way to pass spaces - and possibly  
> other characters that might have the same problem as the space. I  
> thought a right way was to escape them with encodeURIComponent() in the  
> Javascript that makes the call, but it looks like it's not right.
>
> The exception is:
>
> java.lang.IllegalArgumentException
> Input string 'String With Spaces' is not valid; the character ' ' at  
> position 7 is not valid.
>
> Stack trace
> org.apache.tapestry5.internal.services.URLEncoderImpl.decode(URLEncoderImpl.java:144)
> org.apache.tapestry5.internal.services.ContextPathEncoderImpl.decodePath(ContextPathEncoderImpl.java:92)
> org.apache.tapestry5.internal.services.ComponentEventLinkEncoderImpl.validateAndConstructComponentEventRequest(ComponentEventLinkEncoderImpl.java:377)
> org.apache.tapestry5.internal.services.ComponentEventLinkEncoderImpl.decodeComponentEventRequest(ComponentEventLinkEncoderImpl.java:329)
> org.apache.tapestry5.internal.services.linktransform.LinkTransformerInterceptor.decodeComponentEventRequest(LinkTransformerInterceptor.java:58)
> org.apache.tapestry5.internal.services.ComponentEventDispatcher.dispatch(ComponentEventDispatcher.java:42)
> org.apache.tapestry5.services.TapestryModule$RequestHandlerTerminator.service(TapestryModule.java:302)
> org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:26)
> org.apache.tapestry5.services.TapestryModule$3.service(TapestryModule.java:902)
> org.apache.tapestry5.services.TapestryModule$2.service(TapestryModule.java:892)
> org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:90)
> ...
> ...
>


-- 
Thiago H. de Paula Figueiredo
Tapestry, Java and Hibernate consultant and developer
http://machina.com.br

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org