Newsgroup: it.comp.java
Titolo: JSP Problema a *splittare* stringhe

Ciao a tutti, preannuncio che non son un programmatore Java, anzi non ne so nulla, ma oggi sono costretto a sostituire un collega e ho un problema, quindi se scrivo cose banali vi prego di legnarmi x bene cosi imparo :-)
Allora sto realizzando una pagina JSP che preleva dati da un swf di Flash, x quresto motico passo i paramentri alla pagina come singole variabili contenenti + valori delimitare da un separatore.
La stringa che ne risultà è di questo tipo: storeQuestion.jsp?codRisp=19%7C21%7C31%7C50%7C52&codDomd=7%7C9%7C10%7C16%7C17&codGrup=2%7C2%7C2%7C10%7C10&cTes=BT00000001
In pratica leggendo le var ho stre stringhe cosi
tGrup = 1|12|18|15|7
tDomd = 2|2|2|3|3
tRisp = 13|12|54|34|18
+ altra roba che non da problemi.
Ora io ho esigenza di *splittare* queste stringhe in tanti valori, in altri linguaggi userei un metodo delle stringhe che mi crea un array ( il solito .split("carattere") ) ma il mio collega mi ha detto di usare la classe StringTokenizer x fare questa operazione....
Io ho seguito il suo consiglio e ho fatto questo:
<%@ page language = "java" %>
<%@ page import = "java.sql.*" %>
<%@ page import = "java.io.*" %>
<%@ page import = "java.util.*" %>
<%@ page import = "java.util.Calendar" %>
<%
 // Ricavo la data di oggi
 Calendar date = Calendar.getInstance();
    int day = date.get(Calendar.DAY_OF_MONTH);
    int month = date.get(Calendar.MONTH) + 1;
    int year = date.get(Calendar.YEAR);
 String today = Integer.toString(year) + "-" + Integer.toString(month) + "-" + Integer.toString(day);
 
 // Recupero parametri passati da FLASH
 String cTes = request.getParameter("cTes");
 String strGrup = request.getParameter("strGrup");
 String strDomd = request.getParameter("strDomd");
 String strRisp = request.getParameter("strRisp");
 
 try {
%>
<%@ include file="openConnection.jsp" %>
<%
 
 StringTokenizer tGrup = new StringTokenizer(strGrup, "|");
 StringTokenizer tDomd = new StringTokenizer(strDomd, "|");
 StringTokenizer tRisp = new StringTokenizer(strRisp, "|");
 
 //  
 
 while(tGrup.hasMoreTokens()) {
 
  String sql = "";
  String g = tGrup.nextToken();
  String d = tDomd.nextToken();
  String r = tRisp.nextToken();
 
  sql = "INSERT INTO BTSDOMD0F (SDOMCODG, SDOMCODD, SDOMCODR, SDOMCTES, SDOMCTES) " +
     "VALUES (" + g + "," + d + "," + r + "," + cTes + "," + today + ");";
 
  System.out.println(sql + "<br>");
 }
%>
<%@ include file="closeConnection.jsp" %>
<%
 
 } catch(SQLException sqle) {
  //out.println("*** ERRORE *** SQLException: " + sqle.getMessage());
 }
%>
(non è finita x cui manca la parte di inserimento nel DB)
E il server (Tomcat 4.1.12) mi da questo errore:
type Exception report
message 
description The server encountered an internal error () that prevented it from fulfilling this request.
exception 
org.apache.jasper.JasperException
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:248)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:289)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:240)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:471)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2396)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:405)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:380)
 at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:508)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:533)
 at java.lang.Thread.run(Thread.java:536)
root cause 
java.lang.NullPointerException
 at java.util.StringTokenizer.(StringTokenizer.java:119)
 at java.util.StringTokenizer.(StringTokenizer.java:135)
 at org.apache.jsp.storeQuestion_jsp._jspService(storeQuestion_jsp.java:85)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:136)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:204)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:289)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:240)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:260)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:471)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2396)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
 at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
 at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
 at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
 at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:405)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:380)
 at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:508)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:533)
 at java.lang.Thread.run(Thread.java:536)
Non capisco dove sbaglio..sono proprio scarso con Java e il debugger di tomCat non mi sta molto simpatico ;-)
Ringrazio tutti in anticipo.
-- 
-----------------------------------------------------------
Ultima >> Ultimate Web Design
 + Web Site - 
http://digilander.libero.it/ultimazone

 di tomCat non mi sta molto simpatico ;-) 
