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 <
[email protected]> 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 <[email protected]>:
>
> 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 <
>> [email protected]> 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: [email protected]
>>> For additional commands, e-mail: [email protected]
>>>
>>>
>>>
>>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>