viernes, 21 de agosto de 2009

Generación dinámica de un JNLP, segunda parte

Buenas.
Me ha hecho tanta ilusión que me escribiesen un comentario sobre el post de ayer de JNLP, que he decidido contestarlo, pero en formato de entrada. Así si más gente tiene la misma duda, quizá le pueda ayudar.

Comentario:

Hola estoy un poco verde en el tema de deployar servicios Web, podrias detallar un poco como se ejecuta? Yo lo he hecho de la siguiente manera:
-Creo en el eclipse un Web Dynamic Project
-Creo un fichero .jsp como el que tu tienes y se lo agrego a la raíz de ese proyecto.
-Creo un servlet como el tuyo.
-Ejecuto el Proyecto Web en un tomcat, y en el navegador pongo la siguiente URL:
http://localhost:8080/GetParametrosLiDAR/ServletGetParameters?valor=holamundo

donde GetParametrosLiDAR es el nombre del proyecto y ServletGetParameters es el nombre del servlet.

Tambien e probado esto:
http://localhost:8080/GetParametrosLiDAR/ServletGetParameters/index.jsp


Gracias por todo.


-PD: en el index.jsp la palabra Iniciar no la coge bien y no se para que sirve

Respuesta:

Intentaré resolverte la duda.

Primero un problemilla... uso NetBeans para el desarrollo, me gusta más que eclipse.
Este lo he usado alguna vez, pero al final me termino volviendo loco, supongo que será acostumbrarse.

Así que te hablaré según netbeans.
- Crear un WebApplication
- Crear un jsp dentro de WebPages
- Crear un Servlet dentro de Source (en un package si quieres, para que esté más organizado)
Y empezar a meter código.

El proyecto, en netbeans, queda así:



En el jsp sustituyendo a las etiquetas html pones esto:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>JSP Pagetitle>
>
<body>
<center>
<form name="Generador" action="GeneradorJNLP" method="POST">
<div style="
border-style:solid;
border-width:1px;
width:200px;
height:80px;">
<center>
<br>
<input type="text" name="valor" style="width:180px"/><br>
<a href="#" onclick="Generador.submit();">Iniciara>
>
>
<form>
<center>
>
>


En el servlet sustituyendo el método processRequest pones esto:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
String valor = (String) request.getParameter("valor");
String jnlp = getJnlp(valor);
try {
response.setContentType("application/x-java-jnlp-file");
out.print(jnlp);
} finally {
out.close();
}
}
}
Y construyes el método "getJnlp()", recuerda para este caso sin ' href '

Luego tu dices que ejecutas la aplicación con esta llamada:

http://localhost:8080/GetParametrosLiDAR/ServletGetParameters?valor=holamundo


Bien, esto es una llamada al servlet desde la barra de direcciones del navegador.
Yo en mi caso la hago desde un link, este:

<a href="#" onclick="Generador.submit();">Iniciar</a>


Contestando a tu PD. "Iniciar" no es mas que una palabra que actuará como link.
Cuando cliques encima ejecutaras la sentencia javascript "submit()" del formulario Generador.

El formulario apunta al servlet que hemos hecho antes.



En method está puesto a POST. Esto no es más que la forma de pasar los parámetros del formulario.
Puede ser GET o POST, aquí tienes una explicacion de la diferencia

En mi proyecto, obviando el enlace que me hace el trabajo, y haciendo como tu, tengo que poner la siguiente ruta:

http://localhost:8082/InicioHoja/GeneradorJNLP?valor=holamundo


Un datalle. Mi servet no se llama "GeneradorJNLP" se llama "ServletGeneradorJNLP". Quizá sea esto lo que te falla.
NetBeans lo hace automaticamente, igual en eclipse lo tienes que hacer a mano tu.

En el archivo web.xml de WEB-INF hay que definir los servlet que usas y mapearlo.

<servlet>
<servlet-name>GeneradorJNLP</servlet-name>
<servlet-class>
generadorJNLP.ServletGeneradorJNLP
<
/servlet-class>
</servlet>


Así cuando tomcat reciba una llamada con "GeneradorJNLP" sabrá que tiene que ir a buscar al paquete generadorJNLP, y en él, a la clase(Servlet) ServletGeneradorJNLP.
Prueba a ver si es eso.

Por si acaso, te dejo todo el web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
">
<servlet>
<servlet-name>GeneradorJNLP</servlet-name>
<servlet-class>generadorJNLP.ServletGeneradorJNLP</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GeneradorJNLP</servlet-name>
<url-pattern>/GeneradorJNLP</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

Espero que haya resuelto tu duda, y la de aquel que lo lea. Si no, no dudes en volverme a dejar un comentario e investigaré un poco más para ver si te puedo ayudar.

De cualquier forma, tendrá que ser ya para el lunes, que me voy en un rato a Valencia para estar con mi novia y para ver el gran premio de Europa de F1!!!

Un saludo!!!

8 comentarios:

  1. Muchisimas gracias!! el problema estaba en el fichero java del servlet, que le faltaría algun método porque solo implementé el doGet y el porcessRequest, ahora a partir de una coordenadas introducidas desde el navegador muestro una grafica con el perfil de un mapa de puntos en coordenadas, con el que puedo trabajar, modificar con distintas herramientas y guardar...y todo eso sin tener nada en mi máquina.

    De nuevo muchisimas gracias

    ResponderEliminar
  2. Muchísimas de nadas!!!

    Claro, eso se me pasó decirlo.
    Cuando haces la llamada a través de Post tienes que tener en el servlet el metodo doPost, y cuando la haces con get, el método doGet, pero ambos redireccionan al processRequest.

    Me alegro que te haya servido.

    Cómo trabajas con gráficas. Con JFreeChart??
    Si no lo conoces te recomiendo que le eches un vistazo, es una librería genial para trabajar con gráficas.

    Un saludo!!!

    ResponderEliminar
  3. Hola, Gracias por el aporte. Tengo un problema con mi aplicacion que tiene una estructura similar a la que comentas. Genero el .jnlp de manera dinamica y paso argumentos al .jar firmado, pero en algunos ordenadores pasa que estos argumentos llegan vacios. Estos argumentos se devuelven al servidor junto con un parametro mas que tambien llega vacio al servidor web. Que crees que puede ser?

    ResponderEliminar
  4. Buenas!
    Primero de todo, gracias por comentar!

    Hace tiempo que no toco JNLP, pero lo que comentas es raro.
    Comprueba que el archivo JNLP se genera bien, con los argumentos que le pasas
    Comprueba que el .jar que ejecutas los lee.
    Y si todo va bien en un equipo, pero en otros no... pues no se, porque no debería pasar.
    Una vez generado el XML, o se genera entero para arrancar la aplicacion con parametros incluidos, o no se genera nada.
    Ya me irás contando como van las pruebas, pero de momento, ve investigando qué es lo que falla más específicamente y qué motivos puede haber.

    Siento no poder ayudarte más.

    ResponderEliminar
  5. Gracias por la respuesta. La verdad es un caso bastante raro, de momento hemos hecho pruebas en 6 ordenadores, en 4 funciona correctamente, pero en 2 no. Lo que sucede es que por alguna razón en estos 2 ordenadores los argumentos del jnlp llegan vacios al .jar. El jnlp se crea correctamente y puedo ver los argumentos con sus valores, pero cuando llegan al .jar ya están los argumentos vacíos. Probamos con IE 8, Chrome 30 y Firefox 24 y pasa lo mismo. Sabes si puede ser algun problema de seguridad con los jnlp en esos ordenadores?

    ResponderEliminar
  6. Si al menos en 1 funciona, ya no es cosa de java, tiene pinta de ser configuración de los ordenadores.
    ¿Maquinas de java?
    ¿Proxys?
    ¿Incluso algún antivirus que limite la ejecución de programas java?
    También muchos navegadores están quitando java de ellos por su peso y por su problemas de seguridad, ¿podría influiros en algo?
    Yo me centraría en ver qué configuración tiene diferente un ordenador de otro, el problema debe de estar ahí.

    ResponderEliminar
  7. Muy buen blog. He intentado todo, pero no puedo descargar el archivo jar, puesto que me indica que no se puede cargar el recurso. Por favor una ayuda. Estoy usando Tomcat 8.0 y netbeans 8.0. De antemano gracias.

    ResponderEliminar
    Respuestas
    1. Es difícil poder saber por qué motivo exacto no lo puedes descargar, pero si dice que no se puede cargar el recurso, casi seguro será que estás apuntando a otro sitio donde no está el jar con la aplicación.
      Comprueba las rutas, revisa los puertos, comprueba que tienen acceso al jar directamente, mira que no haya nada cortando la conexión...

      Eliminar