Diferencia entre revisiones de «Adobe Flex En Portlets»

De Dos Ideas.
Saltar a: navegación, buscar
(Un MXML)
m (Revertidos los cambios de 190.230.100.80 (disc.) a la última edición de 190.176.150.32)
 
(No se muestran 45 ediciones intermedias de 6 usuarios)
Línea 1: Línea 1:
Las aplicaciones Flex son archivos flash desarrollados con un entorno orientado a aplicaciones RIA. Desplegar estas aplicaciones en un portal (JSR 168 - JSR 286) implica empaquetarlas en un fragmento de html y proveer la comunicación necesaria con el portal.
+
[[Categoría: Adobe Flex]]
 +
[[Categoría: Portlet]]
 +
Las aplicaciones [[Adobe Flex]] son archivos flash desarrollados con un entorno orientado a aplicaciones RIA. Desplegar estas aplicaciones en un portal ([[JSR 168]] - [[JSR 286]]) implica empaquetarlas en un fragmento de html y proveer la comunicación necesaria con el portal.
  
=== Un MXML ===
+
== Elementos de este ejemplo ==
Este es un MXML simple que muestra un título, una frase y un botón. En este ejemplo se compilará con una tarea de ant.
+
* '''flexPortlet.mxml''' Archivo tipo xml con el código fuente de la aplicación Flex que se compilará produciendo un archivo SWF.
 +
* '''flexPortlet.swf''' Archivo SWF producto de la compilación de la aplicación Flex. Este archivo binario se inserta en un html y es interpretado y ejecutado por el plugin de Flash del navegador web del cliente.
 +
* '''flexPortletView.jsp''' JSP que funcionará como vista del portlet. Producirá el html necesario para incluir el swf y comunicarse con el portal.
 +
* '''FlexPortlet.java''' Clase de Java que extendie de GenericPortlet. Funciona como un portlet tradicional. En esta clase se programará el soporte para que el SWF pueda comunicarse con el portal.
 +
* '''build.xml''' Script de ant típico para la compilación del proyecto con el agregado de una tarea específica de compilación de Flex.
  
Es un xml de flex que describe los elementos que tendrá la aplicación.
+
=== flexPortlet.mxml ===
 +
 
 +
Este es el código fuente de la aplicación de Flex. Una vez compilado generará un archivo SWF listo para insertarse en un Html y ser interpretado y ejecutado por el navegador del cliente.
 +
 
 +
En este caso cuenta con tres elementos: un texto a modo de título, un texto a modo de frase que se cambiará dinámicamente y un botón que realiza una acción.
 +
 
 +
Al presionar el botón, la acción que realizará será la de asignar el valor que recibió en forma externa desde el html al texto del elemento ''unaFrase''.
 +
 
 +
Los atributos recibidos en forma externa a través de '''flashVars''' se ven reflejados en '''Application.application.parameters'''.
  
 
<code xml>
 
<code xml>
 
<?xml version="1.0" encoding="utf-8"?>
 
<?xml version="1.0" encoding="utf-8"?>
  
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="200">
+
<mx:Application  
 +
        xmlns:mx="http://www.adobe.com/2006/mxml"  
 +
        layout="absolute"
 +
        width="400"
 +
        height="200" >
  
<mx:Label  
+
    <mx:Label  
            x="10"
+
        x="10"
            y="10"  
+
        y="10"  
            text="Esta es un titulo"  
+
        text="Esta es un titulo"  
            fontFamily="Courier New"  
+
        fontFamily="Courier New"  
            fontSize="14"  
+
        fontSize="14"  
            fontWeight="bold"  
+
        fontWeight="bold"  
            fontStyle="normal"/>
+
        fontStyle="normal"/>
<mx:Label  
+
 
            x="10"  
+
    <mx:Label  
            y="40"  
+
        x="10"  
            fontFamily="Courier New"  
+
        y="40"  
            fontSize="27"  
+
        fontFamily="Courier New"  
            fontWeight="bold"  
