Vamos por partes...
1. Dar cierto contenido a <html:errors />
Esto es relativamente fácil. Struts detecta si tienes definidas ciertas propiedades en alguno de tus ficheros de recursos de la aplicación y las usa. Esas propiedades son (con un ejemplo de lo que podrían valer):
errors.header=<ul id="errores">
errors.footer</ul>
errors.prefix=<li>
errors.suffix=</li>
Con eso, básicamente tus errores aparecerían como:
<ul id="errores">
<li>Un error</li>
<li>Otro error</li>
<li>Otro más</li>
</ul>
Esto afecta a todos los sitios donde uses <html:errors />.
2. Usar <logic:messagesPresent>
messagesPresent es una etiqueta hecha específicamente para ayudar a sacar mensajes de aviso o de error.
Lo que hay dentro de <logic:messagesPresent> sólo sale si realmente hay mensajes presentes. ( http://struts.apache.org/1.x/struts-taglib/tlddoc/logic/messagesPresent.html )
Si quisieras sacar los mensajes de forma diferente en diferentes páginas, la forma de antes de las propiedades no te serviría, porque afecta a todo. Así que podrías hacer algo como esto en una página:
<logic:messagesPresent>
<ul id="errores">
<html:messages id="error">
<li><bean:write name="error"/></li>
</html:messages>
</ul>
</logic:messagesPresent>
Y algo como esto en otra:
<logic:messagesPresent>
<div id="errores">
<html:messages id="error">
<span class="error"><bean:write name="error"/></span>
</html:messages>
</div>
</logic:messagesPresent>
3. Usar errores para campos concretos.
Si quieres sacar mensajes de error junto al campo en el que se produce, el proceso es bastante simple. Lo único que debes hacer es, cuando guardes el error desde tu acción, asociarlo al campo. Es decir, tú normalmente haces:
errors.add( ActionMessages.GLOBAL_MESSAGE, new ActionError("error.username.required") );
Pues en lugar de guardarlo como un GLOBAL_MESSAGE, lo puedes asociar por ejemplo al campo "usuario":
errors.add( "usuario", new ActionError("error.username.required") );
O al campo "password":
errors.add( "password", new ActionError("error.password.required") );
De esta forma, puedes incluso agrupar diferentes tipos de errores. Imagina que quieres sacar:
a. errores asociados a campos concretos
b. errores en un recuadro rojo porque son graves
c. errores en un recuadro amarillo porque son menos graves pero quieres ponerlos de todos modos.
Pues podrías hacer esto. En tus acciones metes los errores como decía antes. Algunos los asocias a sus campos, otros los puedes asociar a ActionMessages.GLOBAL_MESSAGE o a un identificador "errores_graves" por ejemplo, y los otros a "errores_leves".
Luego en la vista JSP, puedes añadirle a <html:errors /> un atributo para sacar sólo los mensajes asociados a un determinado identificador. Por ejemplo:
<logic:present property="errores_graves">
<div id="errores_graves"><html:errors property="errores_graves" /></div>
</logic:messagesPresent>