Newsgroup: it.comp.java
Titolo: Re: Concatenazione in tag <c:out JSTL

 Gaetano
Purtroppo no
javax.servlet.ServletException: An error occurred while evaluating 
custom action attribute "value" with value "${comune['comuIndic' + 
lingua_utente]}": An exception occured trying to convert String 
"comuIndic" to type "java.lang.Long" (null)
Direi che tenta di interpretare '+' come simbolo di somma
Aldo

Ciao
a seconda della lingua dell'utente, devo visualizzare sulla pagina jsp 
la descrizione italiana o tedesca ad esempio del comune. Sul database i 
campi sono doppi, identificati con I e D.
Una soluzione del genere funziona
<c:choose>
<c:when test="${lingua_utente == 'I'}">
	<td><c:out value="${comune.comuIndicI}" /></td>
</c:when>
<c:when test="${lingua_utente == 'D'}">
	<td><c:out value="${comune.comuIndicD}" /></td>
</c:when>
</c:choose>
ma rende il codice abbastanza illeggibile.
È possibile nel tag <c:out> effettuare una concatenazione di stringa del 
tipo nomeCampo+lingua in modo da ottenere l'emissione del campo giusto?
Se tento di fare cose del tipo
<c:out value="${comune.comuIndic + 'I'}" />
prima di concatenare cerca subito di valorizzare un campo di database 
comune.comuIndic che ovviamente non trova.
Grazie
Aldo

 <c:out value="${comune.comuIndic + 'I'}" />
Non sono sicuro di aver capito bene, comunque per le concatenazioni di 
stringhe in output, e sufficiente fare una cosa di questo tipo:
   <c:out value="${comune.comuIndic} I" />
Se in comune.comuIndic c'e' "MILANO" ti viene fuori sulla pagina
   "MILANO I"
Giusto per completezza, puoi fare cose anche piu' divertenti, ad esempio:
   <c:out value="${comune.nome} - ${comune.provincia}" />
ti stampa:
   "MILANO - MI"
Ok?
Spero di esserti stato utile!
Ciao,
-- 
            Davide Gurgone
      web: 
http://www.gurgone.it/
mail: davidechiocciolinagurgonepuntoit

 
aldo.dantichiocciolasiag.it
In effetti non sono capace di estendere un tag esistente, ancora...
Pero' sono capace di farne uno ex-novo. Te lo posto pero' publico, 
potrebbe esser utile anche a qualcun'altro:
Ti posto un tag che ho scritto per creare le righe in colore alternato 
in una tabella. E' molto semplice. Prima di usarlo, ti consiglio di 
eliminare le chiamate al logger (sysLog), compresa la dichiarazione, a 
meno che tu non abbia configurato nella tua applicazione un'istanza di 
log4j. In caso contrario ti darebbe errore.
[CODE]
package it.sweetvillage.swcc.tags;
import it.sweetvillage.swcc.tags.BaseTag;
import it.sweetvillage.swcc.tags.HTMLSupport;
import org.apache.log4j.Logger;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspContext;
public class TR extends BaseTag{
   private static Logger sysLog = 
Logger.getLogger("it.sweetvillage.swcc.debug");
   // Dichiarazione dei parametri. Alcuni hanno un valore di default
   private String base = "base";
   private String alternate = "alternate";
   private String var = "isBaseClass";
   private String onClick;
   private String onMouseOver;
   private String onMouseOut;
   // Questo metodo e' richiamato quando la jsp arriva al tuo tag
   public void doTag() throws JspException, IOException {
//  sysLog.debug("Referta.doTag");
     JspContext c = getJspContext();
     boolean isBase;
     /* Metodo standard per recuperare una variabile da tutti i
        contesti disponibili*/
     if (c.findAttribute(var) != null)
       isBase = ((Boolean)c.findAttribute(var)).booleanValue();
     else
       isBase = true;
     // metodo standard per scrivere nella pagina html
     c.getOut().write(getRow(isBase));
     //Metodo standard per inserire nel contesto "page" una variabile.
     c.setAttribute(var, new Boolean(!isBase));
   }
   /**
    * Stabilisco quale "class" html devo stampare.
    */
   private String getRow(boolean isBase){
     StringBuffer sb = new StringBuffer(HTMLSupport.ATTR_CLASS);
     sb.append("=\"");
     if (isBase)
       sb.append(base);
     else
       sb.append(alternate);
     sb.append("\" ");
     if (onClick != null && onClick.length()>0){
       sb.append(HTMLSupport.ATTR_ON_CLICK);
       sb.append("=\"");
       if (onClick.startsWith("${") && onClick.endsWith("}"))
         sb.append(getJspContext().findAttribute(
             onClick.substring(2,onClick.length()-1)));
       else
         sb.append(onClick);
       sb.append("\" ");
     }
     if (onMouseOver != null){
       sb.append("onMouseOver=\"");
       sb.append(onMouseOver);
       sb.append("\" ");
     }
     if (onMouseOut != null){
       sb.append("onMouseOut=\"");
       sb.append(onMouseOut);
       sb.append("\" ");
     }
     sb = new StringBuffer( printTag(HTMLSupport.TR, sb, false, false) );
     return sb.toString();
   }
   // Metodi di set per i dati privati. Non sono necessari i getter
   // Quindi non ce li ho messi :)
   public void setBase(String value) {
     base = value;
   }
   public void setAlternate(String value) {
     alternate = value;
   }
   public void setVar(String value) {
     var = value;
   }
   public void setOnClick(String value) {
     onClick = value;
   }
   public void setOnMouseOver(String value) {
     onMouseOver = value;
   }
   public void setOnMouseOut(String value) {
     onMouseOut = value;
   }
}
[/CODE]
Una volta creato il tag, devi produrne il descrittore:
[XML]
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="
http://java.sun.com/xml/ns/j2ee
"
     xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance
"
     xsi:schemaLocation="
http://java.sun.com/xml/ns/j2ee
 
http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd
"
     version="2.0">
     <description>La mia libreria di tags.</description>
     <tlib-version>1.0</tlib-version>
     <short-name>SimpleTagLibrary</short-name>
     <uri>/SimpleTagLibrary</uri>
   <tag>
     <description>Table Row - TR</description>
     <name>tr</name>
     <tag-class>
it.sweetvillage.swcc.tags.TR
</tag-class>
     <body-content>empty</body-content>
     <attribute>
       <name>onClick</name>
       <required>false</required>
       <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
       <name>onMouseOver</name>
       <required>false</required>
       <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
       <name>onMouseOut</name>
       <required>false</required>
       <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
       <name>base</name> <!-- Default: "base"-->
       <required>false</required>
       <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
       <name>alternate</name> <!-- Default: "alternate"-->
       <required>false</required>
       <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
       <name>var</name> <!-- Default: "isBaseClass"-->
       <required>false</required>
       <rtexprvalue>false</rtexprvalue>
     </attribute>
   </tag>
</taglib>
[/XML]
e installarlo come per ogni altra tag library, nel web.xml:
[CUT]
[XML]
   <taglib>
     <taglib-uri>
 
http://jakarta.apache.org/tomcat/jsp2-example-taglib
     </taglib-uri>
     <taglib-location>/WEB-INF/tld/tags/mytaglib.tld</taglib-location>
   </taglib>
[/XML]
... dichiararlo nella jsp
[JSP]
<%-- myTagLib--%>
<%@ taglib uri="/WEB-INF/tld/tags/mytaglib.tld" prefix="mt" %>
<%--... Ed infine utilizzarlo:--%>
<table>
   <c:forEach items="${vr.etichette}" var="e">
     <mr:tr/>
       <td>ciao</td>
     </tr>
   </c:forEach>
</table>
[JSP]
Spero di esserti stato utile!
Ciao.


>   "MILANO I"
Ho capito cosa intendi. La concatenazione e' nel nome della variabile!
Penso che non si possa... Puoi pero' fartelo tu un tag apposta..
Sei capace?
Altrimenti ti mando qualcosa..


 
No, forse mi sono spiegato male.
Essendo in una provincia bilingue (Bolzano), tutte le applicazioni 
devono essere bilingui, ciò significa che a seconda della lingua scelta 
dall'utente devo "estrarre" dal database e mettere sulla pagina 
alternativamente o il campo comuIndicI (che contiene 'Milano') o il 
campo comuIndicD (che contiene 'Mailand').
Ciao
Aldo

 comune.comuIndic che ovviamente non trova.


 
In effetti pensavo di estendere il c:out, soluzione elegante.
La realtà (solita) è che dovendo consegnare a fine marzo e non avendo 
mai esteso tag non ho molto tempo per fare dell'accademia.
Comunque se hai qualcosa che mi possa indirizzare ti ringrazio molto.
aldo.dantichiocciolasiag.it
Grazie
Aldo

 Ciao.
Gentilissimo, grazie.
Ciao
Aldo