Puo' essere che una o piu' delle stringhe strGrup, strDomd, strRisp sia 
null.
request.getParameter() ritorna null se i parametri non sono presenti 
nell'HTTP request. Per sicurezza, stampali sul log con System.out prima di 
usarli.
-- 
Fighting for peace is like fucking for virginity
ObjectZone - 
http://space.tin.it/computer/csadun

null.
Vero, avevo già risolto e mi sono dimenticato di dirlo.....scusatemi.
Già che sono qui chiedo una cosa... invece di usare questa classe StringTokenizer non posso usare un semplie Array? Visto che mi servirebbe anche x altre cose, tipo rielaborazione di dati direttament eall'interno della pagina jsp...
Mi potresti dare qualche dritta? So che può sembrare molto banale, ma onsltando le API di Java 2 sto impazzendo c'è troppa roba e non riesco a trovare quello che voglio.
Ti ringrazio in anticipo.
Ciao


 eall'interno della pagina jsp... 
Be', uno StringTokenizer ti serve per estrarre token e astrae da parecchie 
complicazioni (tipo token multipli, separatori diversi, eccetera).
Se non hai queste complicazioni, oppure, per dire, piu' tardi ti serve la 
posizione dei token e questa non e' computabile dai token, allora puo' 
valer la pena costruirsi qualcosa di apposito.
In genere pero' incapsula il comportamento che desideri in una classe, e 
evita array sparsi qui e la', che conduce invariabilmente ad approcci 
procedurali e meno manutenibili.


 procedurali e meno manutenibili.
Heheeh sta proprio li il mio problema, l'approccio con la programmazione a oggetti è ancora lmitato (sto imparando x altre vie, non il Java, ma sto imparando ;-))
Poi un altra domandina, ha senso ricrearsi una classe apposita per svolgere operazione che possono essere svolte con poche righe di codice? 
Ad esempio, mettiamo che debba ordinare una serie di dati all'interno della mia pagina JSP, io con altri linguaggi mi farei una *funzione* che dato un array mi ritorna l'array ordinato come voglio, ad esempio; con Java mi devo obbligatoriamente creare una classe anche per queste piccole esigenze? Anche se questo codice non verrà riutilizzato mai altre volte etc?
Scusate le domande banali ma vengo da altri linguaggi server e sto avendo qualche problemuccio col JSP, visto l'approccio completamente differente alcuni consigli mi fanno comodo.
Ti ringrazio ancora


 altre volte etc? 
Il trucco e' che, per definizione, questo non lo puoi dire; come 
innumerevoli esperienze sul campo e in letteratura dimostrano. :-) Il 99% 
di sistemi software evolve - e' soggetto a qualche modifica nel tempo (pure 
gli esercizi degli studenti, quando se li passano ;). E queste modifiche 
("manutenzione") tendono ad essere imprevedibili. La manutenzione e' 
semplicemente un'altra forma, meno ovvia, di riuso.
Di conseguenza, a fronte di costi bassissimi (o, specie se usi buoni IDE, 
praticamente nulli) , vale sempre la pena usare e costruire astrazioni ben 
definite laddove si potrebbe andar di procedure (o, perche' fermarsi, di 
call&goto ;-). Se conosci bene il paradigma procedurale, i motivi sono 
simili a quelli per cui quasi sempre usare "go to" e' dannoso. 
Il tutto, tralasciando gli enormi benefici di comunicabilita', 
gestione, modularita', leggibilita' (chiunque veda una classe 
StringTokenzier capisce che stai cercando di ottenere token; se fai la 
stessa cosa su un array, il lettore dovra' sforzarsi di seguire il tuo 
codice etc) e mille altri su cui hai tonnellate di letteratura. :-)


Allora inanzi tutto ti ringrzi per la bella spiegazione :-)
Poi ti rispondo dicendoti che i vantaggi dell'OO rispetto alla programmazione procedurale li comprendo e ne voglio trarre tutti i benefici appena possibile, solo che dovendo *rattoppare* un problema al volo con poco tempo a disposizione, senza basi concrete di Java e OOP, quindi volevo optare x una metodologia a me + vicina x produrre cmq un risultato, mediocre se paragonato alla funzionalità di una classe ad esempio, ma cmq basato su ragionamenti già digeriti.
Detto questo sono sicuro che hai capito il xche della mia richiesta ;-)
Ti ringrazio ancora la tua ultima risposta mi è piaciuta molto e mi ha spinto ancora di + ad imparare la programmazione orientata agli oggetti 
Ciao
