Realice las Tareas y Obtendrá Beneficios

Por Steve Muench
Publicado en septiembre de 2008


Ensamblar aplicaciones visualmente a partir de flujos de tareas reutilizables.

JavaServer Faces (JSF) ofrece un servicio simple, declarativo para controlar cómo un usuario final navega de una página a otra. No obstante, los desarrolladores se dan cuenta rápidamente que necesitan aumentar estas reglas de navegación básicas con código personalizado a fin de implementar flujos de página del mundo real que requieren ruteo de página condicional, lógica de inicialización de página y manejo de transacciones. En la próxima versión de Oracle JDeveloper 11g, Oracle Application Development Framework (Oracle ADF) extiende el servicio de flujo de página JSF con avanzadas características orientadas a tareas que eliminan la necesidad de la mayoría de la codificación personalizada. Esta columna examina los conceptos básicos de esta nueva característica del flujo de tareas para mostrar cómo simplifica la creación de aplicaciones.

Para comenzar, descargue el espacio de trabajo inicial y asegúrese de que utiliza la versión Oracle JDeveloper 11.1.1.0 Technology Preview 4, disponible como descarga gratuita de Oracle Technology Network en www.oracle.com/technetwork/developer-tools/jdev/downloads/index.html. Comience por extraer los contenidos del archivo o58frame.zip y abrir el espacio de trabajo FrameworksSepOct2008.jws en Oracle JDeveloper. Fíjese que el proyecto Modelo del espacio de trabajo define un objeto de entidad Dept, un objeto de visualización DeptView y un módulo de aplicación HRModule. Antes de proseguir, ajuste las propiedades de la conexión scott en la zona de Recursos de Aplicaciones del Navegador de Aplicaciones hasta que pueda probar una conexión con éxito en un esquema SCOTT. Si necesita crear las tablas, utilice CreateDeptEmpTables.sql.

Entender los Flujos de Tareas

Un flujo de tarea Oracle ADF encapsula un grupo de actividades en un grupo lógico. Una actividad de visualización despliega las páginas para el usuario final, mientras que otro tipo de actividades realizan las acciones. Cuando usted crea un flujo de tareas, usted decide si será limitado o ilimitado. Un flujo de tareas ilimitado no tiene estructura y permite que el usuario comience en cualquier página. En cambio, un flujo de tarea limitado es una unidad de trabajo autocontenida que se comporta como una función visual. Tiene un solo punto de ingreso, un grupo de parámetros de entrada, y una o más formas de devolver el control (y opcionalmente los valores) al flujo de llamada. Cuando crea un flujo de tarea limitado, usted también decide si sus actividades de visualización representan páginas enteras o solo fragmentos de página. Si utiliza páginas completas, su flujo de tareas limitado puede incorporarse fácilmente en otros flujos de tareas donde sea necesario. Si en cambio utiliza fragmentos de página, su flujo de tareas es una región reutilizable que puede colocar en otras páginas. Los flujos de tareas de esta columna utilizan páginas completas; y usted aprenderá cómo crear regiones reutilizables de fragmentos de página en la próxima columna.

Debido a que el flujo de tareas tiene una agradable representación visual, la forma más fácil de entender lo que hace es mirar un ejemplo. En el Navegador de Aplicaciones, expanda la carpeta Contenido Web del proyecto ViewController, así como la carpeta Flujo de Página que contiene y haga doble click en el flujo de tareas modificar-departamento para abrirlo en el editor. Verá el diagrama mostrado en la Figura 1: un grupo de íconos de actividad de diferentes tipos, conectados por líneas de flujo de control.

En la Figura 1, el círculo en color identifica RouteByMode como la actividad por defecto (inicial) y SaveChanges y CancelChanges como actividades para devolución del flujo de tareas, y estas actividades identifican modificar-departamento como un flujo de tarea limitado. Descubra los diferentes tipos de actividades que emplea el diagrama al mover el cursor sobre los diferentes íconos del editor. RouteByMode es una actividad de ruteo que realiza una navegación condicional. FindDepartment y CreateDepartment son actividades para llamamiento de métodos que invocan la lógica de aplicaciones u operaciones incorporadas. EditDepartment es una actividad de visualización que muestra una página al usuario final, y SaveChanges y CancelChanges son actividades de devolución de flujos de tareas que pasan el control de nuevo al flujo de tareas de llamamiento.

El flujo de tareas modificar-departamento comienza invocando condicionalmente la lógica de la aplicación ya sea para buscar un departamento existente o crear un Nuevo departamento y luego muestra una página para el ingreso de datos. Desde allí, el usuario puede completar la tarea ya sea guardando los cambios o cancelándolos. El diagrama del editor (y la Figura 1) comunica efectivamente la función del flujo de tarea modificar-departamento.

