struts-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Burton Rhodes <burtonrho...@gmail.com>
Subject Re: Extending StrutsTypeConverter :: How to detect specific type of "Class toClass"?
Date Sun, 01 Oct 2017 18:37:35 GMT
Got it.  I'll use that for now.  Don't you think that is a bit of a hack?
Do you think this be fixed or reported as a "bug"?

On Sun, Oct 1, 2017 at 7:54 AM, Yasser Zamani <yasser.zamani@live.com>
wrote:

> Hello Burton,
>
> Thank you; I examined your example and found out this behavior is
> because of something in Struts named "automatic checkbox detection",
> CheckboxInterceptor.
>
> When your `choices` count is bigger than 1, you'll see your desired
> behavior because CheckboxInterceptor does nothing with following message
> where value.isMultiple() is true:
>
> ```java
> if(value.isMultiple()) {
>      LOG.debug("Bypassing automatic checkbox detection due to multiple
> checkboxes of the same name: {}", name);
> } else if(!parameters.contains(checkboxName)) {
>      extraParams.put(checkboxName, new Request(checkboxName,
> this.uncheckedValue));
> }
> ```
>
> But what happens when your `choices` count is one and you don't click on
> that one (your current example): Actually W3C says unchecked checkbox
> wont be posted, so, the above else will be executed (because
> !parameters.contains(checkboxName) is true) and CheckboxInterceptor sets
> a new parameter, "itemsFail->false". Then OGNL cannot convert `false` to
> an array of Integer into your action, so, the result will be changed to
> `input`.
>
> I searched how to also post unchecked check boxes and found out that
> following makes your example working:
> ```jsp
> <s:iterator var="choice" value="%{choices}">
>      <s:hidden value='0' name='itemsFail'/><!-- I added this; a default -->
>      <s:checkbox name="itemsFail" fieldValue="%{choice}"
> value="%{isItemsFailSelected(#choice)}"/> <s:property value="%{#choice}"/>
> </s:iterator>
> ```
>
> Hope these help!
> Yasser.
>
> On 10/1/2017 6:57 AM, Burton Rhodes wrote:
> > Well shoot - after further testing it seems the issue is still present.
> I
> > isolated the issue in a simple mvn webapp (see link below).  Essentially
> > Struts conversion fails when: 1) setting form input element to a
> > List<Integer>, 2) there is only one checkbox in the list, 3) the checkbox
> > is not checked when the form is submitted.  The situation arises for me
> > when I need to display a list of checkboxes, but I can't use
> > <s:checkboxlist/> tag because the page requires a more advanced html
> > layout.  Thus I am forced to display the checkbox list using an
> > <s:iterator/> and the <s:checkbox/> tag.  If the displayed list so
> happens
> > to have only one element, and the user doesn't check it, the conversion
> > fails.
> >
> > I am using now Struts Version 2.5.13.
> >
> > *Test Struts Webb App*
> > *Download*: https://www.dropbox.com/s/x27o9a8qky9nwta/listTest.zip?dl=0
> > *Action*: mvn jetty:run
> > *Url*: http://localhost:8080/ListConverterTest.action
> >
> > On Fri, Sep 29, 2017 at 10:56 AM, Burton Rhodes <burtonrhodes@gmail.com>
> > wrote:
> >
> >> Sorry for the delay.  I have upgraded to the newest version and
> everything
> >> seems to be working.  Thanks!
> >>
> >> On Mon, Sep 25, 2017 at 2:34 AM, Lukasz Lenart <lukaszlenart@apache.org
> >
> >> wrote:
> >>
> >>> 2017-09-25 5:04 GMT+02:00 Burton Rhodes <burtonrhodes@gmail.com>:
> >>>> When extending the StrutsTypeConverter, is there anyway to figure out
> if
> >>>> the "toClass" is a List<Integer> or a List<String>?  I have
found that
> >>> when
> >>>> converting data from a submitted webpage that has a value of a List
> in a
> >>>> single variable, the standard struts conversion fails.  For example:
> >>>> <s:hidden name="integerList" value="%{integerList}" /> display
as
> >>> <s:hidden
> >>>> name="integerList" value="[1,2,3,4,5]" />.  When the form submits,
> this
> >>>> value will not convert properly back into the List.  In addition, the
> >>>> conversion fails if you have a list of checkboxes and the user only
> >>> checks
> >>>> one -  hence only a single variable being converted to a List.
> >>>>
> >>>> I have solved this issue by creating a MyListConverter, but I have to
> >>>> declare the converter on each action in a [-conversion.properties]
> file
> >>>> which is now becoming a bit cumbersome since this is such a common
> >>>> occurrence. I have also declared some on my model/entity beans, but
> >>>> still.... I would love to have a more global "List" converter, such
> as:
> >>>>
> >>>> [xwork-conversion.properties]
> >>>> java.util.List=com.afs.web.converter.MyListConverter
> >>>>
> >>>> Thus any List that is encountered, I could attempt "my conversion" and
> >>> send
> >>>> up the chain of command if the resulting List is not of List<Integer>
> or
> >>>> List<String>.
> >>>>
> >>>> [Psuedo_Code]
> >>>> public class MyListConverter extends StrutsTypeConverter {
> >>>>      public Object convertFromString(Map context, String[] values,
> Class
> >>>> toClass) {
> >>>>          // Is toClass List<Integer>, then try "my" conversion
> >>>>
> >>>>          // Else is toClass List<String?, then try "my" conversion
> >>>>
> >>>>          // Else return performFallbackConversion(context, o,
> toClass);
> >>>>      }
> >>>> }
> >>>>
> >>>> Any ideas?  Or am I going about this incorrectly?
> >>>
> >>> What version of Struts do you use? I think this was resolved in 2.5.13
> >>> or 2.5.12 - I meant conversion of list of built-in types (ints,
> >>> doubles, etc), to convert your own type just register it (as for the
> >>> List above).
> >>>
> >>>
> >>> Regards
> >>> --
> >>> Ɓukasz
> >>> + 48 606 323 122 http://www.lenart.org.pl/
> >>>
> >>> ---------------------------------------------------------------------
> >>> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> >>> For additional commands, e-mail: user-help@struts.apache.org
> >>>
> >>>
> >>
> >
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message