+
        fontSize="27"  
            fontStyle="normal"  
+
        fontWeight="bold"  
            id="unaFrase"/>
+
        fontStyle="normal"  
        <mx:Button  
+
        id="unaFrase"/>
            x="100"  
+
 
            y="110"  
+
    <mx:Button  
            label="Este es un boton" />
+
        x="100"  
 +
        y="110"  
 +
        label="Este es un boton"
 +
        click="unaFrase.text = Application.application.parameters.unAtributo" />
  
 
</mx:Application>
 
</mx:Application>
 
</code>
 
</code>
  
=== El JSP ===
+
=== flexPortlet.swf ===
 +
 
 +
Este es el archivo que se generará como resultado de la compilación de flexPortlet.mxml. Es un archivo binario de Flash que se ejecutará del lado del cliente a través del navegador que debe tener instalado el plugin de Adobe Flash Player.
 +
 
 +
=== flexPortletView.jsp ===
 +
 
 +
Funcionará como vista del portlet y desde donde se tendrá acceso al entorno. Este JSP generará el HTML necesario para insertar el SWF de la aplicación Flex.
 +
 
 +
Desde el JSP se pueden inyectar valores a la aplicación Flex, durante el inicio en el navegador del cliente.
 +
 
 +
La parte que inserta el swf tiene dos elementos principales: '''<object>''' y '''<embed>'''. Estos dos elementos sirven para insertar el SWF en diferentes navegadores por lo que los atributos se repetirán prácticamente igual en uno y en otro.
 +
 
 +
Dentro de estos elementos se utiliza el atributo '''flashVars''' para pasar los valores al SWF. En este caso se tomará con un tag de JSP '''<%=request.getAttribute("unAtributo")%>''' el atributo ''"unAtributo"'' del ''request'' del contexto y se lo pasará a una variable con el nombre ''unAtributo'' en el SWF.
 +
 
 +
