Archivo para la categoría "Java"
Alternativas Search & Replace en Java sobre un documento plantilla
This document summarizes a research about the different options for a java implementation of Search & Replace on a word document. The need was to develop a logic that could locate “labels” or text marked in any way known in a word template and replace dynamic values from database.
Desde fetishcode queremos compartir con vosotros un documento creemos muy valioso. En él se resume una investigación que nos ha llevado sudor y lágrimas sobre las diferentes alternativas en java para realizar una implementación de Search&Replace sobre un documento word. La necesidad era desarrollar una lógica que pudiera localizar “etiquetas” o texto marcados de alguna forma conocida en una plantilla word y sustituirlas por valores dinámicos de base de datos.
Como podreis leer no existe una opción asequible en cuanto a tiempo para desarrollarlo completamente en java. Es posible hacerlo pero seguramente requiere el trabajo de 2 o 3 desarrolladores durante bastantes meses.
La conclusión que hemos podido sacar es que es mucho más asequible y mantenible el uso de herramientas de reporting o equivalentes donde el cliente cree su propia plantilla y posteriormente se convierta a pdf. Aunque esta solución requiera aprendizaje por parte del cliente.
Documento: alternativas_search&replace_pdf
Trabajar con ArrayList en Java.
Os dejo una pequeño code snippet con las funciones más básicas que podemos hacer sobre un ArrayList.
public ArrayList al = new ArrayList();
//limpiamos todos los elementos array
public void clearArray(){
al.clear();
}
//añadimos un elemento
public void addElement(){
al.add("");
System.out.println("El array contiene ahora: " + al);
}
//borramos un elemento
public void removeLastElement(){
al.remove(al.size()-1);
System.out.println("El array contiene ahora: " + al);
}
JasperReports + Java: Convertir report a distintos formatos.
Aquí les dejo una clase de ejemplo, para poder transformar un report, creado con JasperReports, en distintos formatos.(pdf, html, csv, xls,…)
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRCsvExporter;
import net.sf.jasperreports.engine.export.JRRtfExporter;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;
public class Jasper {
public Jasper() {
}
public static void main(String[] args) {
Jasper jasper = new Jasper();
Connection conn = null;
//Cargamos el driver JDBC
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch (ClassNotFoundException e) {
System.out.println("JDBC Driver not found.");}
try {
String dburl = "jdbc:oracle:thin:@localhost:1521:XE";
conn = DriverManager.getConnection(dburl,"user","pass");
}catch (SQLException e){
System.out.println("Error de conexión: " + e.getMessage());}
JasperReport report;
try {
report = JasperCompileManager.compileReport("C:\\report.jrxml");
JasperPrint print = JasperFillManager.fillReport(report, null, conn);
//Exporta el informe a PDF
String destFileNamePdf="C:\\trabajo\\reporte1.pdf";
//Creación del PDF
JasperExportManager.exportReportToPdfFile(print, destFileNamePdf);
/*Otras importaciones
//Exporta el informe a HTML
JasperExportManager.exportReportToHtmlFile(print, destFileNamePdf);
//Exporta el informe a excel
OutputStream ouputStream= new FileOutputStream(new File("C:/trabajo/catalog.xls"));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
JRXlsExporter exporterXLS = new JRXlsExporter();
exporterXLS.setParameter(JRXlsExporterParameter.JASPER_PRINT,print);
exporterXLS.setParameter(JRXlsExporterParameter.OUTPUT_STREAM,byteArrayOutputStream);
exporterXLS.exportReport();
ouputStream.write(byteArrayOutputStream.toByteArray());
ouputStream.flush();
ouputStream.close();
//Exporta el informe a csv
String destFileNamePdf="C:\\trabajo\\reporte1.csv";
JRCsvExporter exporter = new JRCsvExporter();
File destFile = new File(destFileNamePdf);
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,
destFile.toString());
exporter.exportReport();
//Exporta el informe a rtf
OutputStream ouputStream= new FileOutputStream(new File("C:/trabajo/catalog.rtf"));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
JRRtfExporter exporter = new JRRtfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
exporter.exportReport();
ouputStream.write(byteArrayOutputStream.toByteArray());
ouputStream.flush();
ouputStream.close();
*/
} catch (Exception e) {System.out.println("Error"+e);}
}
}
Oracle proxy users
Generalmente las aplicaciones JEE usan un pool de conexiones, donde el usuario es genérico. Esto dependiendo de donde se tenga implementada la lógica de negocio puede ser un inconveniente.
Quizá en algún caso nos interesa saber que usuario accede realmente a la base de datos, por que tenemos reglas de negocio implementadas en BBDD o reglas de seguridad o de acceso
Desde Oracle 10 se puede hacer uso de Oracle proxy users, proporcionando una manera sencilla de saber el usuario conectado en base de datos
En it-eye hablan profundamente del tema:
Recorrer hashtable
Enumeration e = ht.keys();
Object obj;
while (e.hasMoreElements()) {
obj = e.nextElement();
System.out.println("clave "+ obj +": " + ht.get(obj));
}
Font Underline en Java
Aquí les dejo un método que añade la propiedad Underline o subrayado a Font
/**
* Dado un String y una fuente con las propiedades que se quiera.
* añade la propiedad Underline
* @param s texto que se quiere subrayado
* @param f fuente
* @return el texto formateado
*/
private AttributedString fontUnderline(String s, Font f){
AttributedString as = new AttributedString(s);
as.addAttribute(TextAttribute.FONT, f);
as.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
return as;
}
Si trabajamos con Graphics en java:
g2.drawString(fontUnderline (s,Arial_Normal_10).getIterator(), 24, 70);
Java Conversion Utils
Java – comparing strings
Use == for primitive data types like int
If (mystring == null)
Use the equals() method to compare objects
Use .equals for strings : if (a.equals(“cat”))
Java – Converting int to string
String myString = Integer.toString(my int value) or String str = “” + i
Java – Converting String to int
int i = Integer.parseInt(str);
or int i = Integer.valueOf(str).intValue();
double to String:
String str = Double.toString(i);
long to String:
float to String:
String to double:
String to long:
String to float:
decimal to binary:
decimal to hexadecimal:
hexadecimal to integer:
ASCII code to String
int i = 64;String aChar = new Character((char)i).toString();
integer to ASCII code (byte)
char c = ‘A’;int i = (int) c; // i will have the value 65 decimal
integer to boolean
b = (i != 0);
boolean to integer
i = (b)?1:0;
Combos dependientes en jsp con AJAX.
Para ello lo que haremos será crear los combos dependientes en jsp separados,llamarles via ajax y el resultado incrustarlo en el jsp que contiene el formulario con el combo principal.
A continuación un pequeño ejemplo:
Jsp Principal:
<form name="formulario" action="action.jsp" method="POST" id="formulario">
<div>
<label for="comboprincipal"> comboPrincipal </label>
<select name=" comboprincipal " id=" comboprincipal " onchange="javascript:cargarCombo(' combodependiente.jsp', 'comboprincipal', div_combodependiente)">
<option value="">Selecciona</option>
< %//cogemos valores de la bbdd%>
</select>
</div>
<div id="div_combodependiente">
<label for="combodependiente">comboDependiente</label>
<select name="combodependiente" id="combodependiente" ></select>
</div>
</form>
A continuación el javascript que hace la peticion AJAX del jsp combodependiente. Este método recibe tres parámetros:el jsp que tiene que llamar, el campo que ha recogido del combodeprincipal, del cual depende y el id del componente html donde volcara el resultado de la petición Ajax.
/*PETICIONES AJAX PARA COMBOS ANIDADOS*/
var peticion = false;
var testPasado = false;
try {
peticion = new XMLHttpRequest();
} catch (trymicrosoft) {
try {
peticion = new ActiveXObject("Msxml2.XMLHTTP");
} catch (othermicrosoft) {
try {
peticion = new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {
peticion = false;
}
}
}
if (!peticion)
alert("ERROR AL INICIALIZAR!");
function cargarCombo (url, comboAnterior, element_id) {
//Obtenemos el contenido del div
//donde se cargaran los resultados
var element = document.getElementById(element_id);
//Obtenemos el valor seleccionado del combo anterior
var valordepende = document.getElementById(comboAnterior)
var x = valordepende.value
//construimos la url definitiva
//pasando como parametro el valor seleccionado
var fragment_url = url+'?Id='+x;
element.innerHTML = '<img src="Imagenes/loading.gif" />';
//abrimos la url
peticion.open("GET", fragment_url);
peticion.onreadystatechange = function() {
if (peticion.readyState == 4) {
//escribimos la respuesta
element.innerHTML = peticion.responseText;
}
}
peticion.send(null);
}
Y por último el combodependiente.jsp
< %
out.println("<label for='combodependiente'> comboDependiente ");
out.println("<select name='combodependiente' id='combodependiente' >");
out.println("<option value=''>Selecciona</option>");
//recogemos el parámetro
if(request.getParameter("Id")!=null){ //cogemos valores de la bbdd
}
%>
Como veis en el combodependiente.jsp solo cargamos los posibles valores del combo sin el elemento contenedor “Select” ya que este se implementa en el jsp principal.
Nota:El JavaScript fue sacado de http://www.webintenta.com
Actualización:En el combodependiente.jsp es importante cargar todo mediante out.println sino no funciona en IE7
Extracción de ficheros desde JAR
Creating the self-extracting jar file
Hace ya algún tiempo recibí, un correo consultandome sobre la extracción de ficheros desde un jar. Es decir, como extraer ficheros desde el jar que se esta ejecutando, en tiempo de ejecución.
Mas concretamente, el tema era el siguiente: Desplegar una aplicación en formato JAR, mediante JavaWebStart, y al ejecutar la aplicación extraer una serie de ficheros de configuración del propio jar y copiarlos en un lugar determinado.
Lo principal es como conseguir la URL de nuestro JAR y jugar con la clase ZipFile para extraer los archivos del mismo.
myClassName = this.getClass().getName() + ".class"; URL urlJar = this.getClass().getClassLoader().getSystemResource(myClassName);
Les dejo un articulo de javaworld donde se trata este tema con mas profundidad.
Crear Thumbnails de imágenes en Java con JIMI
How to create image thumbnails programmatically cropping a region of an image instead of scaling it. We explain how JIMI (Java Image Management Interface) can provide a easy solution.
Si lo que queremos es generar una imagen en miniatura a partir de otra imagen, dentro de una aplicación java, pero con un tamaño fijo, podemos hacerlo de una forma muy sencilla. Para ello necesitamos la librería JIMI (Java Image Management Interface), una api propia de Sun para leer, crear y manipular imágenes en múltiples formatos.
En nuestro caso estamos desarrollando en struts una galeria de imágenes al estilo de Flickr y necesitamos crear miniaturas de las imágenes con un HxW fijo, por ejemplo 100×100, sin modificar la imagen al escalarla. Por lo que si la imagen original es rectangular para evitar deformarla necesitamos recortar una parte de ésta con las medidas adecuadas, con JIMI es posible.
Primero, necesitamos incluir las clases de JIMI en nuestro proyecto, para ello primero descargamos la librería en la página oficial de Sun:
http://java.sun.com/products/jimi/
Después descomprimimos el zip en local, renombramos el archivo JimiProClasses.zip como jimi-1.0.jar y lo copiamos en el path /WEB-INF/lib de nuestro proyecto y lo añadimos al Build Path del proyecto desde Eclipse:
Project –> Properties –> Java Build Path –> pestaña Libraries –> Add JARs…
Una vez hecho este paso nuestra aplicación ya puede reconocer las clases de jimi, lo último que queda por hacer es incluir este pequeño código:
import java.awt.image.*;
import com.sun.jimi.core.Jimi;
(...)
ImageProducer p1=Jimi.getImageProducer("image.jpg");
ImageFilter f=new CropImageFilter(0,0,100,100);
ImageProducer p2=new FilteredImageSource(f, p1);
Jimi.putImage(p2, "image.jpg");
