Abrir enlace en nueva ventana
Cuando trabajamos con ADF Faces y queremos abrir un enlace en una nueva ventana, es decir hacer uso de target=”_blank” tenemos varias opciones.
Una es hacer uso del componente golink y la propiedad targetFrame
<af :goLink destination="http://www.fetishcode.wordpress.com" targetFrame="_blank"/>
Otra opción, es hacer uso de la propiedad target del propio form. Esta última es útil cuando tenemos la necesidad de hacer uso de commandbuttons o commandlinks.
<h :form target="_blank"> </h>
findByKey and setCurrentRow
Método que dado el nombre de un ViewObject y una lista de keys nos realiza una búsqueda mediante el método findByKey y nos setea la primera de las rows como currrentRow.
public void setCurrentRowViewObject(String nomview, List l){
try{
Iterator it = l.listIterator(0);
ViewObject vo=findViewObject(nomview);
Object[] keyValues=new Object[l.size()];
for(int i=0; it.hasNext();i++){
Object item = it.next();
keyValues[i]=item;
}
Row[] r = vo.findByKey(new Key(keyValues),1);
if (r != null && r.length > 0) {
vo.setCurrentRow(r[0]);}
} catch (Exception ex) {}
}
Un método muy útil para tener en nuestra clase de Utils o en nuestro AppmoduleImpl.
JavaServer Faces Expression Language
En algunos posts anteriores comentábamos que no siempre sacamos el máximo del .jspx en nuestras aplicaciones JSF. A menudo olvidamos que una de las partes fundamentales que componen JSF es un lenguaje de expresiones ( EL) .
A continuación les dejamos un enlace de Sun donde explican en detalle todas las operaciones que podemos realizar mediante EL, JSF Expression Language.
SelecOneChoice en tablas
Uno de los problemas mas comunes al desarrollar con ADF, una vez hemos pasado de la fase inicial de típicos Maestro/Detalle, es el famoso selectonechoice o lista despegable dentro de una tabla.
Para conseguirlo debemos recorrernos los elementos de la lista mediante un for each.
Les dejo un ejemplo en formato vídeo de Steve Muench.
Espero que en la nueva y esperada version 11g, este tema este mejor planteado.
Logging ADF
How to use and configure ADF Logger
El sistema de trazas o logging que utiliza ADF se denomina Java Logging . Este sistema de trazas no requeire el uso de ninguna librería extra ya que viene incluida en el propio JDK, desde la version 1.4.
Para poder hacer uso de este sitema de trazas en nuestro proyecto bastara con registrar un logger en la clase:
private static Logger logger = Logger.getLogger("milog");
logger.info("info");
logger.fine("fine");
El fichero dec onfiguración del sistema de trazas se llama logging.properties y se encuentra en: /jdk/jre/lib/logging.propertiesTambién podemos indicar un fichero propio, en tiempo de diseño, idicándolo en JDEV_HOME/jdev/bin/jdev.conf mediante la siguiente linea:
AddVMOption -Djava.util.logging.config.file=path y nombre del fichero propertiesPor otro lado todos los loggers que ADF utiliza los tiene registrados y configurados en el fichero j2ee-logging.xml que lo encontramos…
Dentro del Jdeveloper en: /jdev/system/oracle.j2ee.10.1.3.xx.xx/embedded-oc4j/config
en el OAS: /j2ee//config
Y en un OC4J en: /j2ee/home/configOtra opción, y quizá la mas extendida, es configurar nuestro proyecto para Jakarta-Log4j.
Mas información: ADF-Logging
Templates en ADF
Muchas veces cuando desarrollamos una aplicación, hay ciertas partes que siempre se repiten como es el logo, la sección de información de usuario, etc.
En general estas partes estas determinadas por lo que en ADF/JSF se denominan PanelPage Facets, tal como podemos ver en la guía ADF Developer’s Guide.
Lo ideal a la hora de desarrollar nuestras pantalla seria que ciertas secciones comunes las definiéramos en un solo lugar. De esta forma solo deberemos hacer cambios en ese lugar y se reflejara en todas las páginas de la aplicación. Tendriamos una especie de plantillas.
Par conseguir esto podemos hacer uso de jsp:incluye:
<f:facet name="menuGlobal"> <f:subview id="globalMenufragment"> <jsp:include page="/plantillas/plantillaglobalMenu.jspx"/> </f:subview> </f:facet>
O de las regions:
<af:region regionType="oracle.adfdemo.region.stock" > <f:attribute name="symbol" value="ORCL"/> <f:attribute name="desc" value="Oracle Corp"/> </af:region>
Menú Dinámico con ADF
Fetishcode sigue colaborando con el equipo de Jdeveloperla
Hace unos días hemos subido un articulo sobre la Construcción de un Menú Dinámico en ADF/JSF en el portal de Jdeveloperla.
Aqui tienen el enlace, Construcción de un Menú Dinámico con ADF
Espero que les sea de utilidad.
JDeveloper 10.1.3.3 Available
Table Multi-selection en ADF Faces
How to get rows from af:table multi-selection.
Este metodo sirve para saber que filas nos han seleccionado en una tabla de selección múltiple.
public String obtenerSeleccion() {
BindingContainer BC=(BindingContainer)Utils.resolveExpression("#{bindings}");
DCIteratorBinding miView= (DCIteratorBinding) BC.get("miViewView1Iterator");
RowSetIterator miViewIter = miView.getRowSetIterator();
RowKeySet selection = this.getTable1().getSelectionState();
Set keySet = selection.getKeySet();
Iterator itr = keySet.iterator();
while (itr.hasNext()) {
Key key = (Key)itr.next();
Row row = miViewIter.getRow(key);
System.out.println("Seleccionamos: " + row.getAttribute(miViewViewRowImpl.NOMBRE));}
return null;}
La forma correcta de crear una Row
In this post we will comment the preferred way to programmatically create a new viewObject row.
Continuando con el post anterior vamos a comentar la forma correcta de crear una row mediante código. Y esque los malos hábitos pasan factura, como aprender a hacer las cosas sin documentarse previamente. En neustro caso, siempre que hemos creado una row manualmente lo hemos hecho simplemente llamando al método createRow() de la view, y esto no solo trae la problemática comentada en el post anterior, sino que si además tenemos customizado el método create() de esa view, al crear una row y rellenar sus campos de esta manera:
OneViewRowImpl row = (OneViewRowImpl)
app.findViewObject("OneView1").createRow();
row.setDescripcion("ejemplo");
podremos comprobar que se crea dos veces el objeto row, pasando así dos veces por el método create() de la view. Si como en nuestro caso hemos customizado este método para establecer unos attr por defecto, como calcular el attr “Codigo” adecuado siguiendo una ecuación, veremos como nuestra aplicación calcula dos veces este “Codigo” con el consecuente error.Y es que si hubieramos leído atentamente la seccion 7.8 Working Programmatically with Entity-Based View Objects de la ADF Developer’s Guide for Forms/4GL Developers
habriamos visto que la forma correcta de crear un nueva row es:
ViewObject v = app.findViewObject("OneView1");
OneViewRowImpl row = (OneViewRowImpl)v.createRow();
v.insertRow(row);