Translate

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

miércoles, 16 de diciembre de 2020

Libros Gratuitos de Java code Geeks

 

Download IT Guides!

 

JDBC Tutorial

JDBC (Java Database Connectivity) is an API provided by Oracle that allows programmers to handle different databases from Java applications: it allows developers to establish connections...

 
 

JSF 2.0 Programming Cookbook

JavaServer Faces (JSF) is a Java specification for building component-based user interfaces for web applications. JSF 2 uses Facelets as its default templating system. Other view...

 
 

Developing Modern Applications with Scala

Scala is a general-purpose programming language. It has full support for functional programming and a very strong static type system. Designed to be concise, many of Scala's design...

 
 

iText Tutorial

Text provides support for most advanced PDF features such as PKI-based signatures, 40-bit and 128-bit encryption, color correction, Tagged PDF, PDF forms (AcroForms), PDF/X, color...

 

miércoles, 17 de junio de 2020

Libros de Java Geeks

 

Apache ActiveMQ Cookbook

Apache ActiveMQ is an open source message broker written in Java together with a full Java Message Service (JMS) client. It provides “Enterprise Features” which means fostering the...

 
 

JDBC Tutorial

JDBC (Java Database Connectivity) is an API provided by Oracle that allows programmers to handle different databases from Java applications: it allows developers to establish connections...

 
 

JSF 2.0 Programming Cookbook

JavaServer Faces (JSF) is a Java specification for building component-based user interfaces for web applications. JSF 2 uses Facelets as its default templating system. Other view...

 
 

Developing Modern Applications with Scala

Scala is a general-purpose programming language. It has full support for functional programming and a very strong static type system. Designed to be concise, many of Scala's design...

 

jueves, 19 de diciembre de 2019

Libros de Java Code Geeks

Download IT Guides!

 
The Java Persistence API (JPA) is a vendor independent specification for mapping Java objects to the tables of relational databases. Implementations of this specification allow...
 
 
Apache ActiveMQ is an open source message broker written in Java together with a full Java Message Service (JMS) client. It provides “Enterprise Features” which means fostering the...
 
 
JDBC (Java Database Connectivity) is an API provided by Oracle that allows programmers to handle different databases from Java applications: it allows developers to establish connections...
 
 
JavaServer Faces (JSF) is a Java specification for building component-based user interfaces for web applications. JSF 2 uses Facelets as its default templating system. Other view...
 

viernes, 25 de octubre de 2019

Libros de Java geek

Download IT Guides!

 
JavaServer Faces (JSF) is a Java specification for building component-based user interfaces for web applications. JSF 2 uses Facelets as its default templating system. Other view...
 
 
Scala is a general-purpose programming language. It has full support for functional programming and a very strong static type system. Designed to be concise, many of Scala's design...
 
 
Text provides support for most advanced PDF features such as PKI-based signatures, 40-bit and 128-bit encryption, color correction, Tagged PDF, PDF forms (AcroForms), PDF/X, color...
 
 
Spring Integration extends the Spring programming model to support the well-known Enterprise Integration Patterns. Enables lightweight messaging within Spring-based applications and...
 

jueves, 6 de septiembre de 2012

JBoss Developer Framework


Recientemente Jboss ha liberado JBoss Developer Framework o JDF para los amigos.  El Framework en realidad es un centro de documentación central para todas las tecnologías relacionadas con JBoss y JBoss AS. Este esfuerzo de consolidación permite a los desarrolladores centrarse en un recurso único de documentos en lugar de tomar varias guías individuales de las diferentes tecnologías de JBoss (por ejemplo, una guía de Hibernate y otra para Seam).

JDF incluye más de 50 quickstarts  que son proyectos Maven que se generan con archetypes. Lo interesante es que la mayoría de los quickstarts generan los proyectos con varias capas,  Estos pueden servir ya sea como tutoriales o como la base para las aplicaciones más complicadas. Algunas de las tecnologías que incluyen: EJB, JAX-RS, JPA, JSF, CDI, HTML5, JTA, Apache Wicket...

Dejo links:
http://in.relation.to/Bloggers/AnnouncingJdfJBossDeveloperFramework
http://www.jboss.org/jdf/news/2012/06/05/welcome/