Figura 1

Figura 1: Flujo de tarea modificar-departamento del editor.

Explorar un Flujo de Tarea Limitado

Observemos los parámetros de datos del flujo de tarea. En la ventana Estructura, expanda el nodo ADF Task Flow, haga un click derecho sobre el nodo definición del flujo de la tarea debajo de él, y seleccione Ir a Propiedades. En el Inspector de Propiedad, seleccione la sección Parámetros para ver que se definen dos parámetros de datos denominados modo y rowKeyStrToEdit. Cuando se invoca este flujo de tarea modificar-departamento, luego se pasan los valores para estos parámetros. Usted puede ver que se requiere el parámetro de modo, mientras que el parámetro rowKeyStrToEdit es opcional. El # de expresión del lenguaje de expresión (EL) {pageFlowScope.mode} en la columna Valor de la tabla de Definiciones del Parámetro de Datos indica dónde Oracle ADF guardará el valor del parámetro de datos del modo para referencia de las actividades y las páginas del flujo de tarea. pageFlowScope es un mapa de pares de nombres/valores donde los valores del parámetro de datos del flujo de tareas pueden guardarse mientras dure el flujo de tarea.

Seleccione la actividad RouteByMode en el diagrama del flujo de tarea modificar-departamento, y en la sección Común del Inspector de Propiedad, fíjese cómo las expresiones EL están configuradas para elegir, de manera condicional, el resultado de navegación. Si el atributo pageFlowScope.mode equivale a Agregar, entonces la actividad RouteByMode utiliza el flujo de control Crear para rutear el control a la actividad de invocación del método CreateDepartment con el fin de crear un nuevo departamento. Si este atributo pageFlowScope.mode equivale a Editar, la actividad RouteByMode utiliza el flujo de control Buscar e invoca la actividad FindDepartment. Ambas actividades para invocación de métodos pasan el control a la actividad de visualización EditDepartment.

Haga doble click en la actividad de visualización EditDepartment del flujo de tarea modificar –departamento para abrir la página EditDepartment.jspx correspondiente en el editor visual. Seleccione el componente Texto Resultante en el panel en la parte superior de la página; en el Inspector de Propiedad, la expresión EL, en su propiedad Valor, utiliza las expresiones condicionales que incluyen el atributo de modo para proporcionar un mensaje adecuado. Haga click en Guardar en el editor visual para observar que su propiedad Acción está configurada de acuerdo con la opción Guardar, que pasará el control a la actividad de devolución del flujo de tarea SaveChanges al hacer click sobre ese botón. De manera similar, la propiedad de Acción del botón Cancelar se configure de acuerdo con la opción Cancelar, que navegará hasta la actividad CancelChanges.

Configurar las Actividades del Método

En el flujo de tarea modificar-departamento, tome nota de las señales de advertencia de las actividades para invocación de métodos FindDepartment y CreateDepartment. Esto indica que estas actividades aún no están totalmente configuradas. Para remediar la situación, expanda la sección Control de Datos en el Navegador de Aplicación y expanda HRModuleDataControl, el grupo de datos de Departamentos, y la carpeta Operaciones que contiene. Arrastre el nodo de operación Crear que aparece allí, y suéltelo en la actividad para invocación del método CreateDepartment. Seleccione la actividad CreateDepartment del diagrama, y en la sección Común del Inspector de Propiedad, seleccione Editar de la lista de propiedad de resultados fijos. Repita estos pasos para arrastrar la operación setCurrentRowWithKey para el grupo de datos de Departamentos desde la paleta Control de Datos y suéltela en la actividad para invocar el método FindDepartment. Como antes, configure la propiedad resultado fijo en Editar.

Luego, configure el parámetro para la combinación de acciones de setCurrentRowWithKey relacionadas con este método. Haga un click derecho sobre la actividad FindDepartment y elija Editar Combinación. En la sección Parámetros, ingrese el # de expresión EL {pageFlowScope.rowKeyStrToEdit} en la columna Valor para el parámetro rowKey de la combinación de acciones y luego haga click en OK. Finalmente, asegúrese de que la validación esté desactivada en las definiciones de página relacionadas con las dos combinaciones de acciones. Para hacer esto, haga un click derecho sobre la actividad FindDepartment y elija la Definición Ir a Página. En la ventana Estructura, seleccione el nodo del nivel superior y asegúrese de que la propiedad SkipValidation esté configurada en verdadero. Repita los mismos pasos para la actividad CreateDepartment.