Otro valor que hay que generar con un tag de la librería de portlets es la URL (ver [[Adobe Flex En Portlets#URLs Opacos|URLs Opacos]]) del archivo SWF: '''<portlet:resourceURL id="/WEB-INF/flex/flexPortlet.swf"/>'''.
 +
 
 +
<code xml>
 +
<%@page contentType="text/html"%>
 +
<%@page pageEncoding="UTF-8"%>
 +
<%@ page import="javax.portlet.*"%>
 +
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>
 +
 
 +
<portlet:defineObjects />
  
El SWF que resulta de la compilación del MXML se inserta en un JSP que generará el HTML necesario. El JSP sirve también para preparar atributos que envíe el portlet.
+
<object
 +
    classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
 +
    id="flexPortlet"
 +
    width="100%"
 +
    height="100%"
 +
    codebase="http://fpdownload.macromedia.com/get/flashplayer/curren/swflash.cab">
 +
    <param name="movie"
 +
        value="<portlet:resourceURL 
 +
        id="/WEB-INF/flex/flexPortlet.swf"/>" />
 +
    <param name="quality" value="high" />
 +
    <param name="bgcolor" value="#FF0000" />
 +
    <param
 +
        name="flashVars"
 +
        value="unAtributo=<%=request.getAttribute("unAtributo")%>" />
 +
    <param name="allowScriptAccess" value="sameDomain" />
  
<code>
+
    <embed
 +
        src="<portlet:resourceURL id="/WEB-INF/flex/flexPortlet.swf"/>"
 +
        quality="high"
 +
        bgcolor="#00FF00"
 +
        width="100%"
 +
        height="100%"
 +
        name="HolaProject"
 +
        align="middle"
 +
        play="true"
 +
        loop="false"
 +
        quality="high"
 +
        allowScriptAccess="sameDomain"
 +
        type="application/x-shockwave-flash"
 +
        flashVars="unAtributo=
 +
            <%=request.getAttribute("unAtributo")%>"
 +
        pluginspage="http://www.adobe.com/go/getflashplayer">
 +
    </embed>
 +
</object>
 
</code>
 
</code>
  
=== El portlet ===
+
=== FlexPortlet.java ===
  
El portlet no tiene ninguna particularidad, simplemente deriva el procesamiento de la vista al JSP.
+
Esta clase se programa como un portlet común. En este caso extiende de GenericPortlet y deriva la construcción de la vista a ''flexPortletView.jsp''.
 +
 
 +
Durante el render se cargará también el atributo '''unAtributo''' para que esté disponible en el JSP para asignárselo luego al SWF de la aplicación Flex.
  
 
<code java>
 
<code java>
Línea 52: Línea 128:
 
     public void doView(RenderRequest request, RenderResponse response) {
 
     public void doView(RenderRequest request, RenderResponse response) {
 
         response.setContentType("text/html");
 
         response.setContentType("text/html");
 +
        request.setAttribute("unAtributo", "Hola mundo!");
 
         PortletRequestDispatcher dispatcher = getPortletContext()
 
         PortletRequestDispatcher dispatcher = getPortletContext()
 
             .getRequestDispatcher("/WEB-INF/flex/flexPortletView.jsp");
 
             .getRequestDispatcher("/WEB-INF/flex/flexPortletView.jsp");
Línea 61: Línea 138:
 
</code>
 
</code>
  
==== Tarea ant y compilación ====
+
=== build.xml ===
  
Para compilar el MXML es necesario incluir un jar con los task de ant que viene en la distribución del SDK de flex: flexTasks.jar.
+
Existe una tareas ant para la compilar el archivo MXML y generar un SWF. Para utilizarla es necesario incluir en el classpath '''flexTasks.jar''' que puede encontrarse dentro de los directorios del SDK de Flex.
  
En el build de ant se agrega la definición de la tarea de flex y en el target apropiado se agrega la tarea <mxmlc/> que compila los mxml.
+
Puntos relevantes:
 +
* '''FLEX_HOME''' es la ruta a la home del SDK de Flex.
 +
* '''<mxmlc/>''' es el tag que llama a la tarea del compilador de Flex.
  
 
<code xml>
 
<code xml>
Línea 75: Línea 154:
 
     <target name="compile.flex">
 
     <target name="compile.flex">
 
         <mxmlc file="${APP_ROOT}\flexPortlet.mxml" keep-generated-actionscript="false">
 
         <mxmlc file="${APP_ROOT}\flexPortlet.mxml" keep-generated-actionscript="false">
asdf
 
 
             <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
 
             <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
 
             <source-path path-element="${FLEX_HOME}/frameworks"/>
 
             <source-path path-element="${FLEX_HOME}/frameworks"/>
Línea 83: Línea 161:
 
</code>
 
</code>
  
 +
== URLs Opacos ==
  
=== URLs Opacos ===
+
Debe tenerse en cuenta que las URLs de un portal no son transparentes. Por eso, para insertar el archivo SWF en el HTML es necesario que el portal codifique la URL a partir de la ruta que se le especifica. Una forma de lograr esto es a través del tag '''<portlet:resourceURL/>''' de la librería de tags de portlets.
 
 
Teniendo en cuenta que las urls de un portal no son transparentes, debemos encontrar un mecanismo para poder comunicarnos con el portal.
 
Esta comunicación puede ser a través de ActionURLs, RenderURLs o ResourceURLs.
 
En cualquiera de los casos la mecánica es la misma, estos URLs deben construirse del lado del servidor en el objeto del portlet o dentro del JSP y pasarse como parámetros al objeto SWF de nuestra aplicación Flex.
 
 
 
==== Construcción de un URL ====
 
 
 
==== Pasarlo como parámetro ====
 
 
 
=== Eventos JSR 286 ===
 
 
 
==== Evolucionando ====
 
Esta es una forma básica de desarrollar, integrar y comunicarse con aplicaciones Flex. Existen varias herramientas y frameworks que pueden facilitarnos el desarrollo. BlazeDS nos facilita la comunicación con objetos Java desplegados de diversas maneras. FlexBuilder 3 es un entorno que nos facilita el desarrllo de la aplicación Flex. LCDSES facilita el despliegue, interación y servicio de las aplicaciones Flex.
 
  
=== Ver también ===
+
Otra posibilidad es construirla en la clase Java del portlet y pasarla como atributo del '''request'''.
  
BlazeDS
+
== Ver también ==
LiveCycle Data Services ES
+
* [[Adobe Flex]]
FlexBuilder 3
+
* [[Portlet Specification Api]]
 +
* [[JSR 168]] - Java Portlet Specification V1.0
 +
* [[JSR 286]] - Java Portlet Specification V2.0

Revisión actual del 19:17 6 abr 2010

Las aplicaciones Adobe Flex son archivos flash desarrollados con un entorno orientado a aplicaciones RIA. Desplegar estas aplicaciones en un portal (JSR 168 - JSR 286) implica empaquetarlas en un fragmento de html y proveer la comunicación necesaria con el portal.

Elementos de este ejemplo

  • flexPortlet.mxml Archivo tipo xml con el código fuente de la aplicación Flex que se compilará produciendo un archivo SWF.
  • flexPortlet.swf Archivo SWF producto de la compilación de la aplicación Flex. Este archivo binario se inserta en un html y es interpretado y ejecutado por el plugin de Flash del navegador web del cliente.
  • flexPortletView.jsp JSP que funcionará como vista del portlet. Producirá el html necesario para incluir el swf y comunicarse con el portal.
  • FlexPortlet.java Clase de Java que extendie de GenericPortlet. Funciona como un portlet tradicional. En esta clase se programará el soporte para que el SWF pueda comunicarse con el portal.
  • build.xml Script de ant típico para la compilación del proyecto con el agregado de una tarea específica de compilación de Flex.

flexPortlet.mxml

Este es el código fuente de la aplicación de Flex. Una vez compilado generará un archivo SWF listo para insertarse en un Html y ser interpretado y ejecutado por el navegador del cliente.

En este caso cuenta con tres elementos: un texto a modo de título, un texto a modo de frase que se cambiará dinámicamente y un botón que realiza una acción.

Al presionar el botón, la acción que realizará será la de asignar el valor que recibió en forma externa desde el html al texto del elemento unaFrase.

Los atributos recibidos en forma externa a través de flashVars se ven reflejados en Application.application.parameters.

<?xml version="1.0" encoding="utf-8"?>

<mx:Application

       xmlns:mx="http://www.adobe.com/2006/mxml" 
       layout="absolute"
       width="400"
       height="200" >
   <mx:Label 
       x="10"
       y="10" 
       text="Esta es un titulo" 
       fontFamily="Courier New" 
       fontSize="14" 
       fontWeight="bold" 
       fontStyle="normal"/>
   <mx:Label 
       x="10" 
       y="40" 
       fontFamily="Courier New" 
       fontSize="27" 
       fontWeight="bold" 
       fontStyle="normal" 
       id="unaFrase"/>
   <mx:Button 
       x="100" 
       y="110" 
       label="Este es un boton"
       click="unaFrase.text = Application.application.parameters.unAtributo" />

</mx:Application>

flexPortlet.swf

Este es el archivo que se generará como resultado de la compilación de flexPortlet.mxml. Es un archivo binario de Flash que se ejecutará del lado del cliente a través del navegador que debe tener instalado el plugin de Adobe Flash Player.

flexPortletView.jsp

Funcionará como vista del portlet y desde donde se tendrá acceso al entorno. Este JSP generará el HTML necesario para insertar el SWF de la aplicación Flex.

Desde el JSP se pueden inyectar valores a la aplicación Flex, durante el inicio en el navegador del cliente.

La parte que inserta el swf tiene dos elementos principales: <object> y <embed>. Estos dos elementos sirven para insertar el SWF en diferentes navegadores por lo que los atributos se repetirán prácticamente igual en uno y en otro.

Dentro de estos elementos se utiliza el atributo flashVars para pasar los valores al SWF. En este caso se tomará con un tag de JSP <%=request.getAttribute("unAtributo")%> el atributo "unAtributo" del request del contexto y se lo pasará a una variable con el nombre unAtributo en el SWF.

Otro valor que hay que generar con un tag de la librería de portlets es la URL (ver URLs Opacos) del archivo SWF: <portlet:resourceURL id="/WEB-INF/flex/flexPortlet.swf"/>.

<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@ page import="javax.portlet.*"%> <%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>

<portlet:defineObjects />

<object

   classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
   id="flexPortlet" 
   width="100%" 
   height="100%"
   codebase="http://fpdownload.macromedia.com/get/flashplayer/curren/swflash.cab">
   <param name="movie" 
       value="<portlet:resourceURL  
       id="/WEB-INF/flex/flexPortlet.swf"/>" />
   <param name="quality" value="high" />
   <param name="bgcolor" value="#FF0000" />
   <param 
       name="flashVars" 
       value="unAtributo=<%=request.getAttribute("unAtributo")%>" />
   <param name="allowScriptAccess" value="sameDomain" />
   <embed 
       src="<portlet:resourceURL id="/WEB-INF/flex/flexPortlet.swf"/>" 
       quality="high" 
       bgcolor="#00FF00"
       width="100%" 
       height="100%" 
       name="HolaProject" 
       align="middle"
       play="true"
       loop="false"
       quality="high"
       allowScriptAccess="sameDomain"
       type="application/x-shockwave-flash"
       flashVars="unAtributo= 
           <%=request.getAttribute("unAtributo")%>"				
       pluginspage="http://www.adobe.com/go/getflashplayer">
   </embed>

</object>

FlexPortlet.java

Esta clase se programa como un portlet común. En este caso extiende de GenericPortlet y deriva la construcción de la vista a flexPortletView.jsp.

Durante el render se cargará también el atributo unAtributo para que esté disponible en el JSP para asignárselo luego al SWF de la aplicación Flex.

public class FlexPortlet extends GenericPortlet {

   ...
   public void doView(RenderRequest request, RenderResponse response) {
       response.setContentType("text/html");
       request.setAttribute("unAtributo", "Hola mundo!");
       PortletRequestDispatcher dispatcher = getPortletContext()
            .getRequestDispatcher("/WEB-INF/flex/flexPortletView.jsp");
       dispatcher.include(request, response);
   }
   ...

}

build.xml

Existe una tareas ant para la compilar el archivo MXML y generar un SWF. Para utilizarla es necesario incluir en el classpath flexTasks.jar que puede encontrarse dentro de los directorios del SDK de Flex.

Puntos relevantes:

  • FLEX_HOME es la ruta a la home del SDK de Flex.
  • <mxmlc/> es el tag que llama a la tarea del compilador de Flex.

   <property name="FLEX_HOME" value="C:\flexSDK3.2.0\"/>
   <property name="APP_ROOT" value=".\src\flex"/>
   <taskdef resource="flexTasks.tasks" classpath="../lib/ext/flexTasks.jar" />
   <target name="compile.flex">
       <mxmlc file="${APP_ROOT}\flexPortlet.mxml" keep-generated-actionscript="false">
           <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>
           <source-path path-element="${FLEX_HOME}/frameworks"/>
       </mxmlc>
   </target>

URLs Opacos

Debe tenerse en cuenta que las URLs de un portal no son transparentes. Por eso, para insertar el archivo SWF en el HTML es necesario que el portal codifique la URL a partir de la ruta que se le especifica. Una forma de lograr esto es a través del tag <portlet:resourceURL/> de la librería de tags de portlets.

Otra posibilidad es construirla en la clase Java del portlet y pasarla como atributo del request.

Ver también