Foros del Web » Programación para mayores de 30 ;) » Java »

Varias clases en Servlets

Estas en el tema de Varias clases en Servlets en el foro de Java en Foros del Web. Que tal, pues sigo probando esto de los servlets, y ahora me ha surgido un poblema. Resulta que hice una clase llamada "Leer" que le ...
  #1 (permalink)  
Antiguo 22/01/2006, 13:45
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Varias clases en Servlets

Que tal, pues sigo probando esto de los servlets, y ahora me ha surgido un poblema.

Resulta que hice una clase llamada "Leer" que le paso un String y busca si ese string se encuentra dentro de un archivo de texto (datos.txt), si es asi, regresa true, si no, false.
Despues hice otra clase que hiciera uso de ella para probarla, y todo sirvio bien.
Entonces decidi usarla con servlets pero no me funciona.
Mi aplicacion funciona asi:

En el HTML solo es un campo de texto donde se le ingresa un string y se le pasa a la clase, si esta despliega una pagina, si no, despliega otra.
este es el codigo de mi HTML:
Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<
html>
<
head>
<
title>Prueba</title>
</
head>
<
body>
<
h1>Búsqueda de horario</h1>
<
form method="GET" action="VerServicio.do"><br><br>
<
br><br>
<
input name="ID" type="text" size="30" maxlength="50">
<
center>
<
input type="SUBMIT" value="Ver Servicio">
</
center>
</
form>
</
p>
</
body>
</
html
Mi XML esta asi:
Código PHP:
<web-app 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/web-app_2_4.xsd"
    
version="2.4">
    
      <
servlet>
        <
servlet-name>Servicio Servlet</servlet-name>
        <
servlet-class>Servicio</servlet-class>
    </
servlet>
    
    <
servlet>
        <
servlet-name>Leer Servlet</servlet-name>
        <
servlet-class>Leer</servlet-class>
    </
servlet>
    
    <
servlet-mapping>
        <
servlet-name>Servicio Servlet</servlet-name>
        <
url-pattern>/VerServicio.do</url-pattern>
    </
servlet-mapping>
    
</
web-app
Y mi clase principal hace esto:
Código PHP:
 import javax.servlet.*;
 
import javax.servlet.http.*;
 
import java.io.*;
 
 public class 
Servicio extends HttpServlet
 
{
     public 
void doGet(    HttpServletRequest request,
                         
HttpServletResponse response)
         
throws IOExceptionServletException
     
{        
         
response.setContentType("text/html");        
        
Leer leerObj = new Leer();
        
boolean found false;
        
String ID request.getParameter("ID");
        
found leerObj.search(ID);
        
        
RequestDispatcher view;
        
        if ( 
found == true )
        {
            
view request.getRequestDispatcher("Horario118749.jsp");
            
view.forward(requestresponse);
        }
        else if ( 
found == false)
        {
            
view request.getRequestDispatcher("Horario118282.jsp");
            
view.forward(requestresponse);
        }
     }
 } 
El problema es que siempre detecta como si NO encontrara el string que busca y me manda al "else", a pesar de que la misma prueba en una consola si funciona bien.
Espero alguien me pueda ayudar

saludos,
  #2 (permalink)  
Antiguo 22/01/2006, 13:58
 
Fecha de Ingreso: junio-2005
Mensajes: 286
Antigüedad: 18 años, 10 meses
Puntos: 2
Chequea el parametro ID, quizas debes truncarle los espacios en blanco predentes/subsiguientes. Pero talvez en tu clase Leer ya haces eso...

No te saca algun error la otra clase?
  #3 (permalink)  
Antiguo 22/01/2006, 14:16
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Cita:
Iniciado por Willie
Chequea el parametro ID, quizas debes truncarle los espacios en blanco predentes/subsiguientes.
Pero talvez en tu clase Leer ya haces eso...
No te entendi bien eso.....

Cita:
Iniciado por Willie
No te saca algun error la otra clase?
Nop, SIEMPRE me detecta como si fuera FALSE lo que me regresa, ya cambie el espacio de los campos para que sea exactamente de tamanio 6 (que es lo que busca en mis datos y en mi clase "Leer")

