Hey, you are correct.

Just dove into the code and I found that is uses a MakeIterator utility
class that if given a Map will call entrySet().


Maybe a commiter will be kind enough update the iterator tag doc to include
a Map example and a note on how Map is converted to an Iterator.




2009/10/27 Paweł Wielgus <poulw...@gmail.com>

> Hi Greg,
> i was about writing that one should read iterator tag docs
> because one can use maps in s:iterator value,
> but instead i've just read it myself and the info about iterating maps
> is not there.
> I use s:iterator where value is a map and it works in 2.1.6
> just adding key or value inside iterator do the job.
>
> So i'm a little confused, is it ok or not to iterate over a map?
> Your example should also work like this:
>
> <s:iterator value="getFieldErrors()">
>    <s:iterator value="value">
>          Field Name = <s:property value="key"/>
>           Message = <s:property value="%{top}"/><br>
>    </s:iterator>
> </s:iterator>
>
> Best greetings,
> Paweł Wielgus.
>
>
> 2009/10/27 Greg Lindholm <greg.lindh...@gmail.com>:
> > So, fieldErrors is a Map<String, List<String>>, the key is the field name
> > and the value is a List<String> of messages.
> >
> > I don't think you can use <s:iterator value="fieldErrors"> directly on a
> Map
> > as a Map is not iteratable (check the iterator tag doc [1]).
> >
> > I think you will need to iterate on either the entry set <s:iterator
> > value="getFieldErrors().entrySet()"> or the key set <s:iterator
> > value="getFieldErrors().keySet()">.
> >
> > As for %{top}, this gives you the top object on the value stack which
> inside
> > the <s:iterator > tag is the current object in the iteration, this is
> just
> > short-hand instead of using the var= attribute.
> >
> > You could try something like this
> >
> > <s:iterator value="getFieldErrors().entrySet()" var="entry">
> >     <s:iterator value="#entry.value">
> >           Field Name = <s:property value="#entry.key"/>
> >           Message = <s:property value="%{top}"/><br>
> >     </s:iterator>
> > </s:iterator>
> >
> > [1] http://struts.apache.org/2.x/docs/iterator.html
> >
> > On Tue, Oct 27, 2009 at 4:59 AM, carl ballantyne <
> > carl.ballant...@cast-info.es> wrote:
> >
> >> Okay that makes sense. Thanks for that!
> >>
> >> But your example used a hardcoded fieldname. In order to dynamically
> loop
> >> the fieldnames and display the errors for each of those fields I have
> tried:
> >>
> >> <s:iterator value="fieldErrors" var="fieldNameErrors">
> >>
> >>        <s:iterator value="%{fieldNameErrors}" var="fieldError">
> >>
> >>        ERROR1:<s:property value="%{top}"/><br>
> >>        ERROR2 <s:property value="#fieldError"/><br>
> >>        </s:iterator>
> >> </s:iterator>
> >>
> >> But it always outputs the whole list, ie firstname=[You must enter a
> >> firstname1., You must enter a firstname2] and not
> >> You must enter a firstname1
> >> You must enter a firstname2.
> >>
> >> %{fieldNameErrors} is being passed as an object to the second iterator
> and
> >> it is a List. I am a little confused by the whole #fieldNameErrors,
> >> %{fieldNameErros} syntax. And where is %{top} coming from? I don't see
> >> anything in the doc for the tag -
> >> http://struts.apache.org/2.1.8/docs/iterator.html.
> >>
> >> Cheers,
> >> Carl.
> >>
> >>
> >>
> >>
> >>
> >>
> >> Quoting Greg Lindholm <greg.lindh...@gmail.com>:
> >>
> >>  There are three buckets for error messages; general errors, general
> >>> messages
> >>> and field errors.
> >>> <s:actionerror /> and <s:actionmessage /> display the general errors
> and
> >>> general messages.
> >>> Most validation will product field errors which by default get rendered
> >>> beside the field with the error.
> >>>
> >>> You can control how field errors get displayed which is common if you
> use
> >>> the Simple Theme.
> >>>
> >>> Here is a snippet for manually displaying field errors for field 'name'
> in
> >>> this case:
> >>>
> >>> <s:iterator value="fieldErrors['name']">
> >>> <tr><td></td><td><span class="errorMessage"><s:property
> >>> value="%{top}"/></span></td></tr>
> >>> </s:iterator>
> >>>
> >>> The object fieldErrors (Map<String, List<String>>) is provided by
> >>> ActionSupport [1] via ValidationAwareSupport [2], the key is the field
> >>> name.
> >>>
> >>> [1]
> >>>
> >>>
> http://struts.apache.org/2.x/struts2-core/apidocs/com/opensymphony/xwork2/ActionSupport.html
> >>> [2]
> >>>
> >>>
> http://struts.apache.org/2.x/struts2-core/apidocs/com/opensymphony/xwork2/ValidationAwareSupport.html
> >>>
> >>>
> >>> On Mon, Oct 26, 2009 at 10:57 AM, carl ballantyne <
> >>> carl.ballant...@cast-info.es> wrote:
> >>>
> >>>  Hi Everyone,
> >>>>
> >>>> I am new to Struts 2 and trying to make the switch from Struts 1.
> >>>>
> >>>> I cannot figure out how to get the validation to display the
> >>>> messages/errors in the input form with the use of the s:actionerror or
> >>>> s:actionmessage tags. It never outputs anything despite the validation
> >>>> appearing to work.
> >>>>
> >>>> I have searched and searched and cannot find an example of this
> anywhere.
> >>>> I
> >>>> simple want the user to be directed back to the form if there are
> errors
> >>>> and
> >>>> display all errors at the top of the form.
> >>>>
> >>>> What I have below is displaying field specific error message beside
> the
> >>>> field in the form with struts 2 tags ... which is not what I need.
> >>>>
> >>>> I am using Struts 2.1.8.
> >>>>
> >>>> I have the following in my jsp.
> >>>>
> >>>> errors
> >>>> <s:actionerror />
> >>>>
> >>>> messages
> >>>> <s:actionmessage />
> >>>>
> >>>> <h2>Form with Struts 2 tags.</h2>
> >>>> <s:form action="simpleAction" validate="true">
> >>>>       <s:textfield label="firstname" name="firstname"></s:textfield>
> >>>>       <s:submit label="Save" name="Save"></s:submit>
> >>>> </s:form>
> >>>>
> >>>>
> >>>> <h2>Form without Struts 2 tags.</h2>
> >>>> <form action="<s:url action="simpleAction"/>" method="post">
> >>>>       <input type="text" name="firstname"><br>
> >>>>       <input type="submit" value="Save"/>
> >>>> </form>
> >>>>
> >>>> And my action class:
> >>>>
> >>>> public class SimpleAction extends ActionSupport {
> >>>>       static Logger logger = Logger.getLogger(SimpleAction.class);
> >>>>
> >>>>       private String firstname;
> >>>>
> >>>>       public String getFirstname() {
> >>>>               return this.firstname;
> >>>>       }
> >>>>       public void setFirstname(String firstname) {
> >>>>               this.firstname = firstname;
> >>>>       }
> >>>>
> >>>>       public String execute() throws Exception {
> >>>>
> >>>>               logger.debug("execute SimpleAction");
> >>>>               return SUCCESS;
> >>>>       }
> >>>>
> >>>> }
> >>>>
> >>>>
> >>>> And my struts.xml
> >>>>
> >>>> <action name="simpleAction" class="com.myapp.action.SimpleAction">
> >>>>  <result name="success">/WEB-INF/jsp/simpleActionSuccess.jsp</result>
> >>>>  <result name="input">/WEB-INF/jsp/simpleActionForm.jsp</result>
> >>>> </action>
> >>>>
> >>>>
> >>>> And my SimpleAction-validation.xml which is in the same directory as
> the
> >>>> action class.
> >>>>
> >>>> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
> >>>> 1.0.2//EN"
> >>>>      "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd";>
> >>>> <validators>
> >>>>  <field name="firstname">
> >>>>       <field-validator type="requiredstring">
> >>>>       <message>You must enter a firstname</message>
> >>>>   </field-validator>
> >>>>  </field>
> >>>> </validators>
> >>>>
> >>>>
> >>>> Cheers,
> >>>> Carl.
> >>>>
> >>>>
> >>>>
> >>>> ---------------------------------------------------------------------
> >>>> To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
> >>>> For additional commands, e-mail: user-h...@struts.apache.org
> >>>>
> >>>>
> >>>>
> >>>
> >>
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
> >> For additional commands, e-mail: user-h...@struts.apache.org
> >>
> >>
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
> For additional commands, e-mail: user-h...@struts.apache.org
>
>

Reply via email to