martes, 1 de mayo de 2012

Jasper en jsf, parte 2. La leyenda continua!


Siguiendo con el post:
http://emanuelpeg.blogspot.com.ar/2012/04/jasper-en-jsf.html

Ahora vamos a crear objetos que representen a los reportes y sus parámetros. Luego hacemos una pagina donde se pueda elegir el reporte,completar los parámetros e imprimir.
Clase reporte:

import java.util.ArrayList;
import java.util.List;

/**
 * @author emanuel
 *
 */
public class Report {
 
 private Long id;
 
 private String nombre;
 
 private List parameters = new ArrayList();
 
 private String fileName;
 
 private String urlConnection;
 
 private String driver;

 public Report() {
 }

 public Report(Long id, String nombre, List parameters,
   String fileName, String urlConnection, String driver) {
  super();
  this.id = id;
  this.nombre = nombre;
  this.parameters = parameters;
  this.fileName = fileName;
  this.urlConnection = urlConnection;
  this.driver = driver;
 }

 //Getters and setters
 
}


Clase Parametro
package org.assembly.tyr.reports.model;

/**
 * @author emanuel
 *
 */
public class Parameter {
 
 private String nombre;
 
 private Type type;
 
 private Object value;
 
 public Parameter(String nombre, Type type) {
  super();
  this.nombre = nombre;
  this.type = type;
 }

 //Getters and setters
}


El enum type
public enum Type {
 
 STRING, NUMBER, DATE

}

Ahora hago un dao, no quiero usar la base de datos por lo tanto hago un mapa, ustedes usen la base de datos.

package org.assembly.tyr.reports.dao;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.assembly.tyr.reports.model.Parameter;
import org.assembly.tyr.reports.model.Report;
import org.assembly.tyr.reports.model.Type;

/**
 * @author emanuel
 *
 */
public class ReportDao {
 
 private Map reports = new HashMap();
 
 public ReportDao() {
  List parameter1 = new ArrayList();
  Report report1 = new Report(1l,"hola1", parameter1, "/resources/reports/reporte.jasper",    
                                             "jdbc:mysql://localhost:3306/holaMundo?user=root&password=", 
                                             "com.mysql.jdbc.Driver");
  reports.put(1l, report1);
  
  List parameter2 = Arrays.asList(new Parameter("prueba1", Type.NUMBER), 
                      new Parameter("prueba2", Type.STRING), 
                      new Parameter("prueba3", Type.DATE));
  Report report2 = new Report(2l,"hola2", parameter2, 
                         "/resources/reports/reporte2.jasper", 
                         "jdbc:mysql://localhost:3306/holaMundo?user=root&password=", 
                         "com.mysql.jdbc.Driver");
  reports.put(2l, report2);
 }
 
 public Collection getAll() {
  return reports.values();
 }
 
 public Report get(Long id) {
  return reports.get(id);
 }

}


Ahora agrego en el face-config.xml el controller.

  
  reportGenerator
  org.assembly.tyr.reports.ui.ReportGeneratorController
  session
 

Agrego la pagina


    Report


    
    

Report


y modifico el controller

package org.assembly.tyr.reports.ui;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperRunManager;

import org.assembly.tyr.reports.dao.ReportDao;
import org.assembly.tyr.reports.model.Parameter;
import org.assembly.tyr.reports.model.Report;

public class ReportGeneratorController {
 
 private ReportDao reportDao = new ReportDao();
 private Long reportId;
 private List parameters;
 private Map parameterValues = new HashMap();
 
 public List getReportList() {
  List result = new ArrayList();
  Collection reports = reportDao.getAll();
  for (Report report : reports) {
   SelectItem item = new SelectItem(report.getId(), report.getNombre());
   result.add(item);
  }
  return result;
 }
 
 public Long getReportId() {
  return reportId;
 }

 public void setReportId(Long reportId) {
  this.reportId = reportId;
 }

 public List getParameters() {
  if ( reportId!= null) {
   Report report = this.reportDao.get(reportId);
   parameters = report.getParameters();
  }
  return parameters;
 }

 public void setParameters(List parameters) {
  this.parameters = parameters;
 }
 
