hacer un sitio con Opencms y postgres

Hacer un sitio con OpenCms y postgres

Debido a unas consideraciones de diseño decidí utilizar Opencms con MySql como contenedor  y postgres como base de datos de la aplicación.

Nota : este ejercicio fue probado en Mandriva 2010 y Ubuntu 11.04

Para tal efecto programé postgres para usarla on TCP/IP.

Cree una carpeta de nombre BACKOFFICE en:
/system/modules/co.com.miSitio/elements/


En esta carpeta coloque el archivo que establece la conexion desde OpenCms con postgres, en:


/system/modules/co.com.miSitio/elements/BACKOFFICE/Conexion.jsp

el archivo es :

Conexion.jsp

Puede cortar y pegar libremente el contenido entre lineas 
Nota : Recordar que en OpenCms NO se le coloca la extension .jsp él la coloca
por defecto, si lo hace luego no encuentra el archivo pues intermente lo graba
como Conexion.jsp.jsp
----------------------------------------------------------------------------------------------------------
<%--                  ***   Conexion  ***

       Carlos Arturo Castano
        18/03/2011
        Establece una Conexion y Desconexion con una Base de Datos

        Recuerde que JAVA no trabaja con Socket en su lugar usa
        tcp/ip por lo tanto la base de datos que se va usar debe
        estar preparada para esto.


        Este archivo permite conectar por socket tanto mySql como postgres


        En ambos casos hay que preparar las bases de datos para que trabaje     
        por socket, mas abajo hay una breve explicación de los pasos a tener
        en cuenta en cada caso.     
        La seleción de la base de datos que se va usar está en la variable :
        BASEdeDatos la cual conjuntamente con otras variable que necesitamos       
        definir la colocamos en un archivo de nombre Entorno.jsp que definiremos
        lmas tarde.

        en escencia los pasos siguiente son los mismos para las dos bases de datos


        eventualmente dependiendo de la version hay cambios en el uso de las variables y su
        conformacion por ejemplo en algunas versiones de postgres usan:
        tcp_ip = 1 ó tcpIP= true o cualquier otra presentación pero el efecto es el mismo
        busque en su distribución la conformacion correcta, tambien puede usar la opción -I en el inicio
       del  servidor de bases de datos

       Postgres :
           Parametros para Inicio de la Base de Datos
           No olvidar cambiar en /var/lib/pgsql/data/postgresql.conf
           tcp_ip=1
           para que postgres pueda abrir comunicacion con tcp_ip
           en el /var/lib/pgsql/data/pg_hba.conf asignar el acceso
           al servidor

           NOTA:
           A partir de la version 8,3 de postgres el parametro tcp_ip en /var/lib/pgsql/data/postgresql.conf no
          aparece en y en su lugar esta comentada la suiguiente linea.

          #listen_adresses = 'localhost' 
         debe ser descomentada y cambiar local host por * que significa que es para todas las direcciones asi:
          listen_adressess = '*'

         y en /var/lib/pgsql/data/pg_hba.conf

# TYPE     DATABASE    IP_ADDRESS    MASK  AUTH_TYPE  AUTH_ARGUMENT
           local      all          127.0.0.1/32                              ident

         cambiar a

         host all all 127.0.0.1/32 trust    
         es decir cambiamos el METHOD de ident a trust
               mySql:
          crear un usuario que tenga todos los privilegios.
          asi para poder sorterar el problema del socket:

          GRANT ALL PRIVILEGES ON *.* to '[USER]'@'[HOSTNAME]'
          IDENTIFIED BY '[PASSWD]'

          # mysql -u root mysql

          mysql> GRANT ALL PRIVILEGES ON *.* to 'miusuario'@'localhost'
          IDENTIFIED BY 'oficyna'      ;
          mysql> FLUSH PRIVILEGES      ;

          observe que el usuario es miusuario y que el equipo desde el
          cual se obtienen los datos es localhost, totalmente
          cualificado, observe tambien las comillas antes y despues de
          @ y el passwd es miusuario=IDENTIFIED

          # mysql -u root mysql

          mysql> GRANT ALL PRIVILEGES ON *.* to 'miusuario'@'localhost'
            IDENTIFIED BY 'miusuario'         ;
          mysql> FLUSH PRIVILEGES        ;

         observe que el usuario es miusuario y que el equipo desde el cual se
         obtienen los datos es localhost, totalmente
         cualificado, observe tambien las comillas antes y despues de @
         a partir de la version 5.0 de mysql,tiene

         MYSQLD_OPTIONS="--skip-networking"

         la cual puede aparecer en el /etc/rc.d/init.d/mysqld o en         
         /etc/sysconfig/mysqld, o en /etc/my.cnf ests instruccion impide que se pueda
         hacer una conexion TCP/IP, por lo tanto hay que comentarla para poder establecer las conexiones

--%>