el XML no es el problema?
no debo especificar que va a buscar en "datos.txt", o cambiarle algo para que reconozca bien mi clase "Leer"?
la verdad es que no se XML y eso lo puse por intuicion, y no se si asi sea el modo......

Última edición por blackwind; 22/01/2006 a las 14:58
  #4 (permalink)  
Antiguo 22/01/2006, 15:02
 
Fecha de Ingreso: junio-2005
Mensajes: 286
Antigüedad: 18 años, 10 meses
Puntos: 2
a lo que me refiero es que "esto " no es igual a "esto " (nota el espacio en blanco al final).

Pero si dices que cambiando la condicion te da lo mismo, pues me parece algo extranno. Talvez quita el "else if" y prueba solo con "else". Usando la condicion 'found' no genera muchos casos.
  #5 (permalink)  
Antiguo 22/01/2006, 17:47
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 4 meses
Puntos: 19
¿ Pero no será , mejor tratar un condicional sujeto a una variable booleana así ?:
Código:
if (found) { ... lo que sea si found es true...}
 else { ... otra cosa si found es false....}

 // o de otra forma

if (!found) {... lo que sea si found es false ( !(false)=true ) ...}
 else { ... otra cosa si found es true ( !(true)=false ) ... }
Prueba y comentalo .
  #6 (permalink)  
Antiguo 22/01/2006, 20:52
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Cita:
Iniciado por Willie
a lo que me refiero es que "esto " no es igual a "esto " (nota el espacio en blanco al final).
Eso ya lo cheque, y no es el problema :S

Cita:
Iniciado por Willie
Pero si dices que cambiando la condicion te da lo mismo, pues me parece algo extranno. Talvez quita el "else if" y prueba solo con "else". Usando la condicion 'found' no genera muchos casos.
Ya corregi eso, y cambiando la condicion ya no da lo mismo. Pero de todas forms detecta como si siempre fuera false.....

Cita:
Iniciado por dogduck
¿ Pero no será , mejor tratar un condicional sujeto a una variable booleana así ?:
Ya probe eso y tampoco funciona......


alguien alguna idea de que podria ser?

Última edición por blackwind; 22/01/2006 a las 22:15
  #7 (permalink)  
Antiguo 23/01/2006, 02:44
Avatar de dogduck  
Fecha de Ingreso: enero-2006
Ubicación: ¿Atlantida, Hesperides, Islas afortunadas?
Mensajes: 2.231
Antigüedad: 18 años, 4 meses
Puntos: 19
Por lógica :

//found se inicializa como false
...
boolean found = false;
...
//found toma su valor "definitivo" en el método search(ID) de el objeto
// leerObj de la clase leer , postea esa clase a ver si entre todos ...
found = leerObj.search(ID);

Y como vemos que found nunca toma el valor true , supongo que ese método no hace lo que tiene que hacer ... Sin datos ... Sin datos ... No puedo proseguir

Investiga por hay
  #8 (permalink)  
Antiguo 23/01/2006, 09:28
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Cita:
Iniciado por dogduck
Por lógica :

//found se inicializa como false
...
boolean found = false;
...
//found toma su valor "definitivo" en el método search(ID) de el objeto
// leerObj de la clase leer , postea esa clase a ver si entre todos ...
found = leerObj.search(ID);

Y como vemos que found nunca toma el valor true , supongo que ese método no hace lo que tiene que hacer ... Sin datos ... Sin datos ... No puedo proseguir

Investiga por hay
No creo que ese sea el problema, ya que como habia dicho, en las pruebas de consola que hice SIEMPRE funciona a la perfeccion.
Por ejemplo, esta clase de prueba que hice siempre funciona bien:
Código PHP:
public class Pruebas
{
    public static 
void mainString args[])
    {
        
System.out.println("clase de pruebas");
        
Leer leerObj = new Leer();
        
boolean found false;
        
String ID "118749  ";
        
found leerObj.search(ID);        
        if ( 
found == true )
        {
            
System.out.println("118749");
        }
        else if ( 
found == false)
        {
            
System.out.println("118282");
        }        
    }

No sera que mi archivo de datos.txt tengo que darle un permiso o a mi clase Leer en el XML o en alguna otra parte??
Sinceramente ya no se que hacer para solucionar el problema :S:S
  #9 (permalink)  
Antiguo 23/01/2006, 10:33
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Lo que te dice dogduck es correcto. Si leerObj.search(ID) devuelve false es por algo que hace la funcion, y dentro es donde debe estar el problema. Con lo que has puesto lo unico que podemos decir es que la funcion te devuelve siempre false, pero no podemos saber por que.
  #10 (permalink)  
Antiguo 23/01/2006, 14:36
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Cita:
Iniciado por GreenEyed
Lo que te dice dogduck es correcto. Si leerObj.search(ID) devuelve false es por algo que hace la funcion, y dentro es donde debe estar el problema. Con lo que has puesto lo unico que podemos decir es que la funcion te devuelve siempre false, pero no podemos saber por que.
Yo tambien pensaria eso, pero si fuera asi, mi clase de Pruebas tampoco funcionaria, y si lo hace todo bien.
De hecho, ahorita probe quitando mi archivo de "datos.txt" de mi aplicacion, y no me manda error ni nada y aun asi manda false.
Esta demasiado raro.....
hay alguna parte donde deba especificar que va a leer los datos de ahi?

De todas formas, aqui lesp ongo mi clase leer para que vean:
Código PHP:
import java.io.*;
import java.lang.*;
import java.util.*;

public class 
Leer
{
    
// ID, Nombre, Colegio
    
public static String[] strStudentData;     
    
    
// Datos del archivo de texto
    
private static String[] strFileData;
    private static 
int fileSize;
    
    
/*public static void main(String args[])
    {
        System.out.println("Lee Archivo");        
        
        // inicializa datos
        fileSize = getFileSize("datos.txt");
        strFileData = new String[fileSize];        
        strFileData = ReadFile("datos.txt");
        strStudentData = new String[3];
        
        // busca
        search("118749");
        for ( int i = 0; i < 3; i++ )
            System.out.println( strStudentData[i] );            
    
    }*/
    
    
    
    /***************************************************************
     *            C O N S T R U C T O R
     * Inicializa todos los datos necesarios
     * 
     ***************************************************************/
    
public Leer()
    {
        
fileSize getFileSize("datos.txt");
        
strFileData = new String[fileSize];        
        
strFileData ReadFile("datos.txt");        
        
strStudentData = new String[3];
    }
    
    
    
/***************************************************************
     *            S E A R C H              
     * Metodo busca si el ID especificado se encuentra
     * registrado en la escuela
     ***************************************************************/
    
public static boolean searchString ID)
    {
        
String strTemp "";
        
int cont 0;
        
int pos 0;
        
boolean found false
        
int tempfileSize fileSize;
        
        
// empieza a leer todos los datos
        
while ( (cont tempfileSize)  )
        {
            
// crea un string con un ID
            
strTemp strFileData[cont].substring(0,6);
            
            
// checa si los ID son iguales
            
if (strTemp.compareTo(ID) == 0
            {
                
// fueron iguales e imprime los datos
                // en esa posicion
                
pos cont;
                
getData(pos);
                
found true;                
                
//if(found)
                 
return true;
                
//break;                
            
}
            
cont++;
        }
        
        return 
false;
        
//    System.out.println("No se encontro el estudiante ");    
        
    
}
    
     
/***************************************************************
     *            P R I N T   S T U D E N T D A T A               
     * Metodo que obtiene el tamanio de lineas
     * que contiene un archivo 
     ***************************************************************/
    
public static void printStudentData()
    {
        
        
System.out.println"ID : " strStudentData[0] );
        
System.out.println"Nombre: " strStudentData[1] );
        
System.out.println"Colegio: " strStudentData[2] );
    }
    
    
    
/***************************************************************
     *            G E T   D A T A            
     * Obtiene los datos del estudiante buscado y los guarda
     * 
     ***************************************************************/
    
private static void getData(int pos)
    {
        
StringTokenizer st = new StringTokenizer(strFileData[pos], "|");
        
        
System.out.println("Los datos del estudiante son: ");
        
        
int i 0;
         while (
st.hasMoreTokens()) 
         {
             
strStudentData[i] = st.nextToken();
             
strStudentData[i] = strStudentData[i].trim();
             
//System.out.println(strStudentData[i]);
             
i++;
         }
         
         
convertData(strStudentData[2]);
    
    }
    
    
    
/***************************************************************
     *            C O N V E R T    D A T A           
     * Convierte las siglas del colegio al nombre
     * 
     ***************************************************************/
    
private static void convertDataString college )
    {
        if ( 
college.compareTo("CCM") == )
            
strStudentData[2] = "Colegio Cain Murray";
        else if ( 
college.compareTo("CIB") == )
            
strStudentData[2] = "Colegio Ignacio Bernal";
        else if ( 
college.compareTo("CRL") == )
            
strStudentData[2] = "Colegio Ray Lindley";
        else if ( 
college.compareTo("CJG") == )
            
strStudentData[2] = "Colegio Jose Gaos";
        
    }
    
    
    
/***************************************************************
     *            G E T   F I L E S I Z E               
     * Metodo que obtiene el tamanio de lineas
     * que contiene un archivo 
     ***************************************************************/
    
private static int getFileSizeString fileName )
    {
        
int tempfileSize 0;       
        try 
        {
            
BufferedReader in = new BufferedReader(new FileReader(fileName ));            
            while ( 
in.readLine() != null
            {                    
                
tempfileSize ++;     
            }
        
in.close();
        }        
        catch (
IOException e) {}
        return 
tempfileSize ;
    }    
    
    
    
     
/***************************************************************
     *            R E A D   F I L E               
     *     Metodo que lee el archivo con el nombre especificado
     *     y regresa un arreglo con los datos que contiene en 
     *     linea por linea 
     ****************************************************************/    
    
private static String[] ReadFileString fileName )
    {
        
// tamanio y datos del archivo
        
String[] str = new String[3360];        
        
        
// lee el archivo y lo guarda en str
        
try 
        {
            
BufferedReader in = new BufferedReader(new FileReader(fileName));
            
            
int i 0;
            while ( (
str[i]=in.readLine()) != null
            {                      
                
i++;                          
            }
        
in.close();
        }        
        catch (
IOException e) {}
        
        return 
str;
    }
    
    
    
     
/***************************************************************
     *            P R I N T   F I L E              
     *     Imprime los datos Linea - por - Linea que contiene
     *  un archivo 
     ****************************************************************/
    
private static void PrintFileString[] strDataint tempfileSize  )
    {
        for ( 
int i 0tempfileSize i++ )
            
System.out.printlnstrData[i]);
            
            
System.out.println"data loaded: " tempfileSize );
        
    }


y aqui esta el formato de mi archivo de "datos.txt"
Código PHP:
112125    |    Fernando Valenzuela C    |    CCM
122351    
|    Mariana Martinez Avila    |    CRL
105683    
|    Luis Garcia Montalvo    |    CRL
119518    
|    Stefanie Gaytan Ruiz    |    CIB
118720    
|    Melesio Uscanga Silva    |    CIB
121764    
|    Mario Alberto De Leon Espinoza    |    CJG
108424    
|    Karina Celia Gutierrez Badillo    |    CIB
118357    
|    Corinne Montes Camacho    |    CCM
120693    
|    Juan Pablo Elizondo Portilla    |    CCM 
Sigo insistiendo, hay algun lugar especifico donde deba poner mi archivo de "datos.txt" o hacer algo especial con el HTML o el XML o algo asi?

saludos,
  #11 (permalink)  
Antiguo 23/01/2006, 15:07
 
Fecha de Ingreso: junio-2005
Mensajes: 286
Antigüedad: 18 años, 10 meses
Puntos: 2
si quitas el datos.txt y no te manda error es que probablemente no esta leyendo el archivo. Tu archivo datos.txt tiene que estar donde esta tu clase Leer (presumo en WEB-INF/classes) o le tienes que dar el URL absoluto (e.g.: "C:\temp\datos.txt").

Eres realmente programador C/C++, se nota en el codigo :) Para leer archivos y "parsear", el API de Java tiene ciertos metodos que te pueden ahorrar tiempo. Porque tanto static?

Viendo el codigo, hay bastante clausulas 'catch' vacias. Es quiza por eso que no te salen los errores.
  #12 (permalink)  
Antiguo 23/01/2006, 15:13
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Cita:
Iniciado por Willie
si quitas el datos.txt y no te manda error es que probablemente no esta leyendo el archivo. Tu archivo datos.txt tiene que estar donde esta tu clase Leer (presumo en WEB-INF/classes) o le tienes que dar el URL absoluto (e.g.: "C:\temp\datos.txt").

Eres realmente programador C/C++, se nota en el codigo :) Para leer archivos y "parsear", el API de Java tiene ciertos metodos que te pueden ahorrar tiempo. Porque tanto static?

Viendo el codigo, hay bastante clausulas 'catch' vacias. Es quiza por eso que no te salen los errores.
Si, justamente es lo que me acabo de dar cuenta. Tengo que poner la ruta absoluta, y justamente ingrese aqui para decirles que ese era mi error.....
de haberlo sabido....

Por cierto, podrias decirme porque eso de programador de C/C++?

me gustaria que me dieran comentarios y sugerencias de como mejorar mi codigo.....

saludos....
  #13 (permalink)  
Antiguo 23/01/2006, 15:51
 
Fecha de Ingreso: junio-2005
Mensajes: 286
Antigüedad: 18 años, 10 meses
Puntos: 2
lo de C/C++ no lo dije con ganas de ofender, perdon si ese ha sido el caso. He visto que el codigo tiene bastante statics, eso me indica que no estas pensando mucho en OO, si no mas bien en las funciones mismas. El nombre de la clase lo indica ("Leer").

Tambien lo de cargar el archivo en memoria: Creo que con el tamanno de tu archivo es justificable, pero imaginate si tienes que cargar un archivo de unos cuantos MBs (o aun GBs, pero eso es un poco mas raro), eso ya pesa en el rendimiento.
  #14 (permalink)  
Antiguo 23/01/2006, 17:45
 
Fecha de Ingreso: noviembre-2003
Ubicación: Mexico
Mensajes: 1.081
Antigüedad: 20 años, 5 meses
Puntos: 7
Cita:
Iniciado por Willie
lo de C/C++ no lo dije con ganas de ofender, perdon si ese ha sido el caso. He visto que el codigo tiene bastante statics, eso me indica que no estas pensando mucho en OO, si no mas bien en las funciones mismas. El nombre de la clase lo indica ("Leer").
jeje, no te preocupes, no me ofendiste con eso. La clase leer la programe asi aproposito para que solo pueda ser usada como la uso. Aunque aun le faltan algunas mejoras....

Cita:
Iniciado por Willie
Tambien lo de cargar el archivo en memoria: Creo que con el tamanno de tu archivo es justificable, pero imaginate si tienes que cargar un archivo de unos cuantos MBs (o aun GBs, pero eso es un poco mas raro), eso ya pesa en el rendimiento.
De que otra forma lo pude haber cargado?
  #15 (permalink)  
Antiguo 24/01/2006, 02:26
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Willie se refería a que el programa, tal como lo escribiste, no está orientado a objetos y está pensado como un programa procedimental, con todos los métodos estáticos etc. No es que esté mal en si, pero no es el estilo Java y por eso lo decía .

En cuanto al fichero, para no gastar memoria en exceso puedes leer el fichero cada vez en lugar de leerlo en memoria. A cambio eso disminuiría el rendimiento, claro. Si vas a buscar mucho, otra opción es introducir esa información en base de datos y dejar que el motor de BDD optimice las busquedas. Hay motores 100% Java sin instalacion que se basan en ficheros que son perfectos para aplicaciones web sencillas.

Por ultimo, si vas a realizar busquedas y no necesitas una BDD, no hay informacion relacionada, otra opción interesante sería usar Lucene, que es un motor de busquedas que te indexa textos, te permite busquedas parciales, etc etc.

Una de las cosas buenas y malas de Java es que hay ya mucha cosa hecha, así que lo primero es mirar si hay algo que ya te pueda servir y no tener que hacerlo tu.

Un saludo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:40.