Java - html:errors

 
Vista:

html:errors

Publicado por mercedes (125 intervenciones) el 13/06/2007 09:39:18
Buenos días

Necesito una sugerencia de cómo hacer para ponerle estilo a los html:errors sin tener que ponerlo en cada una de las etiquetas con el tag <style>. Es que con css no sé cómo hacerlo porque html:errors no soporta los tld 'id' ni 'class'.
¿Alguna sugerencia?

También quisiera hacer que me saliese recuadrado el campo del formulario donde está el error. ¿Cómo se puede hacer eso? Pues lo he intentado, pero no lo he conseguido, pues si lo pongo en la hoja de estilo me sale recuadrado desde el principio.

Gracias.

Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:html:errors

Publicado por Gonzalo (180 intervenciones) el 13/06/2007 12:33:00
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>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:html:errors

Publicado por Mercedes (125 intervenciones) el 13/06/2007 13:28:45
Mmm.. Por partes:

Ahora estoy con los errores para campos concretos, y lo hago como tu dices:

errors.add( "usuario", new ActionError("error.username.required") );

Pero lo que yo quiero es que cuando se produzca ese error me aparezca el error al lado del formulario (esto ya me funcionaba) pero quiero que el campo asociado aparezca recuadrado en rojo. Y eso es lo que no sé cómo hacer.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:html:errors

Publicado por Gonzalo (180 intervenciones) el 13/06/2007 14:49:00
Aaaah... Bien, bien, no lo había entendido. Lo que quieres es que cuando haya un error, el propio campo del formulario salga con un aspecto diferente, ¿no?

Esto es más fácil. Desde la versión 1.2.5 tienes una propiedad en los campos que se llama errorStyleClass que lo que hace es usar ese valor para el atributo class en lugar del habitual, cuando hay un error asociado.

Lo tienen todas las etiquetas de campos de formulario.

Es decir...
<html:text ... styleClass="campo_normal" errorStyleClass="campo_error" ... />
genera normalmente un
<input ... class="campo_normal" ... />
pero en caso de error genera un
<input ... class="campo_error" ... />
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:html:errors

Publicado por Mercedes (125 intervenciones) el 13/06/2007 17:43:37
Otra cosa:

El problema viene por la internacionalización. Voy a intentar explicarme lo mejor posible xD.

Es el caso de logearse. Si el usuario no introduce alguno de los 2 campos (login, password), el form lo detecta y a través de html:errors se ve en la jsp.

Ahora, el problema es que se accede a una base de datos, para comprobar si en efecto el usuario se ha registrado. Esto se hace cómo es lógico en el action. El problema es que si el usuario no se ha registrado en el action tengo lo siguiente:

StringBuffer mensaje = new StringBuffer();
mensaje.append("El usuario o contraseña introducida es incorrecto.");
formulario.setMensajeError(mensaje.toString());

Por otro lado, en la jsp tengo lo siguiente:

<logic:notEmpty property="mensajeError" name="registroForm">
<b><bean:write name="registroForm" property="mensajeError" /></b>
</logic:notEmpty>

Lo que te quería preguntar es como puedo reflejar los errores de forma que pueda internacionalizarlos.

No se si me has entendido, pero resumiendo es que en mi action no puedo utilizar ningún <bean> para así poder internacionarlizarlos.

En el post anterior es que no me queda muy claro lo de html:messages y si me podría solucionar lo que quiero.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:html:errors

Publicado por Gonzalo (180 intervenciones) el 13/06/2007 19:41:22
Bueno, definitivamente los ActionError están internacionalizados. De hecho cuando ponía lo de:

errors.add( "usuario", new ActionError("error.username.required") )

error.username.required es la referencia a la entrada en tu fichero properties. Los ficheros properties en Struts tienen automatizada la selección según el idioma. Es tan sencillo como que si tu fichero de properties por defecto es miaplicacion.properties, Struts buscará automáticamente miaplicacion_es.properties o miaplicacion_fr.properties o miaplicacion_it.properties según el idioma del usuario... sin que tú tengas que hacer nada (bueno, sí, crear esos ficheros, claro).

Y realmente esa es muy buena idea. Nunca meter directamente cadenas como la que dices de "El usuario o contraseña introducida es incorrecto." sino que lo pones eso en tu fichero properties con, p.ej.:

error.login.fallido=El usuario o contraseña introducida es incorrecto.

En cualquier sitio que quieras sacar ese mensaje, simplemente usas la referencia error.login.fallido ( no sólo para errores, también por ejemplo en <bean:message key="label.nombre.usuario" /> ) y así:
- si tienes que corregir la ortografía o cualquier cosa así, sólo lo haces en 1 sitio
- si tienes que traducirlo a otros idiomas, es suficiente traducir el (o los) ficheros de properties y no tienes que tocar el código para nada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:html:errors

Publicado por Mercedes (125 intervenciones) el 13/06/2007 20:06:24
Si todo eso ya lo tenía, lo que pasa es que me lié yo sola, porque creía que en el action al devolver los forward, no podía utilizar los errors, y lo que pasaba es que en lugar de poner return errors, debía poner save(request, errors).

No sé si me has entendido.

De todas formas, ya está solucionado, pero gracias de todas maneras.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:html:errors

Publicado por idem_1401 (1 intervención) el 04/08/2008 10:48:28
quiero que varios campos cambien de color con el StyleErrorsClass cuando estan implicados en un errror, como puedo hacerlo

gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:html:errors

Publicado por phaseolus (1 intervención) el 03/03/2009 16:41:38
Hola.
me queda sólo una cosa que no he podido resolver.
Resulta que en una aplicación que estoy haciendo, los mensajes vienen desde la base de datos (PL) y debo mostrarlos de la misma forma que muestro los mensajes que tengo definidos en el properties.

He intentado algo así:

String mensajePl = "Este mensaje lo genera el PL";

ActionErrors errores = new ActionErrors();
errores.add("user", new ActionMessage("errors.user"));

errores.add("error", new ActionMessage( mensajePl ) ); //da error

Pero obviamente esta ultima línea da error al no encontrar la clave en el properties.

Si me pudieran indicar cómo hacerlo, sería genial.

Gracias de antemano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar