Introducción
En esta entrada vamos a comentar una serie de 'extras' que se han añadido al portal 'miserver.js' de la entrada anterior.El objetivo del ejemplo es tener un ejemplo básico que permita resolver las siguientescuestiones:
- ¿Cómo montar un servidor integramente desarrollado con JavaScript y ejecutando sobre nodejs?
- ¿Cómo modularizar el código JavaScript de nuestro portal en distintos ficheros JavaScript?
- ¿Cómo invocar 'desde la capa de negocio' de este portal un servicio web REST corriendo en Tomcat?
Dependencias
Para poder correr el ejemplo hemos tenido que añadir algunos paquetes node, por lo que primero hemos instalado el gestor de paquetes de node (npm) con el comando:sudo apt-get install npm
Seguidamente se ha añadido dos módulos (librerías o como se llame en este entorno):
- Librería 'node-rest-client' para manejar llamadas a servicios REST.
- Librería 'httpdispatcher' para gestionar el dispatcher de peticiones del servidor HTTP.
npm install node-rest-client
npm install httpdispatcher
Código
Hemos modularizado el proyecto en tres ficheros:- miserver.js. Contiene lo necesario para levantar un servidor http sencillito que despacha peticiones http.
- cliente-rest.js. Contiene lo necesario para invicar al servicio web rest anteriormente comentado.
- render-html.js. Contiene lo necesario para montar las distitnas páginas del portal.
El código del servidor sería:
//Inportamos el módulo http var http = require("http"); //Inportamos el módulo httpdispatcher var dispatcher = require('httpdispatcher'); //Instanciamos el servidor http.createServer( function(request, response) { //Llamamos al generador de paginas de respuesta dispatcher.dispatch(request, response); }).listen(8888); //Generamos la página de inicio dispatcher.onGet("/", function(req, res) { var renderHtml = require( './render-html.js' ); renderHtml.generaPaginaInicio(res); }); //Generamos la pagina /numeroEmpleados dispatcher.onGet("/numeroEmpleados", function(req, res) { var clienteRest = require( './cliente-rest.js' ); clienteRest.getNumeroEmpleados(res); }); //Generamos la pagina /listaEmpleados dispatcher.onGet("/listaEmpleados", function(req, res) { var clienteRest = require( './cliente-rest.js' ); clienteRest.getListaEmpleados(res); }); //Generamos la pagina /formBuscaEmpleados dispatcher.onGet("/formBuscaEmpleados", function(req, res) { var renderHtml = require( './render-html.js' ); renderHtml.generaPaginaFormBuscaEmpleados(res); }); //Generamos la pagina /formBuscaEmpleados dispatcher.onGet("/listaEmpleadosCoincidentes", function(req, res) { var clienteRest = require( './cliente-rest.js' ); clienteRest.getListaEmpleadosCoincidentes(req, res); }); //Mensaje de aviso tras el arranque del servidor console.log("Servidor funcionando en http://localhost:8888");
cliente-rest.js
El código de la libería encargada de las llamadas el servicio web REST sería:
//Inportamos el módulo node-rest-client var Client = require('node-rest-client').Client; var client = new Client(); //Inportamos el módulo url var url = require('url') //Metodo que devuelve el numero de empleados var getNumeroEmpleados = function (res){ client.get("http://localhost:8080/rest-ws/rest/empleado/count", function (data, r) { var renderHtml = require( './render-html.js' ); renderHtml.generaPaginaNumeroEmpleados(res, data); }); }; //Metodo que devuelve la lista de empleados var getListaEmpleados = function (res){ client.get("http://localhost:8080/rest-ws/rest/empleado/list", function (data, r) { var renderHtml = require( './render-html.js' ); renderHtml.generaPaginaListaEmpelados(res, data); }); }; //Metodo que devuelve la lista de empleados coincidentes var getListaEmpleadosCoincidentes = function (req, res){ var paramsPetic = url.parse(req.url,true).query; var urlPetic = "http://localhost:8080/rest-ws/rest/empleado/find?"; if (paramsPetic.nombre!=""){ urlPetic += "nombre=" + paramsPetic.nombre; } if (paramsPetic.ape1!=""){ urlPetic += "&ape1=" + paramsPetic.ape1; } if (paramsPetic.ape2!=""){ urlPetic += "&ape2=" + paramsPetic.ape2; } if (paramsPetic.email!=""){ urlPetic += "&email=" + paramsPetic.email; } console.log(urlPetic); client.get(urlPetic, function (data, r) { var renderHtml = require( './render-html.js' ); renderHtml.generaPaginaListaEmpelados(res, data); }); }; //Exportamos los metodos publicos module.exports.getNumeroEmpleados = getNumeroEmpleados; module.exports.getListaEmpleados = getListaEmpleados; module.exports.getListaEmpleadosCoincidentes = getListaEmpleadosCoincidentes;
render-html.js
El código de la libería encargada de montar las páginas HTML sería:
var generaPaginaInicio = function (res){ res.writeHead(200, {'Content-Type': 'text/html'}); res.write("<?xml version='1.0' encoding='UTF-8'?>"); res.write("<!DOCTYPE html>"); res.write("<html lang='es' xmlns='http://www.w3.org/1999/xhtml'>"); res.write("<head>"); res.write(" <meta http-equiv='Content-type' content='text/html; charset=UTF-8'/>"); res.write(" <meta name='language' content='es'/>"); res.write("</head>"); res.write("<body>"); res.write("<h3> Primer miniportal en Node.js.</h3>"); res.write(" <ul>"); res.write(" <li><a href='/numeroEmpleados'>Numero de empleados</a></li>"); res.write(" <li><a href='/listaEmpleados'>Lista de empleados</a></li>"); res.write(" <li><a href='/formBuscaEmpleados'>Buscar de empleados</a></li>"); res.write(" </ul>"); res.write("</body>"); res.end(); }; var generaPaginaNumeroEmpleados = function (res, data){ //Montamos la página de respuesta res.writeHead(200, {'Content-Type': 'text/html'}); res.write("<?xml version='1.0' encoding='UTF-8'?>"); res.write("<!DOCTYPE html>"); res.write("<html lang='es' xmlns='http://www.w3.org/1999/xhtml'>"); res.write("<head>"); res.write(" <meta http-equiv='Content-type' content='text/html; charset=UTF-8'/>"); res.write(" <meta name='language' content='es'/>"); res.write("</head>"); res.write("<body>"); res.write("<h3> Hay un total de "+data+" empleados.</h3>"); res.write("</body>"); res.end(); }; var generaPaginaFormBuscaEmpleados = function (res, data){ //Montamos la página de respuesta res.writeHead(200, {'Content-Type': 'text/html'}); res.write("<?xml version='1.0' encoding='UTF-8'?>"); res.write("<!DOCTYPE html>"); res.write("<html lang='es' xmlns='http://www.w3.org/1999/xhtml'>"); res.write("<head>"); res.write(" <meta http-equiv='Content-type' content='text/html; charset=UTF-8'/>"); res.write(" <meta name='language' content='es'/>"); res.write("</head>"); res.write("<body>"); res.write("<h3> Buscador de empleados.</h3>"); res.write("<form action='/listaEmpleadosCoincidentes' method='get'>"); res.write(" Nombre: "); res.write(" <input type='text' name='nombre'><br>"); res.write(" Apellido 1: "); res.write(" <input type='text' name='ape1'><br>"); res.write(" Apellido 2: "); res.write(" <input type='text' name='ape2'><br>"); res.write(" EMail: "); res.write(" <input type='text' name='email'><br>"); res.write(" <input type='submit' value='Submit'>"); res.write(" </form>"); res.write("</body>"); res.end(); }; var generaPaginaListaEmpelados = function (res, empleados){ //Montamos la página de respuesta res.writeHead(200, {'Content-Type': 'text/html'}); res.write("<?xml version='1.0' encoding='UTF-8'?>"); res.write("<!DOCTYPE html>"); res.write("<html lang='es' xmlns='http://www.w3.org/1999/xhtml'>"); res.write("<head>"); res.write(" <meta http-equiv='Content-type' content='text/html; charset=UTF-8'/>"); res.write(" <meta name='language' content='es'/>"); res.write("</head>"); res.write("<body>"); res.write("<h3> tabla de empleados.</h3>"); res.write("<table>"); res.write(" <tr>"); res.write(" <th>ID</th>"); res.write(" <th>NOMBRE</th>"); res.write(" <th>APELLIDO 1</th>"); res.write(" <th>APELLIDO 2</th>"); res.write(" <th>EMAIL</th>"); res.write(" </tr>"); for (var i = 0; i < empleados.lista.length; i++) { var emp = empleados.lista[i]; res.write(" <tr>"); res.write(" <td>"); res.write(emp.id); res.write(" </td>"); res.write(" <td>"); res.write(emp.nombre); res.write(" </td>"); res.write(" <td>"); res.write(emp.ape1); res.write(" </td>"); res.write(" <td>"); res.write(emp.ape2); res.write(" </td>"); res.write(" <td>"); res.write(emp.email); res.write(" </td>"); res.write(" </tr>"); } res.write("</table>"); res.write("</body>"); res.end(); }; //Exportamos los metodos publicos module.exports.generaPaginaInicio = generaPaginaInicio; module.exports.generaPaginaNumeroEmpleados = generaPaginaNumeroEmpleados; module.exports.generaPaginaListaEmpelados = generaPaginaListaEmpelados; module.exports.generaPaginaFormBuscaEmpleados = generaPaginaFormBuscaEmpleados;
Ejecución y pruebas
En la carpeta donde tengamos los tres ficheros javascrip del ejemplo tendremos que levantar el servidor con:nodejs miserver.js
Seguidamente abriremos un lavegador y teclearemos la URL:
http://localhost:8888/
Con esto ya tendríamos el portal funcionando y podríamos hacer pruebas
No hay comentarios:
Publicar un comentario