 public Map getParameterValues() {
  return parameterValues;
 }

 public void setParameterValues(Map parameterValues) {
  this.parameterValues = parameterValues;
 }
 
 public Object getParameterValue(String key) {
  return this.parameterValues.get(key);
 }

 public String generateReportSubmit()
   throws ClassNotFoundException, SQLException, IOException,
   JRException {
  Connection connection;
  
  if (parameters != null) {
   for (Parameter parameter: parameters) {
    parameterValues.put(parameter.getNombre(), parameter.getValue());
   }
  }
  
  Report report = this.reportDao.get(reportId);
  
  //Buscamos el contexto de jsf
  FacesContext facesContext = FacesContext.getCurrentInstance();
  HttpServletResponse response = (HttpServletResponse) facesContext
    .getExternalContext().getResponse();
  //Con el contexto buscamos el jasper
  InputStream reportStream = facesContext.getExternalContext()
    .getResourceAsStream(report.getFileName());
  ServletOutputStream servletOutputStream = response.getOutputStream();
  
  //Nos conectamos a la base de datos (creamos una coneccion)
  Class.forName(report.getDriver());
  connection = DriverManager
     .getConnection(report.getUrlConnection());
  facesContext.responseComplete();
  //seteamos el contentType
  response.setContentType("application/pdf");
  
  //ejecutamos el reporte
  JasperRunManager.runReportToPdfStream(reportStream,
    servletOutputStream, this.parameterValues, connection);
  // Cerramos la coneccion a la Base
  connection.close();
  // flush y close del reporte
  servletOutputStream.flush();
  servletOutputStream.close();
  return null;
 }
 
}


Para ver el codigo:
https://code.google.com/p/jaspertyr

domingo, 22 de abril de 2012

Jasper en jsf

Antes que nada hagamos nuestro reporte con el ireport y lo guardamos por hay...


  Tienen que poner como lenguaje Java; por defecto trae Groovy.


Primero crear el proyecto con maven:
mvn archetype:generate

Yo voy a usar un archetype que se llama:
194: remote -> org.apache.myfaces.buildtools:myfaces-archetype-helloworld20 (Archetype to create a new webapp based on MyFaces 2.0) Ojo pueden usar cualquier implementación de jsf.
Bueno luego importamos el proyecto a eclipse, como siempre...

Agregamos la siguiente dependencia al pom


 net.sf.jasperreports
 jasperreports
 4.5.1

            

 javax.servlet
 servlet-api
 2.4
 provided




        mysql
        mysql-connector-java
        5.1.6


Ahora a integrar jasper a nuestra aplicación jsf.

Vamos a escribir el siguiente controller:

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;

import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperRunManager;

public class ReportGeneratorController {
 
 public void generateReport(ActionEvent actionEvent)
   throws ClassNotFoundException, SQLException, IOException,
   JRException {
  Connection connection;
  
  //Buscamos el contexto de jsf
  FacesContext facesContext = FacesContext.getCurrentInstance();
  HttpServletResponse response = (HttpServletResponse) facesContext
    .getExternalContext().getResponse();
  //Con el contexto buscamos el jasper
  // Ojo / es webapp
  InputStream reportStream = facesContext.getExternalContext()
    .getResourceAsStream("/reports/DbReport.jasper");
  ServletOutputStream servletOutputStream = response.getOutputStream();
  
  //Nos conectamos a la base de datos (creamos una coneccion)
  Class.forName("com.mysql.jdbc.Driver");
  //Ojo mybase es el nombre de la base, user y password.
  connection = DriverManager
    .getConnection("jdbc:mysql://localhost:3306/mybase?"
      + "user=user&password=secret");
  facesContext.responseComplete();
  //seteamos el contentType
  response.setContentType("application/pdf");
  
  //ejecutamos el reporte
  JasperRunManager.runReportToPdfStream(reportStream,
    servletOutputStream, new HashMap(), connection);
  // Cerramos la coneccion a la Base
  connection.close();
  // flush y close del reporte
  servletOutputStream.flush();
  servletOutputStream.close();
 }
}

Ojo copien el reporte al proyecto yo lo copie en /webapp/resources
Ahora escribimos un link en una pagina para acceder.


 
       
 
 

Tenemos que registrar nuestro controller en el face-config.xml:

  
  reportGenerator
  org.assembly.tyr.reports.ReportGeneratorController
  request
 


A probarlo!


Dejo el código:

http://code.google.com/p/jaspertyr/source/browse/

Para bajarlo pueden hacer:


git clone https://code.google.com/p/jaspertyr/

jueves, 28 de abril de 2011

Autenticación en JSF

Como todos sabemos la seguridad se puede dividir en 3 aspectos:

  • Autenticación: que el usuario sea realmente quien dice ser.
  • Autorización: que el usuario pueda hacer solo lo que el tenga permiso de hacer.
  • Seguridad de Datos: que el usuario vea los datos que el realmente puede ver.

No todas las aplicaciones necesitan todas estos aspectos, por ejemplo una aplicación menor de una intranet no necesariamente necesita la seguridad de datos.

Vamos a atacar la autenticación. Con JSF podemos autenticar a nuestros usuarios de diferentes maneras.

Una forma es por medio del contenedor, todos los contenedores web manejan el concepto de seguridad y la posibilidad de autenticar a un usuario. Muchas aplicaciones solo necesitan la autenticación; por lo tanto lo podemos hacer a nivel contenedor. Este provee tres formas: basic, form-based, y client certificate. Veamos un ejemplo de autenticación basic, agregando las siguientes lineas al web.xml :








BASIC
UserDatabase





La autenticación básica trajo con sigo el concepto de realm. Un realm es un objeto que representa al usuario y su autenticación. Realm no es un concepto estándar y se implementa de forma diferente en los contenedores. Por ejemplo en Apache Tomcat es un simple archivo xml:














Otra posible autenticación es basado en formularios, esta solución fue creada antes de JSF y no es recomendada si la autenticación debe estar integrada a la aplicación:



FORM
UserDatabase

/faces/login.jsp
/faces/loginError.jsp




Otra posibilidad es integrar el login a nuestra aplicación. Vamos a profundizar esta opción que es la más utilizada.

Lo que deberíamos hacer es una aplicación la cual no se pueda acceder a ninguna pagina sin antes logearse, y si alguien intenta acceder a la pagina esta lo redireccionara a la pagina de login. En el login el usuario podrá logearse y así poder realizar sus tareas.

El concepto de servler filter, implementado en la versión 2.3 de servlet y redefinido en 2.4 permite operar sobre una request antes que esta sea procesada. Esto nos permite chequear si el usuario esta logueado cuando quiere acceder a alguna pagina. Entonces declaremos nuestro filtro en el web.xml:



Require that the user log in before accessing any page
other than the entry pages

ForcedLoginFilter
org.assembly.util.ForcedLoginFilter



ForcedLoginFilter
*.jsp
REQUEST
FORWARD



Y la clase ForcedLoginFilter es la siguiente:


package org.assembly.util;

import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class ForcedLoginFilter implements Filter {
private static final String LOGIN_JSP = "login.jsp";

public ForcedLoginFilter() {
}

private static boolean checkLoginState(ServletRequest request,
ServletResponse response) throws IOException, ServletException {
boolean isLoggedIn = false;
HttpSession session = ((HttpServletRequest) request).getSession(false);
UserBean managedUserBean = null;
// If there is a UserBean in the session, and it has
// the isLoggedIn property set to true.
if (null != session
&& (null != (managedUserBean = (UserBean) session
.getAttribute("UserBean")))) {
if (managedUserBean.isIsLoggedIn()) {
isLoggedIn = true;
}
}
return isLoggedIn;
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

boolean isLoggedIn = checkLoginState(request, response);

if (isRedirect((HttpServletRequest) request) && !isLoggedIn) {
String loginURI = LOGIN_JSP;

RequestDispatcher requestDispatcher = request
.getRequestDispatcher(loginURI);

// Force the login
requestDispatcher.forward(request, response);
return;
} else {
try {
chain.doFilter(request, response);
} catch (Throwable t) {
// A production quality implementation will
// deal with this exception.
}
}
}

private boolean isRedirect(HttpServletRequest request) {
String requestURI = request.getRequestURI();

return (!requestURI.contains(LOGIN_JSP));
}

@Override
public void destroy() {
// TODO Auto-generated method stub

}

@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub

}
}




