Siguiendo el siguiente artículo:
http://blog.carlosmayo.net/2007/07/utilizando-ajax-y-json-con-struts.html
y este otro :
http://www.weheartcode.com/2007/05/16/using-protototype-ajax-json-with-j2ee-and-struts/
es fácil combinarlo todo en un proyecto Struts.
Solo comentar que la para versión Prototype se ha elegido la 1.5, con la 1.6 se ha encontrado algún problema con el charset.
;-)
domingo, 30 de noviembre de 2008
miércoles, 21 de mayo de 2008
Nueva versión de de AlivePDF, ahora es mucho más sencillo agregar un JPG al PDF .
myPDF.addImageStream( new jpgBytes() as ByteArray, 0, 0, 0, 0, 1, ImageResize.RESIZE_PAGE );
martes, 22 de abril de 2008
generar pdf con actionscript usando AlivePDF
En muchos proyectos, siempre surge el "y no puedo imprimirme esto?"... si la aplicación es un entorno web, se suele recurrir entonces a generar un PDF.
Trabajando con Flex y ActionScript, me he topado con AlivePDF, una librería SWC que permite generar este tipo de documentos desde ActionScript. En la web hay un par de video tutoriales muy sencillos y para empezar vienen muy bien.
Aunque en los ejemplos utilizan un PHP para devolver el documento, yo he probado con el servlet de Java que tienen posteado, y también funciona.
Se puede hacer de todo con el documento, hasta dibujar, usando el API que proporciona.
AS:
Trabajando con Flex y ActionScript, me he topado con AlivePDF, una librería SWC que permite generar este tipo de documentos desde ActionScript. En la web hay un par de video tutoriales muy sencillos y para empezar vienen muy bien.
Aunque en los ejemplos utilizan un PHP para devolver el documento, yo he probado con el servlet de Java que tienen posteado, y también funciona.
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class CreatePDFServlet extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
doGet(req, resp);
}
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
int i = 0;
int k = 0;
int maxLength = req.getContentLength();
byte[] bytes = new byte[maxLength];
String method = req.getParameter("method");
String name = req.getParameter("name");
ServletInputStream si = req.getInputStream();
while (true)
{
k = si.read(bytes,i,maxLength);
i += k;
if (k <= 0)
break;
}
if (bytes != null)
{
ServletOutputStream stream = resp.getOutputStream();
resp.setContentType("application/pdf");
resp.setContentLength(bytes.length);
resp.setHeader("Content-Disposition",method + ";filename=" + name);
stream.write(bytes);
stream.flush();
stream.close();
}
else
{
resp.setContentType("text");
resp.getWriter().write("bytes is null");
}
}
}
Se puede hacer de todo con el documento, hasta dibujar, usando el API que proporciona.
AS:
myPDF = new PDF( Orientation.PORTRAIT, Unit.MM, Size.A4 );
myPDF.setDisplayMode( Display.FULL_PAGE, Layout.SINGLE_PAGE );
lunes, 7 de abril de 2008
Spring Hibernate - Lazy initialization
Lazy Initialization and the DAO pattern with Hibernate and Spring
Este artículo me ha venido de maravilla para poder integrar SpringWF con Hibernate. Como el autor explica, Hibernate ofrece ambos modos de carga de datos, "lazy" y "no-lazy". La diferencia es importante, ya que en modo "no-lazy", al inicializar el objeto, Hibernate inicializará también los objetos relacionados, esto puede suponer un número elevado de SQL's al inicializar una entidad. Además la situación empeorará si en el sistema existen relaciones bidireccionales entre las entidades, lo que puede suponer la necesidad de cargar gran parte de la base de datos.
Yo lo he probado con el con la configuración del Interceptor, y funciona bien, por ese motivo no he llegado a probar la configuración con el Filter, aunque entiendo que también funcionará.
Se puede incluso configurar Spring para que cree automaticamente los "target beans" del "interceptor", resulta cómodo aunque hay que seguir la regla de nombres.
Este artículo me ha venido de maravilla para poder integrar SpringWF con Hibernate. Como el autor explica, Hibernate ofrece ambos modos de carga de datos, "lazy" y "no-lazy". La diferencia es importante, ya que en modo "no-lazy", al inicializar el objeto, Hibernate inicializará también los objetos relacionados, esto puede suponer un número elevado de SQL's al inicializar una entidad. Además la situación empeorará si en el sistema existen relaciones bidireccionales entre las entidades, lo que puede suponer la necesidad de cargar gran parte de la base de datos.
Yo lo he probado con el con la configuración del Interceptor, y funciona bien, por ese motivo no he llegado a probar la configuración con el Filter, aunque entiendo que también funcionará.
Se puede incluso configurar Spring para que cree automaticamente los "target beans" del "interceptor", resulta cómodo aunque hay que seguir la regla de nombres.
<bean class=
"org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames"><value>*myTargetBean</value></property>
<property name="interceptorNames">
<list>
<value>myInterceptor</value>
</list>
</property>
</bean>
martes, 1 de abril de 2008
trasteando con HSQLDB
Esta es una pequeÑa tarea Ant, que arranca el servidor local de HSQLDB.
Es un servidor de base de datos implementado en Java, muy práctico para desarrollo en local.
Hay que tener en cuenta que no es servidor para producción.
El JAR incluye definición de tareas para ANT, y también existen plugins de Maven2 o plugins para Eclipse.
Aunque hacerlo con ANT resulta sencillo, y es fácil de gestionar con la vista ANT de Eclipse.
<!-- RUN HSQLDB -->
<target name="run-hsqldb" depends="init">
<echo message="Run HSQLDB"/>
<java classname="org.hsqldb.Server" fork="true" failonerror="true">
<classpath refid="hsqldb_classpath"/>
<arg line="-database.0 src/main/database/DBNAME -dbname.0 DBNAME"/>
</java>
</target>
En "init" definir el classpath incluyendo el jar de HSQLDB.
También incluye un DB Manager visual, lo justo para ejecutar SQL, que no es poco...
<!-- DB MANAGER -->
<target name="dbmanager" depends="run-hsqldb" description="Start HSQLDB manager" >
<echo message="Start DB Manager"/>
<java classname="org.hsqldb.util.DatabaseManagerSwing"
fork="yes" classpathref="compile.classpath" failonerror="true">
<arg value="-url"/>
<arg value="jdbc:hsqldb:hsql://localhost/DBNAME"/>
<arg value="-driver"/>
<arg value="org.hsqldb.jdbcDriver"/>
</java>
</target>
Ya por último, para ejecutar SQL que tengamos almacenados en fichero:
<!-- MY SCRIPTS -->
<target name="createDatabase" >
<sql classpathref="compile.classpath"
driver="org.hsqldb.jdbcDriver"
url="jdbc:hsqldb:hsql://localhost/DBNAME"
userid="sa"
password=""
src="src/main/database/mySQLScript.sql"
/>
</target>
Es un servidor de base de datos implementado en Java, muy práctico para desarrollo en local.
Hay que tener en cuenta que no es servidor para producción.
El JAR incluye definición de tareas para ANT, y también existen plugins de Maven2 o plugins para Eclipse.
Aunque hacerlo con ANT resulta sencillo, y es fácil de gestionar con la vista ANT de Eclipse.
<!-- RUN HSQLDB -->
<target name="run-hsqldb" depends="init">
<echo message="Run HSQLDB"/>
<java classname="org.hsqldb.Server" fork="true" failonerror="true">
<classpath refid="hsqldb_classpath"/>
<arg line="-database.0 src/main/database/DBNAME -dbname.0 DBNAME"/>
</java>
</target>
En "init" definir el classpath incluyendo el jar de HSQLDB.
También incluye un DB Manager visual, lo justo para ejecutar SQL, que no es poco...
<!-- DB MANAGER -->
<target name="dbmanager" depends="run-hsqldb" description="Start HSQLDB manager" >
<echo message="Start DB Manager"/>
<java classname="org.hsqldb.util.DatabaseManagerSwing"
fork="yes" classpathref="compile.classpath" failonerror="true">
<arg value="-url"/>
<arg value="jdbc:hsqldb:hsql://localhost/DBNAME"/>
<arg value="-driver"/>
<arg value="org.hsqldb.jdbcDriver"/>
</java>
</target>
Ya por último, para ejecutar SQL que tengamos almacenados en fichero:
<!-- MY SCRIPTS -->
<target name="createDatabase" >
<sql classpathref="compile.classpath"
driver="org.hsqldb.jdbcDriver"
url="jdbc:hsqldb:hsql://localhost/DBNAME"
userid="sa"
password=""
src="src/main/database/mySQLScript.sql"
/>
</target>
lunes, 10 de marzo de 2008
spring web flow

