Mostrando entradas con la etiqueta Java. Mostrar todas las entradas
Mostrando entradas con la etiqueta Java. Mostrar todas las entradas

domingo, 27 de septiembre de 2009

IReport y Jdeveloper 10g parte 2

en esta segunda parte veremos como gestionar los archivos jasper desde JDeveloper y como pasar los parametros que necesita el reporte.
Debemos copiar desde la carpeta lib de nuestro IReport, los siguientes jar :

itext-1.3.1.jar
jasperreports-2.0.4.jar
jasperreports-extensions-1.3.1.jar
poi-2.5.1-final-20040804






Luego pegarlos en la carpeta WEB-INF/lib de nuestro proyecto web.
En la lista podemos ver las librerias itext y el poi, estas librerias nos serviran para los reportes en pdf y excel respectivamente.

Debemos crear una carpeta dentro del WEB-INF, su nombre sera "reports", al interior de este carpeta pegaremos el archivo mi_reporte_javix.jasper (recuerde que este archivo lo generamos en el anterior articulo), este archivo se encuentra en la carpeta principal de su IReport.

Vamos al proyecto ViewController darle doble clic y agregaremos las librerias,darle clic al boton add Jar/Directory

















Finalmente quedaria de esta manera:






















Ahora vamos al faces-config.xml y diseñamos la siguiente navegacion entre paginas:













Tenemos dos paginas , la navegacion tiene el nombre de "dialog:jspreporte".
El diseño de la pagina index.jsp seria el siguiente:



















Modifique las siguientes propiedades del boton "Generar Reporte":
useWindow="true"
windowHeight="800"
windowWidth="600"

Debe capturar el valor del selectonechoice que almacena el area luego cargarlo como variable session a idarea.
Programacion del boton "generar reporte" en el backing:


FacesContext context = javax.faces.context.FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
session.setAttribute("idarea",idarea);
return "dialog:jspreporte";

Para generar el reporte necesita una conexion a una base de datos, en este caso se puede tomar la conexion existente del datasource original, o tambien crear una propia conexion a la base de datos, optaremos por esta opcion, entonces debera crear una clase "OracleDBConn".


package com.javix.pe.model.db;

import java.sql.Connection;
import java.sql.DriverManager;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class OracleDBConn {
/**
*Registramos el driver
*/
static {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (Exception e) {
System.out.println("Ocurrió un problema con el driver\n" + e);
}
}
/**
* Obtiene una conexión a la Base de Datos.
*/
public Connection getConexion() {
Connection connection = null;
try {
connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","blog","blog");
} catch (Exception e) {
System.out.println("Ocurrió un problema al obtener la conexión\n" + e);
}
return connection;
}
}


Continuando ya se tiene el archivo reporte, la clase de conexion, ahora falta la pagina que soportara el reporte, para este ejemplo ejecutaremos un reporte en pdf y al dar clic al boton "generar reporte" automaticamente debera aparecer una ventana emergente mostrando un pdf con la informacion solicitada.



Para ello debemos programar la pagina reporte.jsp con el siguiente codigo:




"http :// www . w3 . org/TR/html4/loose.dtd">



<%@ page import="net.sf.jasperreports.engine.*" %>



<%@ page import="net.sf.jasperreports.engine.design.*" %>



<%@ page import="net.sf.jasperreports.engine.data.*"%>



<%@ page import="net.sf.jasperreports.engine.export.*"%>





<%@ page import="net.sf.jasperreports.engine.util.*"%>



<%@ page import="net.sf.jasperreports.view.*"%>



<%@ page import="net.sf.jasperreports.view.save.*"%>





<%@ page import="java.sql.*"%>



<%@ page import="java.util.*" %>



<%@ page import="java.io.*" %>



<%@ page contentType="text/html;charset=windows-1252"%>





Reporte Javier Calizaya!











<%



try{

com.javix.pe.model.db.OracleDBConn objDBConn =new com.javix.pe.model.db.OracleDBConn() ;

Connection conn = null ;





conn = objDBConn.getConexion();





System.setProperty("jasper.reports.compile.class.path",application.getRealPath("/WEB-INF/lib/jasperreports-2.0.4.jar") +



System.getProperty("path.separator") +



application.getRealPath("/WEB-INF/classes/")



);





System.setProperty(



"jasper.reports.compile.temp",



application.getRealPath("/reports/")



);



File reportFile = new File(application.getRealPath("/reports/mi_reporte_javix.jasper"));

Map parameters = new HashMap();

javax.faces.context.FacesContext context = javax.faces.context.FacesContext.getCurrentInstance();

parameters.put("idlocal",session.getAttribute("idarea").toString());



byte[] bytes =JasperRunManager.runReportToPdf(reportFile.getPath(),parameters,conn);

response.setContentType("application/pdf");

response.setContentLength(bytes.length);

ServletOutputStream ouputStream = response.getOutputStream();

ouputStream.write(bytes, 0, bytes.length);

ouputStream.flush();

ouputStream.close();



}catch (JRException e)



{System.out.println("Error:" +e.getMessage());}



catch (Exception e)



{



e.printStackTrace();



System.out.println("Error2:" +e.getMessage());

}



%>

















Ejecutar la pagina index.jsp:



















Fuente: http://javixoracle.blogspot.com/

lunes, 20 de octubre de 2008

Estandares Java

Sun recomienda las siguientes practicas para:

Las propiedades de los JavaBeans
  • Si la propiedad NO es de tipo boolean, los metodos getters deben tener como prefijo la palabra get. si la propiedad es size, su get es getSize( ).
  • Si la propiedad es de tipo boolean, los metodos getters en vez de llamarse get, se debe llamar is. Si la propiedad es stop, su get debe ser isStop( ).
  • Los metodos para setear debe tener el prefijo set a la propiedad, si la propiedad es size, debe ser setSize( ).
  • Como en los puntos anteriores despues del prefijo, el nombre de la propiedad comienza con mayúscula.
Listener JavaBeans
  • Para registrar un evento, aplicar addActionListener que es para agregar una acción.
  • Para desresgistrarlo, aplicar removeActionListener que es para quitar la acción.
  • Para agregar o quitar se debe pasar el Listener.
Ejemplos:
public void setMyValue(int v)
public int getMyValue()
public boolean isMyStatus()
public void addMyListener(MyListener m)
public void removeMyListener(MyListener m)

Próximo articulo, "Declaración de clases en Java 5 "

revision inicial de la scjp sun certified programmer Java 5

Estoy estudiando para la certificación para programadores java 5. El texto es bastante extenso y el comienzo es bastante obvio pero siempre es bueno repasarlo para no caer en error y malas practicas.

  • Los identificadores deben comenzar con letras minusculas, $ o _ nunca numeros.
  • es sensible a mayusculas.
  • no se puede usar las palabras reservadas para declarar identificadores.
  • no hay limites de caracteres.
Convensiones para Clases.
  • Las clases deben comenzar con mayusculas.
  • Debe ser capitalizado como nombre, ejemplo class Perro
Convensiones para Interfaces
  • El nombre debe ser un adjetivo.
Metodos
  • Debe comenzar con minuscula la primera palabra, luego la segunda palabra debe comenzar con mayúscula.
  • Debe nombrarse con la accion que va a tener ese metodo.
Variables
  • Debe comenzar con minuscula la primera palabra, luego la segunda palabra debe comenzar con mayúscula.
  • Deben ser nombres cortos y sobretodo descriptivos.
Constantes
  • Siempre con mayusculas.
  • para separar las palabras de debe usar "_"

En el proximo post acerca de la certificación Java 5, hableré sobre Los estandares de los JavaBeans.

lunes, 19 de noviembre de 2007

Patrón de Diseño, Chain of Responsibility

Evita acoplamiento al remitente de una petición a su receptor dando la posibilidad de un objeto de tramitar la solicitud. Cadena de la recepción de los objetos y pasar la solicitud a lo largo de la cadena hasta que un objeto se ocupa de él.

Este Patron es muy poco usado.



Participantes

Las clases y / o de los objetos que participan en este modelo son:

* Handler
Define una interfaz para el manejo de las solicitudes
(Opcional) implementa el sucesor enlace
* ConcreteHandler
Se ocupa de las solicitudes que es responsable
Puede acceder a su sucesor
Si el ConcreteHandler puede tramitar la solicitud, lo hace; de otra forma, lo que remite la solicitud a su sucesor
* Client
Inicia la petición a un ConcreteHandler objeto en la cadena













Puedes bajar el ejemplo y probarlo en tu pc. Fue desarrollado en Eclipse con Java 1.6SE
[descargar]

Este es el codigo Java,