<%!
   public final synchronized void Conexion()         
   {
    StringBuffer SqlSbC  = new StringBuffer()                         ;
    try
      {
       if (BASEdeDATOS.equals("postgres"))
      {
          SqlSbC  = new StringBuffer()                                       ;
          SqlSbC.append("jdbc:postgresql:")                               ;
          SqlSbC.append(usuarioDB)                                         ;
          String dataBase = SqlSbC.toString()                             ;

           Class.forName("org.postgresql.Driver")                        ;
           if (conexion == null)
             {
               conexion = DriverManager.getConnection(
                                   dataBase,"postgres","oficyna")              ;
               Close()                                                                     ;
               st = conexion.createStatement()                                ;
             }
           else
             {
               conexion = DriverManager.getConnection(
                                   dataBase,"postgres","oficyna")             ;
               st = conexion.createStatement()                               ;
             }  
          }
       if (BASEdeDATOS.equals("mySQL"))
      {
          SqlSbC  = new StringBuffer()                                       ;
          SqlSbC.append("jdbc:mysql:///")                                   ;
          SqlSbC.append(usuarioDB)                                          ;
          String dataBase = SqlSbC.toString()                              ;

           // Existen los 2 Driver ambos trabajab bien 
           // Class.forName("org.gjt.mm.mysql.Driver")                 ;

           Class.forName("com.mysql.jdbc.Driver")                      ;
           if (conexion == null)
             {
               conexion =DriverManager.getConnection
                                       (dataBase,"oficyna","oficyna")         ;
               Close()                                                                   ;
               st = conexion.createStatement()                              ;
             }  
           else
             {
               conexion =DriverManager.getConnection
                                       (dataBase,"oficyna","oficyna")         ;
               st = conexion.createStatement()                              ;
             }
      }
       }
       catch(Exception e)
         {
           bufferError.append("<table><tr><td bgcolor=yellow>")         ;
           bufferError.append("<font color=red>")                                  ;
       bufferError.append("Error al crear Conexion: " + SqlSbC + e)     ;
           bufferError.append("</font></td></tr></table>")                     ;
         }   
   }
                                                                            
   public final synchronized void Close()         
   {
    try
      {
       if (rt != null)
         {
           rt.close()                                                         ;
         } 
       if (st != null)
         {
           st.close()                                                         ;
         } 
       if (pst != null)
         {
           pst.close()                                                        ;
     } 
      }
    catch(Exception e)
      {
         bufferError.append("<table><tr><td bgcolor=yellow>")    ;
         bufferError.append("<font color=red>")                             ;
         bufferError.append("Error al cerrar Conexion: " + e)           ;
         bufferError.append("</font></td></tr></table>")                ;
      }
   }   
%>

------------------------------------------------------------------------------------
En la misma carpeta creamos
/system/modules/co.com.miSitio/elements/BACKOFFICE/Entorno.jsp

Entorno.jsp
 Puede cortar y pegar libremente el cotenido entre lineas
Nota : Recordar que en OpenCms NO se le coloca la extension .jsp él la coloca
por defecto, si lo hace luego no encuentra el archivo pues intermente lo graba
como Entorno.jsp.jsp
-------------------------------------------------------------------------------------

<%!
    //  Carlos Arturo Castano
    //  19/03/2011
    //                 Defina la Base datos
    //          Descomentando la que va usar y comente las demas
    // -----------------------------------------------------------------------

    // static final String   BASEdeDATOS  = "mySQL"            ;
       static final String   BASEdeDATOS  = "postgres"           ;


    // -----------------------------------------------------------------------

    private StringBuffer  bufferError   = new StringBuffer()       ;
    private String            camposDB     = new String()             ;
    private Connection    conexion        = null                           ;

    private String            groupByDB    = new String()             ;
    private String            orderByDB     = new String()            ;
    private PreparedStatement pst                                           ;
    private ResultSet       rt                                                      ;
    private Statement      st                                                      ;
    private String            sqlDB              = new String()           ;
    private String            tablaDB           = new String()           ;
    private String            usuarioDB       = "backoffice"            ;
    private String            valoresDB       = new String()            ;
    private String            whereDB         = new String()            ;
%>
-----------------------------------------------------------------------------------
Ahora haces uso de estos dos archivos en un archivo de aplicacion que
simplemente mediante un select pone a disposicíon de un usuario las ciudades
capitales de Colombia

Antes, desde luego debemos crear la tabla que contenga dicha información.

en el ejemplo que estamos desarrollando llame la base como backoffice y la
ciudades


 Recuerde ejecutar este scrip como Super Usuario POSTGRES
 Normalmente este es postgres

 de permsisos a esta carpeta para que la creacion pueda grabar los
 log de reporte de creacion de las bases de datos backpffice.

 asi :

 su postgres
 ./crearbases.sh
 exit

archivo:
crearbases.sh

Puede cortar y pegar libremente el contenido entre lineas


---------------------------------------------------------------------------------------
psql -d template1 -c 'drop database backoffice'
psql -d template1 -c 'create database backoffice'
psql backoffice -f tablas.sql 2>tablas.log
psql backoffice -f datos.sql  2>datos.log
---------------------------------------------------------------------------------------