Invocar un Flujo de Tarea

Como último paso antes de poner en marcha la aplicación, terminaremos de configurar un flujo de tarea ilimitado que invoque el flujo de tarea limitado modificar-departamento de arriba. Haga doble click en el archivo XML adfc-config en la carpeta Flujos de Página del Navegador de Aplicación para abrirlo en el editor. Este flujo de tarea contiene la actividad de visualización BrowseDepartments que es reenviada a una actividad para invocación del flujo de tarea modificar-departamento que he creado simplemente al soltar el flujo de tarea modificar -departamento desde el Navegador de Aplicación en el diagrama. La actividad para invocación del flujo de tarea modificar -departamento aparece con un ícono X rojo, ya que el parámetro de modo requerido que el flujo de tarea limitado modificar-departamento espera aún no ha sido configurado.

Abra la página BrowseDepartments.jspx en el editor visual, y seleccione el botón Agregar. En el Inspector de Propiedad, usted puede ver que su propiedad Acción dispara la regla del flujo de control AddOrEdit. Al seleccionar el componente af:setActionListener (alojado dentro de este componente af:commandButton en la ventana Estructura), usted puede ver que establece el valor constante Agregar en un atributo denominado modo en requestScope. De manera similar, fíjese que la propiedad Acción del botón Editar dispara la misma regla de flujo de control AddOrEdit y ha alojado los componentes setActionListener que establecen el valor constante Editar en requestScope.mode, y configura la tecla de la fila de la fila actual—utilizando el # de expresión {bindings.Departments.rowKeyStr}—dentro del atributo rowKeyStr en requestScope. Por lo tanto, estos botones ya están configurados para establecer valores adecuados en los atributos requestScope que podemos utilizar como datos para la invocación del flujo de tarea.

Haga click en adfc-config.xml, en el editor, para traerlo al frente, y seleccione la actividad para invocación del flujo de tarea modificar -departamento. En el Inspector de Propiedad, seleccione la sección Parámetros y en la tabla de Parámetros de Datos, ingrese el # de expresión EL {requestScope.mode} como valor del parámetro de modo, e ingrese el # de expresión EL {requestScope.rowKeyStr} como valor del parámetro rowKeyStrToEdit. Esto configura la invocación del flujo de tarea para “sacar” sus parámetros de datos de las ubicaciones relacionadas con el alcance de la solicitud donde los botones han almacenado temporalmente estos valores durante la solicitud actual.

Debido a que la configuración de ejecución por defecto del proyecto ViewController ya está configurada para tener la actividad BrowseDepartments del flujo de tarea adfc-config como el objetivo de ejecución por defecto, usted puede probar la aplicación al hacer click derecho sobre el proyecto ViewController en el Navegador de Aplicación y elegir Ejecutar. Cuando aparece la página de navegación, verá que puede explorar, agregar y editar los departamentos excelentemente bien, con los flujos de tarea limitados e ilimitados trabajando juntos para manejar toda la lógica de aplicaciones comunes y el manejo de transacciones sin una línea de código.

Como siempre, hemos podido obtener solo un vistazo de esta nueva característica poderosa para flujos de tarea dentro del espacio aquí disponible. Para obtener información más detallada sobre esta característica, le sugiero leer los capítulos de la Parte III de la Guía para Desarrolladores Fusion de Oracle ADF 11g, disponible en OTN: http://www.oracle.com/technetwork/developer-tools/jdev/downloads/index.html.

Tenga en cuenta que ahora veo el apellido Whalen así como todos los usuarios definidos en esta instancia. Este no es el uso planificado para este procedimiento, pero un usuario inteligente (sin malas intenciones) puede cambiar el propósito de mi procedimiento para ejecutar una clase diferente de código.
La inyección SQL presenta un importante desafío de seguridad en cualquier entorno de programación de base de datos. No tengo espacio en esta columna para abordar este tema, pero Oracle ha establecido el Centro para Tecnología de Seguridad en la Red de Tecnología de Oracle. Este centro ofrece una guía sobre inyección SQL y otros temas relacionados con la seguridad. Recomiendo fuertemente que usted aproveche este centro para reducir la probabilidad de poner en producción cualquier programa almacenado que permita a los usuarios proporcionar texto para ser concatenado en cadenas SQL dinámicas.

 


Steve Muench es un gerente asesor de productos para Oracle JDeveloper y un Oracle ACE. Desde 1990 ha desarrollado y respaldado las herramientas Oracle y las tecnologías XML y sigue promoviéndolas.