The issue seems to be that OGNL's expression parsing does different things at different times.
>>>>> <s:text name="/jsp/%{#parameters.file}" /> >>>>> >>>>> prints out "/jsp/test.jsp", whereas >>>>> >>>>> <s:set name="a" value="'/jsp/' + #parameters.file" /> > >>>>> prints out "/jsp/[Ljava.lang.String;@1bd2184", This is, perhaps, related to the thread from a week or two ago, the "Re: OGNL struts property" thread [1] where the OGNL expression's construction impacts type information. d. [1] http://www.nabble.com/OGNL-struts-property-tf4770568.html#a13664415 --- Gary Affonso <[EMAIL PROTECTED]> wrote: > Looks to me like the return value of parameters.file > is *not* a String. > It's a an *array* of strings. And a toString() on > an Array of strings > looks exactly like what you're seeing: > > [Ljava.lang.String;... > > (the prefixed "[" is the clue that it's a string > *array*). > > If the "file" parameter has only 1 element (as it > sounds like you're > assuming) then you want element 0 of that array, so > I think you want > something like this... > > value="%{'/jsp/'+#parameters.file[0]}" > > - Gary > > Anton Pussep wrote: > > First of all thanks a lot for the good and well > structured reply. I tried > > > > <s:set name="a" > value="%{'/jsp/'+#parameters.file.toString()}" /> > > > > but the result is still the same. I also wrote an > own static method that > > prints out the result and it is also > "/jsp/[Ljava.lang.String;@1bd2184". > > However, a static concatenation method will most > probably work, but I > > hope it is not the only way to do it. > > > > In JIRA I only found a three year old issue asking > for the concatenation > > via "+" in the property tag. I cannot imagine > String concatenation not > > being supported. I am going to create a JIRA issue > for that tomorrow, > > unless someone can tell me another way than using > a static concatenation > > method. > > > > Best, > > Anton > > > > Jeromy Evans wrote: > >> I don't have the full solution, but lets think > about this for a moment > >> instead of using trial-and-error... > >> > >> By default, every struts2 tag either expects the > attribute to be a > >> string literal, an OGNL expression evaluated as a > string or an OGNL > >> expression evaluated as an object. We don't > really know which without > >> checking the docs or code, but as we're > performing an operation we can > >> take the safe path state that we're using an OGNL > expression. > >> > >> <s:set name="a" value="%{insert_expression}" /> > >> > >> Now that we know we're using an expression we > discount all the attempts > >> that aren't valid OGNL and write some OGNL to > concatenate a string > >> > >> <s:set name="a" > value="%{'/jsp/'+#parameters.file}" /> > >> > >> ie. a string literal concatenated to the root > object parameters' member > >> named file > >> > >> You said you tried this and got: > >> > >> "/jsp/[Ljava.lang.String;@1bd2184" > >> > >> The concatenation has worked, but it evaluated > #parameters.file as an > >> object reference rather than a string. Now > you've isolated the problem > >> to this sub-expression. That sucks, so now think > of a way to instruct it > >> that we want to value to be evaluated as a > string. > >> > >> Does <s:set name="a" value="%{#parameters.file}" > /> work? It should, so > >> the problem is specific to the concatenation > operation. > >> > >> Maybe we need to force evaluation of a string > prior to concatenation > >> (haven't tried this:) > >> > >> <s:set name="a" > value="%{'/jsp/'+#parameters.file.toString()}" /> > >> > >> ie. call toString() prior to concatentation. One > of two things will > >> happen: it will work because the result is > strongly-type as a string, or > >> it will concatenate another reference to a string > object > >> > >> If that doesn't work, at this stage I'd search > JIRA for a known problem > >> and resort to something more reliable like > calling a static method > >> > >> <s:set name="a" > value="[EMAIL PROTECTED]@concatenate('/jsp/', > >> #parameters.file)}" /> > >> > >> Hope that helps, > >> Jeromy Evans > >> > >> PS: s:text evaluates the name attribute as a > string,whereas s:set > >> evaluates the value attribute as an object. This > accounts for the > >> different behaviour. I find this inconsistency > between tags is one of > >> the most frustrating aspects of how OGNL is used > by struts2. > >> > >> Anton Pussep wrote: > >>> Results in the same as > >>> > >>> <s:set name="a" value="'/jsp/'#parameters.file" > /> > >>> > >>> which means that a remains unset. > >>> > >>> Same for: > >>> > >>> <s:set name="a" value="/jsp/%{#parameters.file}" > /> > >>> <s:set name="a" > value="'/jsp/'%{#parameters.file}" /> > >>> <s:set name="a" value="%{/jsp/#parameters.file}" > /> > >>> <s:set name="a" > value="%{'/jsp/'#parameters.file}" /> > >>> > >>> Best, > >>> Anton > >>> > >>> Saul Qunming Yuan wrote: > >>> > >>>> Hi > >>>> > >>>> You may want to try the following to set > variable "a": > >>>> > >>>> <s:set name="a"> > >>>> <s:text name="/jsp/%{#parameters.file}" /> > >>>> </s:set> > >>>> > >>>> just a thought. > >>>> > >>>> Saul > >>>> > >>>> Anton Pussep wrote: > >>>> > >>>>> Hello, > >>>>> > >>>>> I am trying to concatenate strings in tag > attributes and get results > >>>>> that I don't understand: > >>>>> > >>>>> <s:text name="/jsp/%{#parameters.file}" /> > >>>>> > >>>>> prints out "/jsp/test.jsp", whereas > >>>>> > >>>>> <s:set name="a" value="'/jsp/' + > #parameters.file" /> > >>>>> <s:text name="#a" /> > >>>>> > >>>>> prints out "/jsp/[Ljava.lang.String;@1bd2184", > same for > >>>>> > >>>>> <s:set name="a" value="%{'/jsp/' + > #parameters.file}" /> > >>>>> > >>>>> whereas the following does not work: > >>>>> > >>>>> <s:set name="a" > value="'/jsp/'#parameters.file" /> > >>>>> > >>>>> What is the way to concatenate strings in the > set tag and why > >>>>> doesn't it > >>>>> work the same way as it does in the text tag? > >>>>> > === message truncated === --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]