el archivo tablas.sql  crea propiamente la tabla ciudades y el archivo
datos poblará la tabla con el nombre  de las ciudades.

archivo:

tablas.sql

Puede cortar y pegar libremente el cotenido entre lineas

----------------------------------------------------------------------------------------
CREATE TABLE CIUDADES      (
                             Registro VARCHAR(20)    DEFAULT ' ' ,
                               Ciudad VARCHAR(50)    DEFAULT ' '
                           );                           
----------------------------------------------------------------------------------------


datos.sql

Puede cortar y pegar libremente el cotenido entre lineas

----------------------------------------------------------------------------------------
INSERT INTO CIUDADES (Ciudad) VALUES ('Arauca') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Armenia') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Barranquilla') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Bogota') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Bucaramanga') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Cali') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Cartagena') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Cucuta') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Florencia') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Ibague') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Leticia') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Manizales') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Medellin') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Mitu') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Mocoa') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Monteria') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Neiva') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Pasto') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Pereira') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Popayan') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Puerto Carreno') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Puerto Inirida') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Quipdo') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Riohacha') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('San Andres') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('San Jose del Guaviare') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Santa Marta') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Sincelejo') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Tunja') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Valledupar') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Villavicencio') ;
INSERT INTO CIUDADES (Ciudad) VALUES ('Yopal') ;
------------------------------------------------------------------------------------

Si todo nos  salió bien debemos tener 2 archivos Conexion.jsp y Entorno.jsp
en la carpeta ../elements/BACKOFFICE  y la tabla ciudades creada en
base de datos backoffice.

ahora veamos el pequeno programa de aplicacion que permite seleccionar
la ciudad

archivo:
grabar el siguiente demo en ../templates

entrarCiudades.jsp

Puede cortar y pegar libremente el cotenido entre lineas

-----------------------------------------------------------------------------------
<%@page buffer="none" session="false" import="java.util.*" %>
<%@ taglib prefix="cms" uri="http://www.opencms.org/taglib/cms" %>

<%@ page language="java"
    session="false"
    import ="java.io.*"
    import ="java.sql.*"
    import ="java.net.*"
    import ="java.util.*"
%>

<%@ include file="../elements/BACKOFFICE/Entorno.jsp"      %>
<%@ include file="../elements/BACKOFFICE/Conexion.jsp"    %>

<%
    Conexion()                                                              ;
%>


<html>
  <head> 
    <script>
      function irCiudad()
        {
         var indice = document.listaDeCiudades.ciudades.selectedIndex
         var valor  = "../CIUDADES/" + document.listaDeCiudades.ciudades.options[indice].value.toLowerCase()
         if (indice != 0)
           {
            document.location = valor;
           }
         endif  
        } 
    </script> 
  </head>

  <style type="text/css">
   .entrarCiudades
    {
      position: absolute;
      top     :   490px ;
      left    :   666px
    }
  </style>
 
    <form name  ="listaDeCiudades"
        method  ="post"
        enctype ="text/plain"
    >

    <div class="entrarCiudades">          
           <select style="width: 120px;"
                   name="ciudades"
                   size="1"
                   onchange="irCiudad()"
           >
           <%
             StringBuffer sqlSbE = new StringBuffer()             ;
             String       ciudadS= new String()                         ;
             String       titulo = new String()                             ;
             String       valor  = new String()                            ;
                try
                {
                   sqlSbE.append(" SELECT ")                         ;
                   sqlSbE.append("Ciudad")                              ;
                   sqlSbE.append(" FROM ")                            ;
                   sqlSbE.append(" CIUDADES ")                    ;
                   sqlSbE.append(" ORDER BY ")                    ;
                   sqlSbE.append("Ciudad")                              ;
                   rt = st.executeQuery(sqlSbE.toString())          ;
                   while (rt.next())
                     {
                       ciudadS  = rt.getString(1)                           ;
                       titulo   = ciudadS.trim()                              ;
                       valor    = ciudadS                                      ;

                       if (titulo.equals("Medellin"))
                         {
                       %>
                         <option selected value='<%=valor%>'> <%=titulo%>
                       <%
                         }
                       else
                         {
                       %>
                         <option value='<%=valor%>'> <%=titulo%>
                       <%
                         }
                     }
                }
              catch(Exception e)
                {
                   out.println("error Leyendo Ciudad: " + e)              ;
                }
           %>
           </select>
        </div> 
</form>

</html>

----------------------------------------------------------------------------------------

Recordar que en el archivo entrarCiudades.jsp  las intrucciones
siguientes son relativas , al punto donde esta el archivo y el
lugar donde pusimos los archivos Entorno.jsp y Conexion.jsp

<%@ include file="../elements/BACKOFFICE/Entorno.jsp"      %>
<%@ include file="../elements/BACKOFFICE/Conexion.jsp"    %>

por lo tanto si se desea mover el archivo a un sitio diferente tenga en cuenta este
hecho y ajuste la direccion.


Imagen generada por select con Posgres en OpenCms

Comentarios

Entradas populares