Las clases que son filtros deben implementar la interfaz Filter. En este caso lo que hace el filtro es verificar que existe el usuario en la session y si la url es redirecciónable, dado que si al ir a login redireccionamos se formara un bucle infinito.

El objeto UserBean es el encargado de representar un usuario.


package org.assembly.util;

public class UserBean {

private String userName;

private String userPassword;

public UserBean(String userName, String userPassword) {
this.userName = userName;
this.userPassword = userPassword;
}

public boolean isIsLoggedIn() {
return true;
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public String getUserPassword() {
return userPassword;
}

public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}

}





Entonces ahora debemos crear la pagina login.jsp que sera como la siguientes



<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

< html>
< head>
< meta http-equiv="Content-Type" content="text/html; charset=UTF-8">


Base de Contribuyentes


< /head>
< body background="black">











action="#{loginBean.validate}" />







< /body>

< /html>




Y luego debemos crear el managed bean que sera como este:


package org.assembly.util.login;

import javax.faces.context.FacesContext;
import org.assembly.util.UserBean;

public class LoginBean {

private String userName;

private String userPassword;

public String validate() {

// Validar si la contraseña y pass son correctas.
// si hay un error return null;

UserBean user = new UserBean(userName, userPassword);

FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
.put("UserBean", user);

return "index";
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public String getUserPassword() {
return userPassword;
}

public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}

}



Luego debemos declarar en el face-config.xml nuestro bean y la url login.



loginBean
org.assembly.util.login.LoginBean
request

...


login
/login.jsp




Este fue un pequeño ejemplo de login en jsf.

domingo, 13 de marzo de 2011

Skinnability









Siguiendo con los post sobre RichFaces:

http://emanuelpeg.blogspot.com/2011/02/richfaces.html
http://emanuelpeg.blogspot.com/2011/03/arquitectura-de-richfaces.html
http://emanuelpeg.blogspot.com/2011/03/manejo-entre-componentes-en-richfaces.html

Skinnability es la habilidad que tiene RichFaces de darle un mismo estilo a todos sus componentes.

Una importante característica son los skin parameters con estos se puede definir un valor y reusar esto en un selector css. Estos valores puede asociarlos a un particular skin.

Un skin es un simple archivo de propiedades que contiene parámetros y valores. Para crear un skin solo es necesario crear un archivo con la siguiente forma skin_name.skin.properties y es necesario que este dentro del classpath.

Con el objetivo de cambiar el skin por defecto es necesario setear la propiedad org.richfaces.SKIN en el web xml.



org.richfaces.SKIN
skin_name



RichFaces incorpora skins predefinidos, estos son:
  • DEFAULT
  • plain
  • emeraldTown
  • blueSky
  • wine
  • japanCherry
  • ruby
  • classic
  • deepMarine

Estos skin cotienen los parametros usados por Riche Faces para dar el Look and Fell a los componentes de de RichFaces.

Plain sking es un sking que no tiene parámetros es usado para proyectos que tienen su propio css.

RichFaces skinnability también permite asociar custom renders, nuevos skin y skings para nuevos custom componentes.

RichFaces permite cambiar skin es tiempo de ejecución. Permitiendo elegir al usuario un skin que prefiera.

Manejo entre componentes en RichFaces

Siguiendo con los post sobre RichFaces:

http://emanuelpeg.blogspot.com/2011/02/richfaces.html
http://emanuelpeg.blogspot.com/2011/03/arquitectura-de-richfaces.html

Veamos un concepto importante en Richfaces, RichFaces no puede agregar, ni eliminar ningún elemento pero puede remplazar a uno existente. Veamos un ejemplo que gráfica este comportamiento:










Este código a simple vista funciona, pero no es así. OutputText es renderizado al inicio con el valor false en rendered por esta razón el javascript no puede encontrar este elemento. Para seleccionar este problema se debe recurrir a un contenedor para outputText:










Como se puede ver, lo que se refresca es out2 el cual siempre esta presente y de esta forma se refrescara out1.