miércoles, 23 de diciembre de 2009
viernes, 18 de diciembre de 2009
Añadir nuevo campo a una tabla existente
ALTER TABLE NOMBRE_TABLA ADD(nombre_campo tipo);
jueves, 3 de diciembre de 2009
Migrar la aplicacion a Tomcat6
Le he metido el tomcat 6 y he arrncado y me ha aparecido el siguiente error:
java.lang.LinkageError: loader constraints violated when linking javax/el/ExpressionFactory
class.
Al mirar en internet he encontrado que es un conflicto de la libreria EL, para ello le pusieramos un scope provided. Lo hice y me dejo de salir este error.
Normalmente suele ser el-api.jar y el-ri.jar para saber cual tenemos que excluir miramos en el lib de tomcat cual tenemos.
martes, 17 de noviembre de 2009
Crear un hilo
Vamos a imaginarnos un proyecto en el que tenemos un enlace llamado "Importar Datos" al pinchar sobre se no va a un método que su código seria seria similar al siguiente:
public String actionImportarDatos(){
Thread hilo = new Thread() {
public void run() {
******* lineas de código para la inserción de datos ***********
}
};
hilo.start();
return null;
}
Esto nos servirá por ejemplo si después de pulsar el enlace queremos seguir navegando por la aplicación sin que se interrumpa la importación de datos.
Datamart
Un datamart es un DataWarehouse a un nivel más pequeño.
Un datamart tendrá tablas llamadas DIMENSIONES y otras tablas llamadas de HECHO o FACT TABLE, estas tablas tendrán todas las combinaciones posibles de dichas DIMENSIONES.
También tendremos tablas detalles estas tablas son por ejemplo, tengo una tabla llamada empresa, otra tabla llamada datos personales y en empresa hay un id que hace referencia a datos personales, pues unimos estas dos tablas en una y será la de detalles.
La tabla de HECHO también llamada agregada, es la tabla central de un sistema dimensional. Esta tabla es final no se puede crear mas a partir de ella.Esta tablas su claves serna los id relaciones con las tablas que estan relacionadas.
Por ejemplo tengo una tabla empresas, otra operaciones, otra provincia, otra clientes pues la tabla hecho seria una tabla con los id de cada tabla mas alguno campos necesarios dependiendo de lo que queramos mostrar. Serán datos numéricos que se pueden resumir para proporcionar información sobre el historial de las operaciones de la organización.
Modificar nombre y tipo de una columna
ALTER TABLE nombre_tabla RENAME COLUMN columna_antigua TO columna_nueva;
ALTER TABLE nombre_tabla MODIFY columna tipo_nuevo;
viernes, 13 de noviembre de 2009
Dependencias de un jar
Para ello me he descargado la librería la he descomprimido, he entrado en la carpeta META-INF/MANIFEST.MF.
Lo abrimos , abrimos un navegador y entramos en esta dirección http://mvnrepository.com, aquí buscamos la librería , entramos dentro y comparamos los manifiest y vemos que tienen el mismo tamaño y las mismas cosas, si copiamos el codigo con groupId,artifactId que no viene en esa página en nuestro pom.xml ,hacemos maven para que se la descargue y ya tenemos nuestra librería en el proyecto.
miércoles, 11 de noviembre de 2009
Crear una tarea a una hora determinada
La clase TimerTask tiene un metodo run que es como los Thread, lo que contiene el metodo run es lo que se va a ejecutar cada cierto periodo.
La clase Timer la utilizamos para para programar tareas para ejecutar en el futuro en un hilo de fondo. Las tareas se pueden programar para un tiempo de ejecución, o para la ejecución repetida a intervalos regulares.
En mi proyecto lo he colocado en la clase que arranca el proyecto, dentro de esa clase me he creado un clase interna:
class ImportarDatos extends TimerTask {
public void run() {
//// Damos baja prioridad al hilo
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
*********************tareas a realizar*****************************
}
Y dentro de la clase del listener me he creado lo siguiente:
System.out.println("*************************************");
System.out.println("* Iniciando recarga Datos...*");
System.out.println("*************************************");
try{
Timer timer= new Timer();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR, 2);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.AM_PM, 0);
Date date = calendar.getTime();
timer.schedule(new ImportarDatos(), date, 24 * 60 * 60 * 1000);
}catch (Exception e) {
log.debug("Error no controlado");
}
System.out.println("");
Cada vez que arranque la aplicacion se ejecutara esta tarea y tambien a la hora que le hmos puesto, hay que saber que la hora es una menos si yo he puesto a las 2 de la madrugada se ejecutara a la 1.
viernes, 6 de noviembre de 2009
Creando nueva base de datos
Nosotros nos creamos unos ficheros para luego utilizarlos en la instalación.
Los ficheros que nos creamos son:
- Crear fichero con las tablas.
- Crear fichero con las constraints de las tablas.
- Crear fichero con los índices necesarios.
- Crear fichero con las secuencias de las tablas.
- Crear fichero con los triggers.
- Crear fichero con los views.
- Crear fichero con los insert de las tablas.
- Crear fichero con los permisos a las tablas
- Crear ficheros de sinónimos.
Fichero de las tablas
En este fichero vamos a tener la instrucción siguiente para crear las tablas que necesitemos:
CREATE TABLE NOMBRE_TABLA(
campo1 tipo de variable (number, varchar,.....) null or not null,
campo2 tipo de variable (number, varchar,.....) null or not null,
campo3 tipo de variable (number, varchar,.....) null or not null,
....... tipo de variable (number, varchar,.....) null or not null,
);
Fichero con las constraints
La cláusula constraints la utilizamos para crear o eliminar índices que pueden ser único o múltiples.
Puede ir seguido de:
- UNIQUE --> para decir que el valor de ese campo es único
- PRIMARY KEY -->crea un índice primario el campo o los campos especificados. Todos los campos de la clave principal deben ser únicos y no nulos, cada tabla sólo puede contener una única clave principal.
- FOREIGN KEY -->crea un índice sobre el campo cuyo valor sera el contenido de otro campo de otra tabla o de la misma. Puede ser null y se pueden crear varias claves ajenas
ALTER TABLE NOMBRE_TABLA ADD (
CONSTRAINT PK_NOMBRE_TABLA PRIMARY KEY (campo));
Fichero de los índices
Yo me he creado un fichero de índices para las tablas que tiene muchos datos , así las búsquedas serán más rápidas,los índices se crean sobre el o los campos que vayamos mas a utilizar, la sentencia para crear índices es la siguiente:
CREATE UNIQUE INDEX NOMBRE_INDICE ON TABLA(campo);
Fichero de las secuencias
Para la generación de códigos numéricos automáticos utilizamos las secuencias
CREATE SEQUENCE
[MINVALUE ] -->valor mínimo de la secuencia
[MAXVALUE ]--> valor máximo de la secuencia
[START WITH ]--> por el numero que va a empezar la secuencia
[INCREMENT BY ] --> valor que va a incrementar cada vez que insertemos
[NOCACHE | CACHE ]--> se utiliza para que la generación de secuencia vaya mas rápido
[CYCLE] ;-->nocycle or cycle, si ponemos cycle cuando llega al MAXVALUE volvera a empezar desde el MINVALUE, esto puede que no cree exclusividad y si ponemos nocycle nos saldrá un error:
RDB%-E-SEQNONEXT, el siguiente valor para la secuencia "NOMBRE SECUENCIA" no está disponible.
Ficheros con los triggers
Los triggers son disparadores que se ejecuta cuando se cumple una condición establecida al realizar un INSERT, UPDATE o DELETE.
Si vamos a necesitar triggers nos creamos este archivo, la sintaxis de un trigger con update podría ser la siguiente:
CREATE TRIGGER nombre_trigger
BEFORE UPDATE ON nombre_tabla
REFERENCING NEW ROW AS campo,OLD ROW AS campo
FOR EACH ROW
condición THEN
END IF;
Fichero de views
Las vistas (views) son consultas, que refleja el contenido de una o más tablas, desde la que se puede acceder a los datos como si fuera una tabla. Así obtenemos seguridad en nuestras tablas sino queremos que el usuario acceda a otras datos de las tablas.O nos evitamos el escribir complejas sentencias sql.
Fichero de insert
En este fichero vamos a tener las sentencias sql de inserción de datos de las tablas.
Fichero de permisos (grant)
Concede permiso a un usuario sobre las tablas o vistas. Permiso de SELECT,INSERT, DELETE o UPDATE.
Ficheros de sinónimos
Este fichero contiene las sentencia de creación de sinónimos sobre las tablas o vistas, esto quiere decir que una tabla o vista puede tener dos nombre diferentes, el de la tabla y el de sinónimo que hace referencia a esa tabla. Los sinónimos nos proporciona la ventaja de independizar las tablas físicas de las aplicaciones y que un usuario acceda a otra tablas de otro usuario si tiene permisos para ello.
martes, 3 de noviembre de 2009
Barra de progreso con Rich Faces
Para ello he utilizado las etiquetas siguiente:
y el metodo en mi clase que hace la importacion es :
public String actionImportarDatos(){
progreso = 1;
enProgreso = true; //sino esta a true no sale la barrita
List
listadoDatosImportar =método para rellenar esta lista con los datos que voy a importar;
total = listadoDatosImportar.size();
for (DatosIMportar datos : listadoDatosImportar) {
progreso++;
BO. save(datos); //en el BO tengo un metodo que guarda ese dato importado en la tabla.
}
mensaje = "Libros importados correctamente";
return null;
}
public int getPorcentaje() {
try {
return Math.min(progreso * 100 / total, 100);
} catch (ArithmeticException e) {
return 0;
}
}
jueves, 22 de octubre de 2009
Primeros pasos con Pentaho Report Designer
Me descargue la version 1.7 Pentaho Report Designer y empece a hacer pruebas con la aplicación.
Voy a explicar lo que he aprendido hasta ahora, pues llevo con esto desde ayer.
La carpeta que me baje tenia 3 archivos :
- startdesigner.bat --> windows
- startdesigner_linux.sh --> linux
- startdesigner_osx.sh --> mac
Vemos a la izquierda un menu lateral que contiene los elementos de diseño como gráficas lineas etc..., que puede tener un reporte.
Para crear un reporte nuevo , le damos a File Report Wizar para darle formato al reporte y la base de datos que vamos a utilizar.
Si le damos ala pestaña Design que hay en el centro de la aplicacion nos vamos directamente al reporte con el diseño basico y para decirle que base de datos vamos autilizar en la parte derecha donde pone Data Source pinchamos con el boton derecho y elegimos Añadir.
Para elegir la base de datos nos saldra una pantalla similar a la siguiente:
En esta pantalla podemos elegir entre 3 tipos de bases de datos:
- JNDI
- Xquery
- MQL
Metemos los datos necesario y se nos añade al listado.
Para realizar una consulta sore la cula queremos el inform le damos a "Query Designer" :
Abajo a la izquierda nos saldra un listado con las tablas de nuestra base de datos, para hacer la consulta sobre la o las que queramos pinchamos sobre ella y la arrastramos a la parte derecha.
Sobre las tablas que hemos elegido podemos selecionar los campos que quermos que se muestren en el report y realizar operacion de sum(), conunt() etc.. sobre los campos.
Para ello nos ponemos encima del campo y pinchamos boton derecho. También podemos escribir la query a mano.
Una vez hecho la consulta le damos a Ok y se nos abre la pantalla con los datos elegido, podemos meterle grafico lineas, etc.... para ello elegimo de la paleta izquierda el componente a añadir y lo arrastramos al centro.
Cuando tengamos listo el reporte le damos a File /Create Report.
En otro explicare el crear un gráfico.
miércoles, 14 de octubre de 2009
Datamart
Por tanto, para crear el datamart de un área funcional de la empresa es preciso encontrar la estructura óptima para el análisis de su información, estructura que puede estar montada sobre una base de datos OLTP, como el propio datawarehouse, o sobre una base de datos OLAP. La designación de una u otra dependerá de los datos, los requisitos y las características específicas de cada departamento. De esta forma se pueden plantear dos tipos de datamarts:
- Datamart OLAP --> Se basan en los populares cubos OLAP, que se construyen agregando, según los requisitos de cada área o departamento, las dimensiones y los indicadores necesarios de cada cubo relacional. El modo de creación, explotación y mantenimiento de los cubos OLAP es muy heterogéneo, en función de la herramienta final que se utilice.
- Datamart OLTP -- >Pueden basarse en un simple extracto del datawarehouse, no obstante, lo común es introducir mejoras en su rendimiento (las agregaciones y los filtrados suelen ser las operaciones más usuales) aprovechando las características particulares de cada área de la empresa. Las estructuras más comunes en este sentido son las tablas report, que vienen a ser fact-tables reducidas (que agregan las dimensiones oportunas), y las vistas materializadas, que se construyen con la misma estructura que las anteriores, pero con el objetivo de explotar la reescritura de queries (aunque sólo es posibles en algunos SGBD avanzados, como Oracle).
Información sacada del siguiente enlace:
http://www.sinnexus.com/business_intelligence/datamart.aspx
Alterian
Para ello el SGBD indexas las columnas y traspone las filas de las tablas por columnas.
miércoles, 7 de octubre de 2009
lunes, 28 de septiembre de 2009
Lenguaje Ensamblador
lunes, 21 de septiembre de 2009
Manual de Log4j
http://emmersonmiranda.blogspot.com/2009/09/manual-de-log4j-1215.html
martes, 8 de septiembre de 2009
lunes, 31 de agosto de 2009
SimpleDateFormat
Si queremos por ejemplo obtener un fecha en formto dd/mm/aaaa seri de la siguente forma:
SimpleDateFormat parsear = new SimpleDateFormat("dd/MM/yyyy");
pasear.format(fecha);
Donde fecha es la que vamos a formatear.
Podemos realizar otras funciones para mas información mirar en la API
jueves, 6 de agosto de 2009
Tipos de Threads
* Threads completamente independientes, que realizan tareas no relacionadas. Como el caso de imprimir un documento.
* Threads que trabajan con una misma tarea, es decir se ayudan entre ellos, pero sin interferir ni intercambiar relación entre ellos. Por ejemplo, threads que colaboran en el producto de dos matrices, ocupándose cada una de ellas de calcular ciertas filas de la matriz producto.
* Threads que utilizan recursos de modo mutuamente exclusivo, aunque sin tener que coordinar sus actividades. Este ocurre en los threads que intentan leer o actualizar un registro en la base de datos.
* Threads que deben coordinar sus actividades, de modo que una de ellas no puede empezar o continuar hasta que la otra haya realizado su tarea. Un ejemplo muy conocido es el problema del productor-consumidor .
Threads
Utilizamos los threads en un programa para aislar y sincronizar tareas.Cada hilo se encarga de una parte del programa, por ejemplo:
- tranferencia de ficheros
- pintar los graficos
- conectar a la base de datos.
La clase Thread desciente de Object e implementa la interface Runnable y no es necesario importarlas a nuestro programa ya que se encuentran dentro del paquete java.lang.
Método sleep()
Se debería utilizar cuando se pretenda retrasar la ejecución del hilo.
El sleep() no consume recursos del sistema, mientras duerme el hilo, los demás hilos se siguen ejecutando sin problema alguno
viernes, 24 de julio de 2009
Leer Pdf desde Java
Mediante lineas de comando convertimos el pdf en un archivo de texto.
Aqui tenemos un ejemplo de una clase para Leer PDF
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.util.List;
import org.pdfbox.cos.COSDocument;
import org.pdfbox.pdfparser.
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.pdmodel.
import org.pdfbox.util.
public class LeerPDF {
PDFParser parser;
String parsedText;
PDFTextStripper pdfStripper;
PDDocument pdDoc;
COSDocument cosDoc;
PDDocumentInformation pdDocInfo;
// PDFTextParser Constructor
public LeerPDF() {
}
// Extract text from PDF Document
public String pdftoText(String fileName) {
//System.out.println("Parsing text from PDF file " + fileName + "....");
File f = new File(fileName);
if (!f.isFile()) {
System.out.println("File " + fileName + " does not exist.");
return null;
}
try {
parser = new PDFParser(new FileInputStream(f));
} catch (Exception e) {
System.out.println("Unable to open PDF Parser.");
return null;
}
try {
parser.parse();
cosDoc = parser.getDocument();
pdfStripper = new PDFTextStripper();
pdDoc = new PDDocument(cosDoc);
parsedText = pdfStripper.getText(pdDoc);
} catch (Exception e) {
System.out.println("An exception occured in parsing the PDF Document.");
e.printStackTrace();
try {
if (cosDoc != null) cosDoc.close();
if (pdDoc != null) pdDoc.close();
} catch (Exception e1) {
e.printStackTrace();
}
return null;
}
System.out.println("Done.");
return parsedText;
}
// Write the parsed text from PDF to a file
/* void writeTexttoFile(String pdfText, String fileName) {
System.out.println("\nWriting PDF text to output text file " + fileName + "....");
try {
PrintWriter pw = new PrintWriter(fileName);
pw.print(pdfText);
pw.close();
} catch (Exception e) {
System.out.println("An exception occured in writing the pdf text to file.");
e.printStackTrace();
}
System.out.println("Done.");
}*/
// Extracts text from a PDF Document and writes it to a text file
public static void main(String args[]) {
/* if (args.length != 2) {
System.out.println("Usage: java PDFTextParser ");
System.exit(1);
}*/
LeerPDF pdfTextParserObj = new LeerPDF();
//String pdfToText = pdfTextParserObj.pdftoText(
String pdfToText = pdfTextParserObj.pdftoText("C:
System.out.println(pdfToText);
/* if (pdfToText == null) {
System.out.println("PDF to Text Conversion failed.");
}
else {
System.out.println("\nThe text parsed from the PDF Document....\n" + pdfToText);
// pdfTextParserObj.
pdfTextParserObj.
}*/
}
}
jueves, 2 de julio de 2009
lunes, 29 de junio de 2009
Convertir tipo File a InputStream y viceversa
InputStream is = new FileInputStream (file);
Para convertir de inputstream a file:
byte[] data = IOUtils.toByteArray(inputStream);
File temportal = new File("/tmp/" + nombreFichero);
org.apache.commons.io.FileUtils.writeByteArrayToFile(temportal, data);
lunes, 22 de junio de 2009
Crear Excel desde Java
POI consiste en APIs para manipular varios formatos de ficheros basados en el formato de Documento Compuesto OLE 2 de Microsoft, utilizando Java puro. En concreto, se pueden leer y escribir ficheros MS Excel utilizando Java.
Voy a poner un ejemplo que yo tuve que hacer:
public class Prueba(){
public String actionExportarExcel(){
ExportarUtils exportar= ExportarUtils.getInstance();
Vector v= new Vector();
// cabecera del excel
v.addElement("Cabecera1, cabecera2,....");
v.addElement(dato1, dato2,dato3,........);
// Generar el fichero
try {
exportar.crearExcel(v, "Titulo", "nombreFichero.xls");
} catch (Exception e) {
log.debug(e.getMessage());
}
return null;
}
}//fin de clase
//Clase para la preparacion del fichero Excel
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.StringTokenizer;
import java.util.Vector;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class ExportarUtils {
private ExportarUtils() {
}
public static ExportarUtils getInstance() {
if (singleton == null) {
singleton=new ExportarUtils();
}
return singleton;
}
public static void createCell(HSSFRow row, short i, String value, HSSFCellStyle style) {
HSSFCell cell = row.createCell(i);
value = value+" ";
cell.setCellValue(value);
// si no hay estilo, no se aplica
if (style != null)
cell.setCellStyle(style);
}
public void crearExcel(Vector v, String namesheet, String filename)
throws Exception {
try {
workbook = new HSSFWorkbook();
HSSFSheet sheet=workbook.createSheet("Nueva Hoja");
int filas = v.size();
for (int i = 0; i < filas; i++) {
String fila = (String) v.elementAt(i);
StringTokenizer st = new StringTokenizer(fila, ",");
HSSFRow row = sheet.createRow((short) i);
int j = 0;
while (st.hasMoreTokens()) {
String token = st.nextToken();
// para la cabecera, la primera fila, aplicamos un estilo (negrita y color de fondo azul)
if (i == 0) {
HSSFCellStyle style = workbook.createCellStyle();
//style.setFillForegroundColor(IndexedColors.BLUE_GREY.getIndex()); );
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short)10);
font.setFontName("Courier New");
font.setItalic(true);
// font.setStrikeout(true);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//font.setColor(Short.parseShort("#ffffff"));
style.setFont(font);
createCell(row, (short)j, token, style);
} else
createCell(row, (short)j, token, null);
j = j + 1;
}
}
// Asignar automaticamente el tamaño de las celdas en funcion del contenido
//for (int i = 0; i < filas; i++) {
sheet.setDefaultColumnWidth((short) 55);
// }
// Escribir el fichero.
FileOutputStream fileOut = new FileOutputStream(filename);
workbook.write(fileOut);
fileOut.close();
} catch (Exception e)
{
e.printStackTrace();
}
}
Aui en este enlace bien mejor explicado POI
miércoles, 10 de junio de 2009
Problema con File
File fichero = new File(rutaFichero);
if(fichero.exists()){
}
Pues esto siempre me decía que no existía ese fichero cuando si existía perfectamente.Entonces vi que había una opción de createNewFile() lo utilicé en vez del exists() y esto si me funcionaba, y me dijeron que esto podía ser porque File crea una referencia pero puede ser que todavía no se ha relacionado con el fichero físico y por eso me daba siempre false al comprobarlo con exists().
Una vez hecho esto del createNewFile ya si podemos hacerle el exists().
martes, 9 de junio de 2009
INNER CLASS
Se puede definir una clase embebida de la siguiente forma:
class Externa {
. . .
class Interna {
. . .
}
Una diferencia importante es que un objeto de la clase embebida está relacionado siempre con un objeto de la clase que la envuelve, de tal forma que las instancias de la clase embebida deben ser creadas por una instancia de la clase que la envuelve. Desde el exterior estas referencias pueden manejarse, pero calificandolas completamente, es decir nombrando la clase externa y luego la interna. Además una instancia de la clase embebida tiene acceso a todos los datos miembros de la clase que la envuelve sin usar ningún calificador de acceso especial (como si le pertenecieran).
martes, 26 de mayo de 2009
Interface
Algunas especificaciones para interfaces:
Normas de Nomenclatura
- Clases--> Los nombres de clases deben ser palabras completas, en mayúsculas y minúsculas, con la primera letra de cada palabra en mayúscula. Los nombres de clases deben ser simples y descriptivos, utilizando palabras completas y acrónimos o abreviaturas (a no ser que la abreviatura sea ampliamente conocida, como URL o HTML). Por ejemplo: class Coche ,class EmpresaProductora.
- Interfaces--> Siguen las mismas reglas que las clases. Por ejemplo: interface AlmacenarCoche, class Almacen.
- Métodos-->Los métodos deberían ser verbos, en mayúsculas y minúsculas, con la primera letra en minúscula, y la primera letra de cada una de las palabras internas en mayúscula. Por ejemplo: correr(), numeroRuedas(), pintarCoche().
- Variables--> Todas los nombres de variables de instancia o de clase deben estar constituidos por palabras con la primera letra de la primera palabra en minúscula y la primera letra de las palabras internas en mayúscula.Los nombres de variables deben ser cortos y significativos. La elección de un nombre de variable debe ser mnemotécnico, es decir, pensado para que un lector casual al verla comprenda su uso. Se deben evitar las variables de una sola letra, excepto en variables temporales de corto uso. Nombres comunes para este tipo de variables son: i, j, k, m y n para enteros; c, d y e para caracteres.Por ejemplo: int i; char *cp, float miVariable.
Constantes-->L os nombres de variables declaradas como constantes de clase y constantes ANSI, deberías escribirse siempre en mayúsculas, con las palabras internas separadas por el signo de subrayado ("_"). Las constantes ANSI se deben evitar en lo posible, para facilitar la depuración del código. Por ejemplo int MIN_WIDTH = 4;
miércoles, 20 de mayo de 2009
Métodos y Variables estáticas
comunes para todos los objetos de la clase.
Para acceder a ellos ponemos NombreClase.metodoStatic, no se instancia como los métodos y variables objetos.
No conviene usar muchos métodos estáticos, pues si bien se aumenta la rapidez de ejecución, se pierde flexibilidad, no se hace un uso efectivo de la memoria y no se trabaja según los principios de la Programación Orientada a Objetos.
Para crear atributos o métodos estaticos se usa la palabra static.
static int nombreMetodo(){}
lunes, 18 de mayo de 2009
Errores de lógica
Puede costar encontrarlo y para ello hacemos el debug cuando suceden errores de lógica, para ir viendo pasao a paso el programa y ver donde hemos podio fallar.
Errores de ejecución
Errores de compilación
Variables
Las variables pueden ser de 2 tipos:
- primitivo--> int, char, long,byte,boolean,float,double.Estas variable tiene el valor asignado directamente .
- referenciadas-->no tienen el valor directamente sino que apuntan a una espacio de memoria donde se encuentra el valor,(los objetos).
Clases
Estrcutura de una clase:
acceso class nombre clase{
//cuerpo
}
Las características de una clase son las siguientes:
- 1) Todas las variables y funciones de Java deben pertenecer a una clase.
- 2) Si una clase deriva de otra (extends), hereda todas sus variables y métodos.
- 3) En un fichero se pueden definir varias clases, pero en un fichero no puede haber más que una clase public.
- 6) Si una clase contenida en un fichero no es public, no es necesario que el fichero se llame como la clase.
- 7) Los métodos de una clase pueden referirse de modo global al objeto de esa clase al que se aplican por medio de la referencia this.
- 8) Las clases se pueden agrupar en packages, introduciendo una línea al comienzo del fichero (package packageName;).
Métodos
Un método puede devolver datos o nada, en el caso que no se devuelva nada como tipo de retorno void.
Si el metodo que estamos creando recibe una lista de argumentos la forma de ponerlo seria
acceso tipoRetorno nombre_metodo(TipoVariable arg1, TipoVariable arg2, ....)
Los métodos se crean de la siguiente manera:
acceso tipodeRetorno nombre_método(lista de arguementos){
//cuerpo
}
La llamada al método, se realiza poniendo el nombre y pasandole los argumentos en el caso que tuvieran.Por ejemplo:
int actionCalcular(int num1, int num2){
int suma=0;
suma=num1+num2;
return suma
}
Los método tambien tiene modificadores de acceso.En java hay 4 tipos de accesos a los métodos:
- public-->todo el mundo accede a este método, ya sea desde otra clase, paquete, subclase, ....
- private--> sólo acceden se al método dentro de la misma clase.
- protected-->pueden acceder a este mñetodo los que esten en el mismo paquete, la misma clase y su subclases.
- predeterminado-->pueden acceder la misma clase y los que estén en el mismo paquete.
Constantes
Como es una constante, se le ha de proporcionar un valor en el momento en que se declare, por ejemplo:
class Prueba {
final int version = 1';
. . .
}
Si se intenta modificar el valor de una variable final desde el código de la aplicación, se generará un error de compilación.
Si se usa la palabra clave final con una variable o clase estática, se pueden crear constantes de clase, haciendo de esto modo un uso altamente eficiente de la memoria, porque no se necesitarán múltiples copias de las constantes.
La palabra clave final también se puede aplicar a métodos, significando en este caso que los métodos no pueden ser sobreescritos.
Literales
String nombre--> donde nombre es el literal.
Java utiliza 5 tipos de elementos:
Enteros:
- byte 8 bits complemento a dos
- short 16 bits complemento a dos
- int 32 bits complemento a dos
- long 64 bits complemento a dos
Reales en coma flotante:
- float 32 bits IEEE 754
- double 64 bits IEEE 754
Booleanos:
- true
- false
Caracteres:
Por ejemplo: a \t \u???? [????] es un número unicode
Cadenas:
Por ejemplo: “Esto es una cadena literal”
lunes, 11 de mayo de 2009
Definir mi proyecto como repositorio.
En esa etiqueta ponemos todo lo necesario para conectarsno al repositorio, id, url y mirrorof
viernes, 8 de mayo de 2009
Abstracción
Vamos a ver un ejemplo, el de un automovil, que es que todo el mundo usa a la hora de explicar esto.
Veamos lo que podemos abtraer del automovil:
- marca
- modelo
- nº de puertas
- color
- arrancar.
- frenar.
- acelerar
IBATIS
Puede ser implementado en Java y .NET (también existe un port para Ruby on Rails llamado RBatis).
Asocia objetos de modelo (JavaBeans) con sentencias SQL o procedimientos almacenados mediante ficheros XML, simplificando la utilización de bases de datos.
A diferencia de Hibernate, se necesitan conocimientos de sql, permite la optimización de las consultas, ya sea con lenguaje estándar o con SQL propietario del motor de base de datos utilizado. Con iBATIS, siempre se sabe lo que se está ejecutando en la base de datos, y tiene herramientas para evitar el problema de las “N + 1 consultas” y para generar consultas dinámicas muy potentes.
Se configura mediante un fichero XML de configuración, sql-map-config.xml.
Además cada objeto de modelo, que representa al objeto en la aplicación, se relaciona con un fichero del tipo sqlMap.xml, que contiene sus sentencias SQL. Por ejemplo, un objeto Java Usuario con un objeto XML usuario.xml.
Es posible subdividir la capa de Persistencia en tres subcapas:
- La capa de Abstracción será el interfaz con la capa de la lógica de negocio, haciendo las veces de “facade” entre la aplicación y la persistencia. Se implementa de forma general mediante el patrón Data Access Object (DAO), y particularmente en iBATIS se implementa utilizando su framework DAO (ibatis-dao.jar).
- La capa de Framework de Persistencia será el interfaz con el gestor de Base de Datos ocupándose de la gestión de los datos mediante un API. Normalmente en Java se utiliza JDBC; iBATIS utiliza su framework SQL-MAP (ibatis-sqlmap.jar).
- La capa de Driver se ocupa de la comunicación con la propia Base de Datos utilizando un Driver específico para la misma.
Toda implementación de iBATIS incluye los siguientes componentes:
martes, 5 de mayo de 2009
Tipos de Clases
- abstract --> esta clase tiene al menos un método abstracto, no se instancia y se utiliza como clase base para herencia. La clase que deriva de esta tiene que declarar e implementar todos los métodos de la clase abstracta que sean abstracto, sino daria un error de compilación. Lo métodos no pueden ser privados o staticos sino no se pueden acceder a ellos. Ejemplo
abstract metodo1();
}
public class Prueba2 extends Prueba{
void metodo1(){ //implementación }
void metodo2(){ //implementación }
- synchronizable --> Este modificador especifica que todos los métodos definidos en la clase son sincronizados, es decir, que no se puede acceder al mismo tiempo a ellos desde distintos threads; el sistema se encarga de colocar los flags necesarios para evitarlo. Este mecanismo hace que desde threads diferentes se puedan modificar las mismas variables sin que haya problemas de que se sobreescriban.
- public -->Las clases public son accesibles desde otras clases, bien sea directamente o por herencia. Son accesibles dentro del mismo paquete en el que se han declarado. Para acceder desde otros paquetes, primero tienen que ser importadas.
- final -->esta se declara como la clase que termina una cadena de herencia. No se puede heredar de una clase final. Por ejemplo, la clase Math es una clase final.
lunes, 4 de mayo de 2009
Calendar
Calendar tiene muchas funciones en común con java.util.Date, lo que diferencia es a la hora de extraer datos, los de java.util.Date están obsoletos, y si manejamos algunos de estos métodos en realidad esas accediendo a funcionalidades de la clase Calendar.
El método getInstance() nos devuelve una subclase de Calendar con la hora actual, y usamos el método set( ) para cambiar a la fecha.
Tenemos que tener en cuenta que no todos los calendarios tienes años de 365 o 12 meses y a la hora de realizar operaciones tenemos que utilizar las subclases adecuadas el tipo de calendario que queramos.
Para extraer los datos tenemos:
- YEAR
- MONTH
- DATE, DAY_OF_MONTH
- HOUR
- MINUTE
- SECOND
Con esta clase podemos sumar varios días sin preocuparnos de calcular luego el año o el mes, lo hace la subclase sola.
Tenemos dos métodos que nos permiten avanzar un tiempo exacto sobre los datos obtenidos anteriormente, add(Constante, valor) y roll(Constante, valor), recordemos que constante es por ejemplo Calendar.MONTH.
Roll() este hay que tener en cuanta que cuando llega al limite inferior o superior de constante cambia al limite contrario sin cambiar los siguientes atributos.
Los que hay que tener en cuenta son add(), get(),set().
lunes, 20 de abril de 2009
JAXWS
JAX-WS es una tecnología para la construcción de servicios web y los clientes que se comunican a través de XML.
JAX-WS permite a los desarrolladores escribir mensajes orientados a RPC, así como orientado a servicios web.
En JAX-WS, una llamada a procedimiento remoto está representado por un protocolo basado en XML, como SOAP.
La especificación SOAP define sobre la estructura, la codificación de normas y convenciones de representación de llamadas a procedimiento remoto y las respuestas. Estas llamadas y respuestas se transmiten como mensajes SOAP (archivos XML) a través de HTTP.
Aunque los mensajes SOAP son complejas, la API de JAX-WS oculta esta complejidad de la aplicación de desarrolladores En el lado del servidor, el desarrollador especifica los procedimientos remotos mediante la definición de métodos de una interfaz escrita en el lenguaje de programación Java. El desarrollador también los códigos de una o más clases que implementan esos métodos.
Los programas cliente también son fáciles de código. Un cliente crea un proxy (un objeto que representa el servicio) y luego simplemente invoca los métodos en el proxy. Con JAX-WS, el desarrollador no generar o analizar mensajes SOAP. Es el tiempo de ejecución JAX-WS sistema que convierte las llamadas a la API y las respuestas y los mensajes de SOAP.
Con JAX-WS, los clientes y los servicios web tienen una gran ventaja: la independencia de la plataforma de lenguaje de programación Java. Además, JAX-WS no es restrictiva: JAX-WS un cliente puede acceder a un servicio web que no se está ejecutando en la plataforma Java, y viceversa.
Esta flexibilidad es posible gracias a JAX-WS utiliza tecnologías definidas por el World Wide Web Consortium (W3C): HTTP, SOAP, y el Lenguaje de descripción de servicios Web (WSDL)
WSDL especifica un formato XML para describir un servicio como un conjunto de parámetros de funcionamiento en los mensajes.
lunes, 13 de abril de 2009
Comandos DDL
- CREATE Utilizado para crear nuevas tablas, campos e índices.
- DROP Empleado para eliminar tablas e índices.
- ALTER Utilizado para modificar las tablas agregando campos o cambiando la definición de los campos.
Comandos DML
- SELECT Utilizado para consultar registros de la base de datos que satisfagan un criterio determinado.
- INSERT Utilizado para cargar lotes de datos en la base de datos en una única operación.
- UPDATE Utilizado para modificar los valores de los campos y registros especificados.
- DELETE Utilizado para eliminar registros de una tabla de una base de datos.
Introducción Sql
Existen dos tipos de comandos para este lenguaje:
- Comandos DDL --> que permiten crear y definir nuevas bases de datos, campos e índices.
- Comandos DML --> que permiten generar consultas para ordenar, filtrar y extraer datos de la base de datos.
Índices
Hay que tener en cuenta:
- Las consultas más frecuentes deberían tener índices. El que hace la aplicación sabe cuál es más frecuente.
- Esto es muy importante con campos VARCHAR, cuya búsqueda no indexada es horrible (FULL SCAN).
- No hay que tener demasiados índices. Nunca 20, por ejemplo. A ser posible, máximo 6 ó 7. Se puede buscar qué consultas son más frecuentes y priorizar.
- Una PK implica un índice.
- Una FK también implica un índice. Es decir, si tenéis una tabla NOTICIA con un ID_TEMA que es FK a la PK de una tabla TEMA (ID_TEMA)... ya tenéis un índice sobre ID_TEMA, no hay que volver a hacerlo.
- los índices deben hacerse para campos que normalmente no deberían permitir valores nulos
Esto es una explicación muy buena de un compañero de mi trabajo.
viernes, 27 de marzo de 2009
CIFS (Common Internet File System)
Es la versión pública y multivendedor del protocolo SMB
He econtrado una definición más tecnica y mas completa:
CIFS define un protocolo de acceso a sistemas de archivos remotos normalizado para uso en redes, permitiendo a los grupos de usuarios trabajar juntos y compartir documentos ya sea a través de Internet o dentro de sus intranets corporativas. Es una tecnología multiplataforma, abierta, basada en los protocolos para compartir archivos de MS Windows y otros sistemas operativos comunes, soportada por UNIX y otros sistemas operativos. En su máxima expresión, CIFS permitiría a millones de usuarios compartir sus archivos sin instalar nuevo software o cambiar su forma de trabajo habitual.
martes, 24 de marzo de 2009
Drupal
Es un sistema de gestión de contenido para sitios Web.Permite publicar artículos, imágenes, u otros archivos y servicios añadidos como foros, encuestas, votaciones, blogs y administración de usuarios y permisos. Drupal es un sistema dinámico: en lugar de almacenar sus contenidos en archivos estáticos en el sistema de ficheros del servidor de forma fija, el contenido textual de las páginas y otras configuraciones son almacenados en una base de datos y se editan utilizando un entorno Web incluido en el producto.(cogido de la wiki).
En resumen:
Drupal es una plataforma increíblemente potente. Su sistema modular y framework básico permiten desarrollos rápidos de sitios con muchas funcionalidades. Todo lo que necesitas es imaginar que quieres construir y empezar a poner una pieza sobre otra.
Es un CMS pero también podría considerarse un framework
miércoles, 4 de marzo de 2009
Añadir un jar Externo
Build Path-->Configure Build Path.
Se nos abre una ventana que son las propiedades del proyecto, y elegimos la pestaña Libraries y pulsamos el botón Add External JARs.
Buscamos donde tengamos el jar, le damos aceptar y listo.
Para agregar jar que están el repositorio.
Es igual que lo de antes pero se pulsa el botón Add Variable.
Vamos a explicar como crear la variable.
Para ello se le pulsa Add variable y le damos a Configure Variables, le ponemos la ruta del repositorio en este caso y un nombre. para esa variable.
Le damos aceptar y ya podemos acceder a las librerías que contiene repositorio.
Ahora pinchamos sobre esa variable y buscamos la librería que queremos añadir y todo listo.
Error Server Tomcat en Eclipse
Para solventar esto nos vamos a Window/Preference/Server y ampliamos los segundos de esperas.
martes, 24 de febrero de 2009
Portlet
El portlet permite la personalización, la presentación, y la gestión de la seguridad. Los portlets se diferencian de los servlets por ser estos componentes de servidor con perspectiva funcional.
El concepto de portlet es propio del mundo Java, y tiene su traducción en el entorno Microsoft como "web parts". (Sharepoint Portal Server)
Los portales usan portlets como componentes de interfaz de usuario que proveen de una capa de presentación a los sistemas de información.
Ejemplos de portlets meteorología, foros, encuestas, formularios, canales RSS.
El contenido generado por los portlets se denomina "fragmento". Es código XHTML, HTML, WML, etc. Los fragmentos agregados resultantes de la operación de varios portlets constituyen un documento que se traduce en el interfaz del portal.
CMS (Content Management System)
El sistema permite manejar de manera independiente el contenido y el diseño. Así, es posible manejar el contenido y darle en cualquier momento un diseño distinto al sitio sin tener que darle formato al contenido de nuevo, además de permitir la fácil y controlada publicación en el sitio a varios editores
jueves, 5 de febrero de 2009
Ventajas e incovenientes de los Web Services
- Son programable.
- Están basados en XML, que es un lenguaje abierto.
- Son auto descriptivo.
- Pueden buscar registros de otros Web services.
- Se basan en el estándar existente, es decir, es totalmente independiente de la tecnología subyacente utilizada para construir la aplicación.Son independientes a las plataformas, bases de datos, y los lenguajes de programación, liberando totalmente a los programadores de las limitaciones encontradas previamente al tratar de interconectar aplicaciones entre si.
- Los Web Services, pueden publicar servicios simples que están desconectados de los objetos de datos y solo envían la respuesta requerida al solicitante. Esto elimina la necesidad de publicar tablas completas de datos y por lo tanto, de proporcionar un ambiente más seguro.
- Para realizar transacciones no pueden compararse en su grado de desarrollo con los estándares abiertos de computación distribuida como CORBA (Common Object Request Broker Architecture).
- Su rendimiento es bajo si se compara con otros modelos de computación distribuida, tales como RMI (Remote Method Invocation), CORBA, o DCOM (Distributed Component Object Model). Es uno de los inconvenientes derivados de adoptar un formato basado en texto. Y es que entre los objetivos de XML no se encuentra la concisión ni la eficacia de procesamiento.
- Al apoyarse en HTTP, pueden esquivar medidas de seguridad basadas en firewall cuyas reglas tratan de bloquear o auditar la comunicación entre programas a ambos lados de la barrera.
WS-Security
El protocolo contiene especificaciones sobre como debe garantizarse la integridad y seguridad en mensajería de Servicios Web.
UDDI
- Páginas blancas - dirección, contacto y otros identificadores conocidos.
- Páginas amarillas - categorización industrial basada en taxonomías.
- Páginas verdes - información técnica sobre los servicios que aportan las propias empresas.
UDDI es uno de los estándares básicos de los servicios Web cuyo objetivo es ser accedido por los mensajes SOAP y dar paso a documentos WSDL, en los que se describen los requisitos del protocolo y los formatos del mensaje solicitado para interactuar con los servicios Web del catálogo de registros.
WSDL (Web Services Description Languages)
WSDL describe la interfaz pública a los servicios Web. Está basado en XML y describe la forma de comunicación, es decir, los requisitos del protocolo y los formatos de los mensajes necesarios para interactuar con los servicios listados en su catálogo. Las operaciones y mensajes que soporta se describen en abstracto y se ligan después al protocolo concreto de red y al formato del mensaje.
Así, WSDL se usa a menudo en combinación con SOAP y XML Schema. Un programa cliente que se conecta a un servicio web puede leer el WSDL para determinar que funciones están disponibles en el servidor. Los tipos de datos especiales se incluyen en el archivo WSDL en forma de XML Schema. El cliente puede usar SOAP para hacer la llamada a una de las funciones listadas en el WSDL.
SOAP
Estánderes Web services
- Web Services Protocol Stack: Así se denomina al conjunto de servicios y protocolos de los servicios Web.
- XML (Extensible Markup Language): Es el formato estándar para los datos que se vayan a intercambiar.
- SOAP (Simple Object Access Protocol) o XML-RPC (XML Remote Procedure Call): Protocolos sobre los que se establece el intercambio.
- Otros protocolos: los datos en XML también pueden enviarse de una aplicación a otra mediante protocolos normales como HTTP (Hypertext Transfer Protocol), FTP (File Transfer Protocol), o SMTP (Simple Mail Transfer Protocol).
miércoles, 4 de febrero de 2009
Alfresco
Incluye un repositorio de contenidos, un framework de portal web para administrar y usar contenidos estándar en portales.
Contiene un interfaz CIFS para la compatibilidad entre los distintos sistema Windows e Unix.
Alfresco es utilizado como Software de gestión documental para documentos, páginas web, registros, imágenes y desarrollo de contenido.
martes, 27 de enero de 2009
viernes, 23 de enero de 2009
Mapeo objeto-relacional
JPA Java persistent api (JPA)
La API de persistencia JPA es el estándar de Java para mapear objetos Java a una base de datos relacional.
Es una API de persistencias de POJOS, el mapeo se hacen en la misma clase de la entidad a través de anotaciones.
El objetivo que persigue el diseño de esta API es no perder las ventajas de la orientación a objetos al interactuar con una base de datos,
Hay muchas implementaciones de JPA de proveedores utilizadas dentro de la
comunidad de desarrolladores de Java. Hibernate es la implementación
más popular. Hibernate utiliza ficheros de mapeo (en formato XML que tienen extensión .hbm.xml
.) o anotaciones JPA para relacionar tablas con objetos Java.
Entre estas dos opciones, se recomienda utilizar las anotaciones JPA.
Criteria
Su código es más complicado que el de HQL ya que necesita un análisis más detallado ya que utiliza objetos.
Una de las ventajas de Criteria es que puede montar consultas dinámicas más fácil, como por ejemplo, si queremos que tenga un where con varias opciones:
Criteria criteria = session.createCriteria(Coche.class);
if (nombre != null) {
criteria.add(Restrictions.eq("color", color));
}
if (edad != null) {
criteria.add(Restrictions.eq("puertas", puertas));
}
List coches = criteria.list();
Y en HQL tendriamos que concatenar string y esto puede inducir errores:
String query = "from Coche where color like 'Rojo%' and puertas > 2;";
List coches = sess.createQuery(query).list();
miércoles, 21 de enero de 2009
martes, 20 de enero de 2009
Qué es un Hash?
Encriptar contraseñas
MD5 es un algoritmo de generación de resúmenes de mensajes de longitud arbitraria que genera salidas (resúmenes o firmas) de 128 bits.
SHA1 es otro algoritmo de generación de resúmenes de mensajes de longitud inferior a 2^64 bits que genera salidas de 160 bits.
Ambos algoritmos se caracterizan por lo siguiente:
- es virtualmente imposible que dos mensajes distintos produzcan la misma firma.
- conocida la firma de un mensaje, es computacionalmente imposible obtener el mensaje.
- no se basan en clave, sino en una función criptográfica perfectamente conocida, pero de una sola vía (el conocimiento de la entrada determina el conocimiento de la salida, pero no a la inversa).
Método MD5.
public static String md5(String s) {
String r = null;
try {
if (s != null) {
MessageDigest algorithm =MessageDigest.getInstance("MD5");
algorithm.reset();
algorithm.update(s.getBytes());
byte bytes[] = algorithm.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(0xff & bytes[i]);
if (hex.length() == 1)
sb.append('0');
sb.append(hex);
}
r = sb.toString();
}
} catch (NoSuchAlgorithmException e) {
}
return r;
}
Clase sha1
package com.kriter.utils;
import sun.misc.BASE64Encoder;
import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* Created by IntelliJ IDEA.
* User: alopez
* Date: 04-jul-2006
* Time: 11:06:38
* To change this template use File | Settings | File Templates.
*/
public final class SHA1
{
public static String encriptarBase64( String textoplano ) throws IllegalStateException
{
MessageDigest md = null;
try
{
md = MessageDigest.getInstance( \"SHA\" ); // Instancia de generador SHA-1
}
catch( NoSuchAlgorithmException e )
{
throw new IllegalStateException( e.getMessage() );
}
try
{
md.update( textoplano.getBytes( \"UTF-8\" ) ); // Generación de resumen de mensaje
}
catch( UnsupportedEncodingException e )
{
throw new IllegalStateException( e.getMessage() );
}
byte raw[] = md.digest(); // Obtención del resumen de mensaje
return ( new BASE64Encoder() ).encode( raw ); // Traducción a BASE64
}
public static String encriptarHexadecimal( String textoplano ) throws IllegalStateException
{
MessageDigest md = null;
try
{
md = MessageDigest.getInstance( \"SHA\" ); // Instancia de generador SHA-1
}
catch( NoSuchAlgorithmException e )
{
throw new IllegalStateException( e.getMessage() );
}
try
{
md.update( textoplano.getBytes( \"UTF-8\" ) ); // Generación de resumen de mensaje
}
catch( UnsupportedEncodingException e )
{
throw new IllegalStateException( e.getMessage() );
}
byte raw[] = md.digest(); // Obtención del resumen de mensaje
return toHexadecimal( raw ); // Traducción a HEXADECIMAL
}
//metodo que devuelve el valor hexadecimal (String) de una array de byte.
private static String toHexadecimal( byte[] datos )
{
String resultado = \"\";
ByteArrayInputStream input = new ByteArrayInputStream( datos );
String cadAux;
int leido = input.read();
while( leido != -1 )
{
cadAux = Integer.toHexString( leido );
if ( cadAux.length() < 2 ) //Hay que añadir un 0
resultado += \"0\";
resultado += cadAux;
leido = input.read();
}
return resultado;
}
}