abstract class Handler{

protected Handler successor;


public void SetSuccessor(Handler successor){
this.successor = successor;
}

public abstract void HandleRequest(int request);
}

class ConcreteHandler1 extends Handler{
public void HandleRequest(int request){
if (request >= 0 && request < 10){
System.out.println(this.getClass().toString() + " handled request " + request);
} else if (successor != null){
successor.HandleRequest(request);
}
}
}

class ConcreteHandler2 extends Handler{
public void HandleRequest(int request) {
if (request >= 10 && request < 20){
System.out.println(this.getClass().toString() + " handled request " + request);
} else if (successor != null){
successor.HandleRequest(request);
}
}
}

class ConcreteHandler3 extends Handler{
public void HandleRequest(int request) {
if (request >= 20 && request < 30){
System.out.println(this.getClass().toString() + " handled request " + request);
}else if (successor != null){
successor.HandleRequest(request);
}
}
}


public class Main {

public static void main(String[] args) {
// Configuracion del Chain of Responsibility
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
h1.SetSuccessor(h2);
h2.SetSuccessor(h3);

// Generar y procesar request
int[] requests = {2, 5, 14, 22, 18, 3, 27, 20};

for(int request : requests){
h1.HandleRequest(request);
}
}
}

miércoles, 7 de noviembre de 2007

Problema Javac java lang OutOfMemoryError









Muchos desarrolladores Java habrán tenido este error al tratar de compilar una gran cantidad de clases, java.lang.OutOfMemoryError:

The system is out of resources.
Consult the following stack trace for details.
java.lang.OutOfMemoryError: Java heap space


Si estas compilando con javac em Apache Ant, sete el atributo fork como true, para correr javac en un proceso separado con su propio espacio. Si el atributo fork es seteado false o no es seteado (por defecto es false), javac correra en el mismo proceso que Ant y su heap size sera de 64m.


<javac fork="true"
srcdir="${basedir}/src"
destdir="${basedir}/build/classes"
classpath="${project.classpath}"
memoryinitialsize="256m"
memorymaximumsize="256m">
</javac>



Si no quieres modificar el archivo build.xml, otra opcion es incrementar el heap size de la JVM Ant y seguir ejecutando javac. Solo necesitas setear la variable de entorno ANT_OPTS:

export ANT_OPTS="-Xms256m -Xmx256m" (ksh/bash)
setenv ANT_OPTS="-Xms256m -Xmx256m" (tcsh/csh)
set ANT_OPTS="-Xms256m -Xmx256m" (Windows)


De estas maneras podrás lograr compilar tus clases java si te sale este problema de memoria
;)

viernes, 12 de octubre de 2007

Patron de Diseño Builder, Java

El Patrón de diseño Builder o Constructor es usado para permitir la creación de una variedad de objetos complejos desde un objeto fuente(Producto), el objeto fuente se compone de una variedad de partes que contribuyen individualmente a la creación de cada objeto complejo a través de un conjunto de llamadas a interfaces comunes de la clase Abstract Builder.

Este patrón es medianamente usado.

Su intención es de abstrae el proceso de creación de un objeto complejo, centralizando dicho proceso en un único punto, de tal forma que el mismo proceso de construcción pueda crear representaciones diferentes.

Las clases y/u objetos que participan en este patron son los siguientes:

  • Builder
    • Define una interfaz abstracta para crear productos
  • ConcreteBuilder
    • Implementación de la interfaz Builder
    • Construye y reune las partes necesarias para construir los productos
  • Director
    • Construye un objeto usando la interfaz Builder
  • Producto
    • El objeto complejo bajo construcción
    • Metodos Propios













Puedes bajar el ejemplo y probarlo en tu pc. Fue desarrollado en Eclipse con Java 1.6SE
[descargar]

Este es el codigo:

public class Director {

//Builder uses a complex series of steps
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}

}

public abstract class Builder {

public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product getResult();
}

public class ConcreteBuilder1 extends Builder{

private Product product = new Product();

@Override
public void BuildPartA() {
product.Add("PartA");

}

@Override
public void BuildPartB() {
product.Add("PartB");

}

public Product getResult()
{
return product;
}

}

public class ConcreteBuilder2 extends Builder{

private Product product = new Product();

@Override
public void BuildPartA() {
product.Add("PartX");

}

@Override
public void BuildPartB() {
product.Add("PartY");

}

public Product getResult()
{
return product;
}

}

