Asociar propiedad de bean con abreviatura en página jsp

A ver cómo me explico. Estoy trabajando con Struts y quiero mostrar un histórico de operaciones. Uno de los datos a mostrar es el nombre de la empresa, pero quiero hacerlo de forma abreviada y con tooltip del nombre completo.
Mostrando el nombre completo (sin abreviatura ni tooltip) no tengo problema y lo hago así en la página jsp:
<logic:present name="listaOperaciones">
<logic:iterate id="operacion" name="listaOperaciones">
<tr align="center">
.......... Otros datos .......
<td width="13%" height="30">
<bean:write name="operacion" property="nombre"/>
</td>
........... Más datos ..........
.......... Ahora un último dato con abreviatura...............
<td width="7%" height="30">
<logic:equal name="operacion" property="riesgoOperacion" value="Alto">
<label title="Alto">A</label>
</logic:equal>
<logic:equal name="operacion" property="riesgoOperacion" value="Medio">
<label title="Medio">M</label>
</logic:equal>
<logic:equal name="operacion" property="riesgoOperacion" value="Bajo">
<label title="Bajo">B</label>
</logic:equal>
</td>
</tr>
</logic:iterate>
</logic:present>
"listaOperaciones" es una lista compuesta por objetos con varios campos con la información necesaria de cada operación. Uno de esos campos se llama "nombre", que almacena el nombre de la empresa. Otro campo se llama "riesgoOperacion", y almacena 3 valores posibles. Para esos valores muestro la abreviatura como he descrito, pero no puedo hacer lo mismo con las empresas porque son muchas opciones posibles. Tampoco quiero incluir en el objeto un campo con la abreviatura, porque lógicamente no me gusta. No tiene sentido como dato de operación. Esto no me lo planteo. ¿Cómo puedo hacerlo?
La idea es conseguir mostrar la abreviatura en vez del nombre completo, sin tenerla almacenada en el objeto porque esa opción no me gusta nada

1 Respuesta

Respuesta
1
¿A qué te refieres a hacerlo de forma abreviada?
Si te refieres a hacer algo como :
Microsoft Corporation S.A. -> Micro...
Es diferente de hacer
Micosoft Corporation S.A -> M.C.S.A. o MSSA
Para lo primero basta con coger los n primeros caracteres del string y concatenar "...", se puede hacer de mil formas, creo que Struts en bean:write tenia para hacer algo parecido, pero no recuerdo.
Para lo segundo supongo que habrá que hacer algo más "complejo", aunque el código en si no es demasiado complicado.
Mis sugerencias : o hacer una custom-tag para abreviar el nombre o hacer una clase de utilidad.
Puedes hacer lo siguiente:
// Clase utilidad
class ClaseUtiles {
public static String abreviar (String nombre) {
    // logica que convierte el nombre en iniciales o forma abreviada.
  return nombreAbreviado.
}}
Luego en el jsp basta con hacer :
<%=ClaseUtiles.abreviar(operacion.nombre)%>
Es la forma más simple de hacerlo, como digo puedes usar custom tags para no usar scriptles y como mucho usar EL, pero a fin de cuentas el resultado es el mismo
Bueno! El problema está resuelto... en parte.
Las abreviaturas para cada empresa digamos que están ya establecidas. En el contexto yo tengo almacenada una lista con todas las empresas que cotizan en Bolsa, así están disponibles para todos los usuarios. Cuando necesitaba mostrarlas en una jsp, puesto que cada elemento de la lista era un String, usaba:
<logic:iterate id="empresa" name="listaEmpresasBolsa">
<html:option value="${empresa}">
          <bean:write name="empresa"/>
</html:option>
</logic:iterate>
Eso sin mayor problema
Ahora resulta que para mostrar la abreviatura de cada empresa, como está establecida, la he asociado en esa lista con cada nombre, de forma que cada elemento es un String[] donde el componente 0 es el nombre y el componente 1 la abreviatura.
En base a eso, he definido una clase Utilidades como me has dicho con el método siugiente para devolver la abreviatura
public static String abrevEmpresa(String empr, HttpServletRequest request) {
     HttpSession session = request.getSession(false);
     if (session == null)
          return null;
     List empresas = (List) session.getServletContext().getAttribute("listaEmpresasBolsa");
     for (int i = 0; i < empresas.size(); i++) {
          String[] emprBolsa = (String[]) empresas.get(i);
          if (emprBolsa[0].toUpperCase().equals(empr.toUpperCase()))
               return emprBolsa[1];
     }
     return null;
}
Y me funciona bien tras haber escrito esto en la jsp (con el title de label creo el tooltip)
<td width="13%" height="30">
     <bean:define id="nombre" name="operacion" property="nombre" type="String"/>
     <label title="${nombre}"><%= Utilidades.abrevEmpresa(nombre, request) %></label>
</td>
Pero el problema que tengo ahora es que en el primer código, puesto que cada elemento no es un String sino un String[], no me muestra los nombres de las empresas sino 'java.lang.String@19f125...' o algo así, y el value será también incorrecto. ¿Cómo modifico el código para lograr empresa[0]?, ¿Qué es lo que correspondería con el nombre? ¿Entiendes lo que te digo?
Saludos
Bueno si lo que tienes es un String@... es que efectivamente no estas devolviendo un String, sino un array.
No he entendido muy bien tu pregunta, dices que el primer elemento no es un String si no un array ¿te refieres a donde pones? :
Si "operación.nombre" devuelve un array, cambia el "type" para asegurarte de no obtener el String@... , no se si puedes indicarle el tipo java. Lang.String[] para que te genere un Array o deberás de usar Object y hacer el casting... haz tu la prueba. En cualquier caso, puedes hacer una pequeña modificación del código, algo como :
public static String abrevEmpresa(Object empr, HttpServletRequest request) {
...
String empresa;
if (empr instanceof String)  {
empresa = (String)empr;
} else if (empr instanceof String[] ) {
empresa = ((String[]) empr)[0];
}
...
Quizás te ayude.
Por cierto, en lugar de hacer dos toUpperCase() usa "equalsIgnoreCase" en String, queda más claro.
No me he explicado bien
"empresa" siempre es una instancia de String, y como antes estaban en la lista "listaEmpresasBolsa" almacenadas como String, el código que pudiera haber (y que hay) en otra jsp funcionaba así bien
<logic:iterate id="empresa" name="listaEmpresasBolsa">
<html:option value="${empresa}">
      <bean:write name="empresa"/>
</html:option>
</logic:iterate>
Pero al surgir lo de las abreviaturas he decidido asociarlas a cada empresa haciendo que la lista "listaEmpresasBolsa", en vez de almacenar String almacene String[], donde el componente 0 es el nombre y el 1 la abreviatura.
Y ahora necesito en el logic:iterate modificar algo para acceder al componente 0 de cada elemento de la lista, porque con eso que hay es donde me muestra String@...
¿Me entiendes?
Si... creo.
Entonces lo que creo que necesitas es :
<html:option value="${empresa[1]}>
${empresa[0]}
</html:option>
Ahora sí que me entendiste! Eres fantástico! Qué fácil parece leyendo tus 4 líneas cuando a mí me ha llevado mi tiempo, no conseguía nada, y al final tuve que preguntarte. Qué sería de mí sin ti :)
Muchas gracias, fenómeno
Un saludo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas