domingo, 12 de diciembre de 2010

Quinta Semana

Esta semana, con las fiestas, solo hemos tenido dos días de curso. Estos días hemos terminado el blog que estábamos haciendo en Java y JSP, y hemos planteado el desarrollo de un chat con las mismas tecnologías.
Durante estos dos ejercicios, estamos reforzando las tecnologías de la parte del servidor, Java, JSP y acceso a base de datos y de la parte cliente, HTML y Javascript. También añadimos las librerías de reCAPTCHA y añadir a nuestras aplicaciones pluggins de Facebook.
Otra cosa importante que se ha explicado, para la autentificación de usuarios, es el concepto de sesión. La sesión la utilizamos en la parte del servidor mediante la interface HTTPSession.

Cuando creamos una aplicación web en Java, siempre que un usuario se conecta con su navegador a la aplicación, se crea un objeto HTTPSession en la memoria del servidor. Este objeto sesión, esta disponible durante todo el tiempo que el usuario esta navegando por la aplicación, de esta manera podemos almacenar objetos específicos para cada usuario durante el tiempo que estén conectados. La sesión se pierde, o se cierra, cuando el usuario cierra el navegador o da la orden a la aplicación de cerrar la sesión. A la sesión también se le puede indicar un tiempo de vida, por lo que se cerrara por el servidor transcurrido dicho intervalo de tiempo. 
Como hemos dicho anteriormente, hemos utilizado la sesión para autentificar a los usuarios. Por ejemplo:

01       HttpSession session = request.getSession( true );      
02       String txtUser = request.getParameter( "txtUser" );
03       String txtPassword = request.getParameter( "txtPassword" );
04 
05       try
06       {
07           //crear el driver
08           Class.forName( "com.mysql.jdbc.Driver" ).newInstance();
09           con = DriverManager.getConnection( "jdbc:mysql://localhost/prueba", "root", "" );
10           //obtener el statement
11           pstm = con.prepareStatement( "SELECT * FROM usuarios WHERE user = ? AND password = ?" );
12           pstm.setString( 1, txtUser );
13           pstm.setString( 2, 
14                   SHA.SHA( txtPassword ) );
15 
16           ResultSet rs = pstm.executeQuery();
17 
18           if( rs.next() ) {
19             user = new User();
20             user.setId( rs.getInt( "id" ) );
21             user.setUser( rs.getString( "user" ) );
22             user.setEmail( rs.getString( "email" ) );
23             user.setPassword( rs.getString( "password" ) );
24           }
25 
26           pstm.close();
27 
28           if( user != null )
29           {
30             nextPage = "/chat.jsp";
31           } else {
32             nextPage = "/index.jsp";
33           }
34 
35           session.setAttribute( "user", user );
36           request.getRequestDispatcher( nextPage ).forward( request, response );

Este ejemplo, corresponde a un servlet que controla el login de un usuario. Lo que hacemos en la linea 1 es obtener el objeto sesión del usuario. En las siguientes lineas lo que hacemos es comprobar con una consulta SQL si el usuario esta en la base de datos, y si esta crearnos un bean con la información del usuario. En las lineas 28 - 33, inicializamos la variable 'nextPage' dependiendo si el usuario esta creado o no. Y en la linea 35    insertamos el bean usuario en la sesión con el nombre 'user'. De esta manera tenemos el bean usuario durante todo el tiempo que el usuario este ejecutando la aplicación y podremos comprobar si ha pasado por el proceso de validación o no. El proceso de validación solamente consistira en comprobar que en la sesión el atributo de nombre 'user' no es null.

01         User user = (User)request.getSession( true ).getAttribute( "user" );
02         if( user == null ) {
03             request.getRequestDispatcher( "login" ).forward( request, response );
04         }

Poniendo este código en cada petición que haga el usuario al servidor, comprobamos si el usuario esta en la sesión o nos devuelve null, en cuyo caso redirigimos al usuario a la pantalla de autentificación de usuario, login.
Aquí hemos visto como utilizar el objeto sesión para guardar al usuario. Pero la sesión nos puede valer para guardar otros objetos que nos sean necesarios durante la ejecución de nuestra aplicación web para un usuario determinado, puede valernos como un contenedor de objetos útiles para el desarrollo de la aplicación. Otra utilidad, por ejemplo en una tienda online, puede ser guardar en la sesión información relativa al carrito de la compra, o un objeto List con la lista de las cosas que vamos a comprar.
Como ultimo comentario, decir que hay que procurar llegar a un termino medio a la hora de almacenar objeto en la sesión. Hay que tener en cuenta que la sesión es un objeto que consume recursos del servidor, si decidimos guardar todo en la sesión, y tenemos muchos usuarios conectados, supondrá un consumo de recursos en el servidor, mayormente memoria, por lo que tendremos que tenerlo en cuenta.

domingo, 5 de diciembre de 2010

Cuarta Semana

Aquí estamos en nuestra cuarta semana de curso. Durante esta semana, se nota que ya estamos subiendo el listón de los ejercicios que hacemos, estamos desarrollando aplicaciones que podrían valer para proyectos futuros.
En cuanto a integración de Java y Flex, hemos desarrollado una aplicación de gestión de contactos. En la parte cliente, en Flex, hemos estado practicando los componentes XMLListCollection, que lo utilizamos como la fuente de datos de un datagrid y el componente HTTPService, con el cual llamamos a la parte del servidor y realizamos las operaciones de edición, borrado e inserción. La parte de servidor, en Java, estamos utilizando servlets para proporcionar los servicios a la aplicación de contactos del cliente.
Al final de esta semana, se ha propuesto realizar un blog, pero esta vez programado en Java, con Servlets y JSP. Como en el desarrollo del blog vamos a implementar el registro de usuarios, hemos visto como integrar  reCAPTCHA en el formulario de registro. Con esto evitamos registros en nuestra aplicación realizados por otros programas, para diferenciar si se registra una persona u otro ordenador.
Otra cosa que hemos visto, es la manera de gestionar los comentarios de las noticias en el blog, mediante el API de Facebook, de esta manera de una manera sencilla podemos hacer que los comentarios sean gestionados por Facebook. Aparte de esto hemos visto como integrar algunos componentes más en nuestra aplicación.

Aparte de programación, esta semana hemos asistido a una charla sobre emprendedores, donde nos han explicado lo necesario para montar una empresa, con algún ejemplo practico de dos emprendedores que han venido a explicarnos su experiencia. Nos han dado mucha información de donde tenemos que ir para poder conseguir ayudas y orientación para montar una empresa.

jueves, 2 de diciembre de 2010

Obtener campo autonumérico de un INSERT en Java

En el curso de RIA que estamos realizando, estamos haciendo un ejercicio de una agenda de contactos. Tenemos una pantalla donde enseñamos un listado de los contactos de un 'DataGrid'. Cuando insertamos un usuario, mandamos la los datos a través de un 'HTTPService' que llama a un servlet. Después en la parte cliente, para no tener que recargar de nuevo todos los datos del datagrid con otra llamada al servidor, insertamos un nodo nuevo en el 'XMLListCollection' que hace de data provider de nuestro datagrid.
Hasta aquí todo va bien, el problema es que cuando insertamos el nodo nuevo es necesario que la llamada al servicio de insertar nos devuelva el id que se ha creado nuevo en la base de datos(valor autonumérico), para en un futuro poder manipular ese contacto nuevo, por ejemplo si lo queremos borrar.

01           Class.forName( "com.mysql.jdbc.Driver" ).newInstance();
02           conn = DriverManager.getConnection( "jdbc:mysql://localhost/ria", "usr", "pwd" );
03 
04           stm = conn.createStatement();
05           stm.executeUpdate( "INSERT INTO usuarios ( nombre, apellidos )" +
06               "VALUES ( 'Alfonso', 'Pérez' )", Statement.RETURN_GENERATED_KEYS );
07 
08           int id = -1;
09           ResultSet rs = stm.getGeneratedKeys();
10           if( rs.next() ) {
11             id = rs.getInt(1);
12           }
13 
14           stm.close();

El primer cambio que tendremos que hacer para obtener el autonumérico, es cuando hacemos la llamada al método 'executeUpdate', además de pasar como parámetro el SQL, tenemos que pasar la constante que indica que nos devuelva los valores generados. Esta opción no es necesaria en algunas ocasiones, podemos omitir este parámetro, pero en algunas base de datos sino lo ponemos no nos devuelve el valor generado, por lo que cuando queramos los valores autonuméricos, estaría bien añadir este parámetro.
El segundo cambio, de la linea 8 a la 12, es donde obtenemos el valor generado con la llamada a 'stm.getGeneratedKeys'. Este método nos devuelve los valores en un ResultSet, por lo que lo trataremos como a otro ResultSet cualquiera. Como vemos en el código de ejemplo, mi tabla solo tiene un campo de tipo autonumérico, por lo que el valor lo obtenemos con 'rs.getInt(1)', si tuviéramos más de un campo lo obtendríamos con el indice del mismo, empezando en 1.