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