import java.util.ArrayList;


public class Product {

ArrayList parts = new ArrayList();

public void Add(String part)
{
parts.add(part);

}

public void Show()
{
System.out.println("\nProduct Parts -------");
for(Object part:parts)
System.out.println(part);
}

}



public class Main {

/**
* @param args
*/
public static void main(String[] args) {
// Create director and builders
Director director = new Director();

Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();

// Construct two products
director.Construct(b1);
Product p1 = b1.getResult();
p1.Show();

director.Construct(b2);
Product p2 = b2.getResult();
p2.Show();


}

}

Saludos

Askpipe99


martes, 9 de octubre de 2007

Patron de Diseño Abstract Factory

Provee una interfaz para crear objetos sin especificar sus clases concretas
Este patrón de diseño se utiliza muy frecuentemente

Las clases y/u objetos que participan en este patron son los siguientes:

  • AbstractFactory
    • Declara una interfaz para operaciones que crean productos abstractos
  • ConcreteFactory
    • Implementan las operaciones para crear los objetos de productos concretos
  • AbstractProduct
    • Declara una interfaz para un tipo de objeto producto
  • Product
    • Define un objeto producto para ser creado por el correspondiente concrete factory
    • Implementa la interfaz AbstractProduct
  • Client
    • Usa la interfaz declara por las clases AbstractFactory y AbstractProduct
























Puedes bajar el ejemplo y probarlo en tu pc. Fue desarrollado en Eclipse con Java 1.6SE
[descargar]

Este es el codigo:

public abstract class AbstractFactory{
public abstract AbstractProductA CreateProductA();
public abstract AbstractProductB CreateProductB();

}

public class ConcreteFactory1 extends AbstractFactory
{
public AbstractProductA CreateProductA()
{
return new ProductA1();
}
public AbstractProductB CreateProductB()
{
return new ProductB1();
}
}


class ConcreteFactory2 extends AbstractFactory
{
public AbstractProductA CreateProductA()
{
return new ProductA2();
}
public AbstractProductB CreateProductB()
{
return new ProductB2();
}
}

public abstract class AbstractProductA {

}


abstract class AbstractProductB{
public abstract void Interact(AbstractProductA a);

}

class ProductA1 extends AbstractProductA
{
}

public class ProductB1 extends AbstractProductB
{
public void Interact(AbstractProductA a)
{
System.out.println(this.getClass().toString() + " interactua con " + a.getClass().toString());
}
}

public class ProductA2 extends AbstractProductA
{
}

public class ProductB2 extends AbstractProductB{

@Override
public void Interact(AbstractProductA a) {
System.out.println(this.getClass().toString() + " interactua con " + a.getClass().toString());
}

}

public class Client {


private AbstractProductA abstractProductA;
private AbstractProductB abstractProductB;

// Constructor
public Client(AbstractFactory factory)
{
abstractProductB = factory.CreateProductB();
abstractProductA = factory.CreateProductA();
}

public void Run()
{
abstractProductB.Interact(abstractProductA);
}


}

public class Main {

/**
* @param args
*/
public static void main(String[] args) {
// Abstract factory #1
AbstractFactory factory1 = new ConcreteFactory1();
Client c1 = new Client(factory1);
c1.Run();

// Abstract factory #2
AbstractFactory factory2 = new ConcreteFactory2();
Client c2 = new Client(factory2);
c2.Run();
}

}


Este patrón de diseño es muy usado en aplicaciones web, dando muy buenos resultados cuando se separan sistemas.

Suerte

domingo, 7 de octubre de 2007

Patron de Diseño Singleton

Una clase de la cual solamente una instancia puede existir.
Asegurar una clase tiene solamente un caso y proporciona un punto global del acceso a él.









Es usado frecuentemente en los desarrollos de software
Puedes bajar el ejemplo y probarlo en tu pc. Fue desarrollado en Eclipse con Java 1.6SE
[descargar]

A Continuación el código del ejemplo para que lo veas sin descargarlo


public class Singleton {

private static Singleton instance;

public Singleton()
{
}

public static Singleton Instance()
{

if (instance == null)
{
instance = new Singleton();
}

return instance;
}

}


public class Main {

public static void main(String[] args) {

Singleton s1 = Singleton.Instance();
Singleton s2 = Singleton.Instance();

if (s1 == s2){
System.out.println("Objects are the same instance");
}

}
}