La idea es probar Spring Web Flow la descarga incluye algunos ejemplos, además de los fuentes y documentación.
A continuación la lista de herramientas a instalar para montar un proyecto.
- JDK 1.6
- Eclipse IDE for Java EE Developers
- Apache Tomcat 5.5
- Maven 2 Eclipse IDE Integration
- Spring IDE
Son proyectos Eclipse, así que pueden importarse a nuestro workspace.
Los proyectos usan ant, pero no es difícil adaptarlos a maven2. Le crearemos un pom.xml al proyecto importado, hay que situarlo en la raíz del proyecto.
A continuación le añadiremos la dependencia a spring web flow.
Una vez creado el pom.xml hay que habilitar el proyecto para Maven, botón derecho sobre el proyecto, Maven --> Enable Dependency Management, a partir de ese momento maven tratará de resolver el classpath del proyecto agrengando una librería llamada Maven Dependencies al Build Path del proyecto. Es posible seguir la traza, cambiando la consola de Eclipse a Maven Console.
Bueno, ahora solo falta empaquetar el war y deployarlo en Tomcat para probarlo, y que funcione a la primera... :-)
Como seguro que hay que "retocar" alguna configuración, yo prefiero convertir el proyecto a Dynamic Web Project, y evitar tener que hacer el war cada vez. Definiendo un Server en Eclipse es posible gestionar el Tomcat y es mucho más cómodo para trabajar. Eso ya lo contaré otro día...
viernes, 7 de marzo de 2008
adsense script en blogspot
Para incluir anuncios de referencia Adsense en Blogspot. La verdad que el parser es cómodo, aunque todavía no me he currado mucho el diseño y se me repite el mismo anuncio por todas partes. :-( No se si con esto se gana pasta, pero la verdad por lo que cuesta, igual vale la pena probar... nunca se sabe.
http:// www.google.es/adsense
http://www.blogmundi.com/2007/01/31/como-anadir-adsense-en-los-posts-del-nuevo-blogger-antes-beta/
http://www.adseok.com/adsense/5-peores-errores-adsense/
http:// www.google.es/adsense
http://www.blogmundi.com/2007/01/31/como-anadir-adsense-en-los-posts-del-nuevo-blogger-antes-beta/
http://www.adseok.com/adsense/5-peores-errores-adsense/
jueves, 28 de febrero de 2008
Adobe Flex 3
El software Adobe Flex Builder 3 ya está disponible en las ediciones Standard y Professional. La edición Standard ofrece nuevas características como el refactoring de código, reducción del tamaño de SWF y un mejorado flujo de trabajo del skinning y el estilo.Hay una edicón Professional del Flex Builder, 60 dias, pero aún no he podido probarlo por las "limitaciones" de mi máquina...todo llegará.
FLEX BUILDER 3 FOR WINDOWS (STANDARD AND PROFESSIONAL)
- Intel® Pentium® 4 processor

- Microsoft® Windows® XP with Service Pack 2 or Windows Vista® Home Premium
- 1GB of RAM (2GB recommended)
- 500MB of available hard-disk space (additional 500MB required for plug-in configuration)
- Java™ Virtual Machine: Sun™ JRE 1.4.2, Sun JRE 1.5 (included), IBM® JRE 1.5, or Sun JRE 1.6
- Eclipse™ 3.2.2 or higher for plug-in configuration (Eclipse 3.3 recommended for Windows Vista)
- Adobe® Flash® Player 9 software*
- BEA Workshop 10.1
- IBM Rational Software Architect 7.0.0.3 (Eclipse 3.3 plug-in configuration only)
http://www.onflex.org/ted/2007/01/flex-3-most-important-feature.php
http://www.madeinflex.com/2007/06/11/flex-3-y-adobe-integrated-runtime/
http://www.360conferences.com/360flex/
miércoles, 13 de febrero de 2008
glassfish
" GlassFish is a free, open source application server which implements the newest features in the Java EE 5 platform. The Java EE 5 platform includes the latest versions of technologies such as such as JavaServer Pages(JSP) 2.1, JavaServer Faces(JSF) 1.2, Servlet 2.4, Enterprise JavaBeans 3.0, Java API for Web Services(JAX-WS) 2.0, Java Architecture for XML Binding(JAXB) 2.0, Web Services Metadata for the Java Platform 1.0, and many other new technologies."https://glassfish.dev.java.net/public/users.html
Dispone de un wiki, donde hay muchísima documentación, también se puede encontrar mucha información En el blog The Aquarium.
Algunas comparativas con otros servidores de aplicaciones java:
martes, 12 de febrero de 2008
lunes, 28 de enero de 2008
Pool de conexiones Oracle con Spring
Es posible crear un pool de conexiones a la base de datos usando la siguiente configuración de beans. Utiliza commons-dbpc y los drivers de jdbc de Oracle. Los parámetros se cargan de un fichero .properties usando PropertyPlaceholderConfigurer de Spring.No hay que olvidar devolver las conexiones al pool después de utilizarlas.
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>/WEB-INF/classes/jdbc.properties</value>
</property>
</bean>
<!--============================== -->
<!-- ==POOLED ORACLE DATASOURCE == -->
<!--============================== -->
<bean id="dataSource" class="org.apache.commons.dbcp.datasources.SharedPoolDataSource">
<property name="maxActive" ><value>${jdbc.maxActive}</value></property>
<property name="maxIdle" ><value>${jdbc.maxIdle}</value></property>
<property name="maxWait" ><value>${jdbc.maxWait}</value></property>
<property name="connectionPoolDataSource">
<bean class="oracle.jdbc.pool.OracleConnectionPoolDataSource">
<property name="URL"><value>${jdbc.url}</value></property>
<property name="user"><value>${jdbc.username}</value></property>
<property name="password"><value>${jdbc.password}</value></property>
<property name="dataSourceName"><value></value></property>
</bean>
</property>
</bean>
viernes, 18 de enero de 2008
compilar flex usando ant

En lugar de usar el Flex Builder para compilar los swf, se puede invocar Flex SDK desde ANT consiguiendo el mismo resultado. Usar el plugin de eclipse para compilar flex es muy cómodo para el desarrollador, pero es preferible no subir al repositorio de versiones, los binarios generados en local, es mejor hacer la compilación en el build, al igual que se hace en java.
De esta manera es posible invocar al compilador java, pasándole los argumentos necesarios desde ant.
<!-- Uses jar files from Flex SDK to compile -->
<target name="compilemxml" >
<!-- Gets SWF name from mxml file name -->
<basename property="swfname" file="${filename}" suffix=".mxml"/>
<java jar="${FLEX_HOME}/lib/mxmlc.jar" fork="true" maxmemory="128m">
<jvmarg value="-Dapplication.home=${FLEX_HOME}"/>
<arg value="-compiler.services" />
<arg value="${DEPLOY_DIR}/WEB-INF/flex/services-config.xml" />
<arg value="-load-config" />
<arg value="${DEPLOY_DIR}/WEB-INF/flex/flex-config.xml" />
<arg value="-context-root"/>
<arg value="${context.root}"/>
<arg value="-source-path" />
<arg value="${SRC_DIR}"/>
<arg value="-output" />
<arg value="${OUT_DIR}/${swfname}.swf"/>
<arg value="${filename}" />
<arg value="-library-path" />
<arg value="${FLEX_HOME}/frameworks/libs" />
<arg value="${FLEX_HOME}/frameworks/locale/{locale}" />
<arg value="-locale" />
<arg value="en_US" />
<arg value="-licenses.license" />
<arg value="fds" />
<arg value="${fds}" />
</java>
</target>
Un argumento importante es -context-root ya que está referenciado en el services-config.xml:
http://{server.name}:{server.port}/{context.root}/messagebroker/amf
Creando un wrapper para nuestro swf generado: lo único que hay que hacer es coger la plantilla que viene con la FSDK y reemplazar los valores por los que nosostros queramos.
<!-- Create HTML wrapper -->
<target name="wrapper" depends="compilemxml" description="Creates the HTML wrapper">
<!-- Copy the html-wrapper dir except the index.template.html -->
<copy todir="${OUT_DIR}">
<fileset dir="${TEMPLATES_DIR}">
<exclude name="**/index.template.html" />
</fileset>
</copy>
<!-- Copy and rename the index.template.html -->
<copy file="${TEMPLATES_DIR}/index.template.html"
tofile="${OUT_DIR}/${swfname}.html" />
<!-- Replace placeholders in the html with our variables -->
<replaceregexp
file="${OUT_DIR}/${swfname}.html"
flags="gs"
match="\$\{width\}"
replace="100%"/>
<replaceregexp
file="${OUT_DIR}/${swfname}.html"
flags="gs"
match="\$\{height\}"
replace="100%"/>
<replaceregexp
file="${OUT_DIR}/${swfname}.html"
flags="gs"
match="\$\{title\}"
replace="${PROJECT_NAME}"
encoding="utf-8"/>
<replaceregexp
file="${OUT_DIR}/${swfname}.html"
flags="gs"
match="\$\{version_major\}"
replace="9"/>
<replaceregexp
file="${OUT_DIR}/${swfname}.html"
flags="gs"
match="\$\{version_minor\}"
replace="0"/>
<replaceregexp
file="${OUT_DIR}/${swfname}.html"
flags="gs"
match="\$\{version_revision\}"
replace="0"/>
<replaceregexp
file="${OUT_DIR}/${swfname}.html"
flags="gs"
match="\$\{application\}"
replace="${swfname}"/>
<replaceregexp
file="${OUT_DIR}/${swfname}.html"
flags="gs"
match="\$\{bgcolor\}"
replace="white"/>
<replaceregexp
file="${OUT_DIR}/${swfname}.html"
flags="gs"
match="\$\{swf\}"
replace="${swfname}"/>
</target>
También es posible ejecutar Flex SDK, usando los ejecutables (.exe) del compilador que hay en el directorio bin.
Existen unos tasks para ant, aunque yo "he preferido" usar el compilador java.
http://labs.adobe.com/wiki/index.php/Flex_Ant_Tasks
jueves, 17 de enero de 2008
ORA-01461: can bind a LONG value only for insert into a LONG column

Si alguien se ha topado con este error de Oracle, relacionado con la longitud de los campos, puede que le venga bien probar lo que se comenta en este blog.
En su caso, la base de datos tenía un character set multibyte, es decir que puede utilizar varios bytes para representar un caracter, mientras que cliente estaba configurado con un character set single byte. Logicamente el "pete" viene cuando se supera el tamaño del campo en bytes.
http://oraclenotepad.blogspot
martes, 15 de enero de 2008
very useful flex article
to integrate flex with spring
http://www.adobe.com/devnet/flex/articles/spring_flex.html
http://www.adobe.com/devnet/flex/articles/spring_flex.html
lunes, 14 de enero de 2008
Suscribirse a:
Entradas (Atom)

