Home » julio 2014
Java y javascript, An engineer to change the world

Seguramente te preguntaste ¿IDE?s? y ¿para Linux?, claro!!!, primero te explico que es un IDE si no entendiste, es un  ámbito de desarrollo integrado, llamado también I  (Integrated Development Environment ), o bien un programa compuesto por un conjunto de dispositivos de programación. Puede dedicarse en exclusiva a un solo lenguaje de programación o poder utilizarse para varios. Y respondiendo a la segunda pregunta, es por que ya la mayoría conocemos los ?clásicos? para Windows, entonces ¿porque no hablar de Linux (para sus distribuciones)?, pero ahora seguro pensaste ?Yo ni uso una distribución de Linux?, ps eso es lo interesante, te dire porque como conocemos las distribuciones de Linux son GRATIS o mejor dicho  SOFTWARE LIBRE, es decir, que no lo ofrecen sin pagar por el O.S., que esto no sucede en Windows, por ello te hablo un escaso mas de Linux y sus masivos ventajas, entonces empezamos con unos IDE?s. Anjuta Ámbito de desarrollo integrado (IDE) para programar en los lenguajes de programación C, C++, Java, Python y Vala, en sistemas GNU/Linux y BSD. Su principal meta es laborar con GTK+ y en el entorno de escritorio GNOME, asimismo proporciona un mayor número de características avanzadas de programación. Es software libre y de código abierto, disponible debajo la Licencia Pública Común de GNU.  Espacio oficial de Anjuta Code::Blocks Aparece en 2005 como una opción a Dev-C++ al ser este último un ámbito de desarrollo para C/C++ escrito en Delphi. Es completamente multiplataforma y distribuido debajo licencia GPL. El núcleo del ámbito es fácilmente adaptable y expansible debido a la integración de complementos. Es probable importar en él programas de Visual C++ y Dev-C++. Es compatible con los compiladores Microsoft Visual Studio Toolkit, GCC y derivados, Borland C++, Intel C++ Compiler y otros; los cuales son detectados en caso de estar preliminarmente instalados.  Espacio oficial de Code::Blocks CodeLite CodeLite es distribuido debajo los términos de la licencia  GNU Común Public License Es una IDE multiplataforma abierta y de codigo abierto para los lenguajes C/C++ que usa  wxWidgets  para su interfaz gráfica. Para cumplir con el espíritu de código abierto de CodeLite, se compila y depura usando solo dispositivos libres Min   GDB). Compatible con Mac y Windows.  Espacio oficial de CodeLite Dev-C++ Es un IDE especialmente extendido para la programación en C/C++. Emplea como compilador MinGW (derivado de GCC), aunque puede ser utilizado en mezcla con Cygwin y demás compiladores derivados. El código fuente está escrito en el lenguaje Delphi, debajo licencia GPL. A dividir de la versión Dev-C++ 5 ha sido suspendido su desarrollo. Un grupo de desarrolladores ha trabajado de forma independiente en su evolución, dándole características para la integración de wxWidgets y el uso de compiladores de Microsoft. Esta derivación se puede descubrir con el nombre de wxDev-C++.  Espacio oficial de Dev-C++ GeanyEs un veloz y liviano IDE para programar en más de 6 lenguajes distintos entre ellos Java, C, C++, Pascal y PHP. Una característica de este IDE, es tener muy pocas dependencias de otros paquetes. Geany es multiplataforma y multilenguaje por lo que esta disponible para varios sistemas operativos y en varios idiomas, incluido el español. La versión más reciente es la 0.15 que se puede descargar desde los repositorios de ubuntu o en su espacio web.  Espacio oficial de Geany Kdevelop  El programa KDevelop fuese iniciado en 1998 para diseñar un ámbito de desarrollo formado, sencillo de usar, para C/C++ en Unix. Desde entonces está disponible públicamente debajo licencia GPL, y soporta KDE/Qt, GNOME, C y C++. Es un IDE (Integrated Development Environment, Ámbito formado de desarrollo) para programar en C y C++ en Linux, que emplea las librerías Qt (trolltech.com, las del escritorio KDE). Está formado con QtDesigner, el diseñador de interfaces gráficas de Trolltech. Para utilizar Kdevelop requiere un sistema operativo X11 KDE Un buen detalle es que la ventana de salida del compilador es coloreada, lo que resulta más sencillo ver al instante la diferencia entre los errores, advertencias y mensajes.  Cabe destacar que si deseas construir en estos IDE?s es indispensable que tengas buen conocimiento de C/C++ ya que por lo regular es estructurado la programación, si puedes realizarlo con P.O.O (Programación Orientada a Objetos), pero hay que saber manejar el lenguaje. Esperamos haya sido de tu agrado, suerte.

Java y javascript, Analizando Javascript

Javascript es un lenguaje incomprendido. Escaso a poco, esta situación va cambiando y el lenguaje se está regresando bastante popular últimamente. No voy a engañar a nadie, yo mismo echaba pestes de Javascript hace no mucho tiempo. Tras dedicarle el tiempo que se merece a comprenderlo, mi punto de vista ha cambiado bastante. Lenguaje dinámico El concepto de lenguaje dinámico es un escaso abstracto, pero usualmente se refiere a retrasar a la hora de la ejecución muchas de las comprobaciones que los otros lenguajes realizan mientras la compilación. Por ejemplo, al escribir objeto.miMetodo(), en un lenguaje estático, mientras la compilación ya se comprueba si la variable objeto tiene o no un método llamado miMetodo, porque felicidad variable tiene un tipo estático. En un lenguaje dinámico, esta comprobación se retrasa hasta la hora de ejecutar esa línea de código, porque es probable que el método se haya creado mientras la ejecución del programa, o que la variable objeto aloje distintos tipos mientras la ejecución, y no todos ellos tengan ese método. Javascript tiene tipos, pero dado que se trata de un lenguaje dinámico, los tipos no determinan contratos, como sucede en lenguajes con tipos estáticos, porque las propiedades de un tipo pueden cambiar mientras la ejecución. Además, las variables no están asociadas a un tipo estático para siempre (como sucedería por ejemplo en Java), sino que pueden alojar objetos de distintos tipos en distintos momentos. Esto ofrece una vez más mucha flexibilidad, aunque por desgracia, la ausencia de contratos en la manifiesto de objetos y funciones, es muy propensa a errores. Ejemplo: function maximo(lista) { var maximo = lista[0]; for (var i = 1; i lista.length; i++) { maximo = Math.max(maximo, lista[i]); return maximo; En otros lenguajes, habría que establecer un tipo estático para el argumento lista, que lo limitaría a un tipo particular o a cumplir con una interfaz específica (definiría un contrato). En Javascript no es así, y este código, aparentemente correcto, puede fallar de múltiples maneras debido a la falta de contratos de Javascript: Si en espacio de una lista, se llama con un diccionario (un objeto), no devolverá el máximo de sus valores, sino probablemente undefined (igual que para una lista vacía). Si además, el objeto tiene un atributo length, intentará iterar y alcanzar a atributos ?0″, ?1″, etc. Si la lista contiene varios strings, Math.max devolverá NaNSi la lista contiene un solo string, devolverá ese string. Si la lista contiene datos de distintos tipos, lo más posible es conseguir un NaNPor supuesto, estos dificultades no son exclusivos de Javascript, son comunes a todos los lenguajes dinámicos. Lo mismo puede suceder en Python o PHP, por ejemplo (aunque su comportamiento ante índices no válidos es algo distinto). La manera habitual de detectarlos es utilizar analizadores estáticos de código, como JSLint. También tienen lugar lenguajes alternativos, como TypeScript, que se transforman en Javascript y soportan tipado estático. Orientado a objetos Esto imagino que no sorprende a nadie a estas alturas. Efectivamente Javascript es orientado a objetos, pero no tiene clases ni herencia de clases. Tiene prototipos, y herencia de prototipos. Es un paradigma un escaso diferente, y puede resultar confuso porque también tiene lugar un constructor y un operador new, aunque no funcionan del mismo modo que en lenguajes con clases. Básicamente, en Javascript hacen menos cosas, porque los prototipos son más simples que las clases. Este es uno de los puntos por los que Javascript recibe más críticas, porque a menudo se emplean los prototipos sin comprenderlos de verdad, o pensando que son clases, y como siempre que se emplea una tecnología que no se comprende, cuesta mucho depurar errores. La mejor manera de comprender qué es un prototipo es recurrir al célebre patrón de diseño. Un prototipo es un ejemplo de instancia, NO una clase. Todos los objetos de Javascript tienen un prototipo, inclusive los números. Este es un ejemplo de uso de prototipos en Javascript: function Rectangulo(ancho, alto) { this.ancho = ancho; this.alto = alto; Rectangulo.prototype.area = function() { return this.ancho * this.alto; ; Es interesante ver la diferencia entre una instancia creada con el operador new y el prototipo. Usando la consola de javascript de vuestro navegador, esto es lo que se puede ver al crear una instancia: > new Rectangulo(2,2) Rectangulo {ancho: 2, alto: 2, area: function alto: 2 ancho: 2 __proto__: Rectangulo area: function () { constructor: function Rectangulo(ancho, alto) { __proto__: Object Y esto es lo que se ve al presentar el prototipo: > Rectangulo.prototype Rectangulo {area: function area: function () { constructor: function Rectangulo(ancho, alto) { __proto__: Object La instancia creada con el operador n y Rectangulo.prototype son muy parecidos, ambos son objetos. Y como tales, ambos tienen un prototipo del que heredan propiedades. En este caso, la instancia creada con el operador new, tiene como prototipo a Rectangulo.prototyp y Rectangulo.prototype tiene como prototipo a Object. Object tiene un prototipo nulo, porque es el prototipo más genérico que hay. Algo que puede resultar confuso aquí, es que Rectangulo.prototype no es el prototipo de Rectangulo Rectangulo es una función, y su prototipo ( Rectangulo.__proto__ ) es el prototipo genérico de las funciones. En realidad, Rectangulo.prototype es el prototipo con el que se van a crear las instancias de Rectangulo al escribir new Rectangulo() Llegados a este punto, alguien se podría preguntar cómo se diferencia una función usual de un constructor. La respuesta es sencilla, no se diferencian (salvo en el caso de funciones nativas). Son la misma cosa. Se puede aplicar el operador new sobre cualquier función, y se puede llamar a cualquier constructor como si fue una función. La única diferencia es la intención con la que se escriben. Por tanto, es una buena práctica documentar la intención en vuestro código. Siguiendo con la analogía del patrón de diseño, Rectangulo.prototype es en verdad un ejemplo de rectángulo. Cuando se crea una instancia con el operador new, se crea un nuevo objeto, cuyo ejempl es Rectangulo.prototype. La idea es que al alcanzar a cualquier propiedad de un objeto (sea un atributo o una función), primero se mira si el propio objeto la tiene, y sino, se mira en su prototipo, y si tampoco la tiene, en el prototipo del prototipo, y así sucesivamente. En este sentido, es muy parecida a la herencia clásica. De hecho, se podría agregar ancho y alto al prototipo, y la instancia creada con el operador new simplemente tendría otra versión de estas propiedades, con preferencia sobre las del prototipo. El operador new hace algo más que crear un objeto vacío y establecer su prototipo, asimismo llama al constructor, que usualmente introduce atributos, y a veces nuevas funciones. Implementar herencia de clases sobre este modelo no es en verdad nada complicado, aquí se explica muy bien (en inglés). La clave es el método Object.create, que crea un nuevo objeto con un algun prototipo (como new, pero sin llamar a constructores). Hay multitud de bibliotecas y precompiladores que proporcionan dispositivos para tener herencia de clases cómodamente. Un ejemplo es el lenguaje  CoffeeScript, que soporta herencia clásica y, al idéntico que TypeScript, también se transforma a Javascript. El paradigma de prototipos es, nuevamente, muy flexible. Se faculta cambiar los prototipos en tiempo de ejecución, inclusive los de clases proporcionadas por el lenguaje, como Array y Object. Un constructor puede inclusive cambiar el prototipo mientras la construcción. De nuevo, es un arma de doble filo. Closures Pido permiso para usar el término original, porque ninguna de las traducciones a español me convence. En lenguajes sin closures, desde el cuerpo de una función sólo son visibles las variables declaradas en ese cuerpo, y las generales (y si es un método, los atributos del objeto). En lenguajes con closures, desde el cuerpo de la función también son visibles las variables declaradas en el entorno al que pertenece la función. Un ejemplo: function main() { var persona = { nombre: 'Juan' ; function reaccionarAEvento() { window.console.log(persona.nombre); capturarEvento('click', reaccionarAEvento); En este ejemplo hay dos entornos. El primer entorno es el más exterior, el de la función main. El segundo entorno es el de la funcion reaccionarAEvento. Además, se llama a otra función que faculta capturar eventos dado un nombre de evento y una función callback. La novedad, dado que Javascript soporta closures, es que el cuerpo de reaccionarAEvento está accediendo a la variable persona, que ha sido declarada en el entorno de mainEste concepto tan potente faculta programar mucho más rápido, ya que no es indispensable crear objetos que transporten estado y tengan un método para crear un callback. En Javascript el estado presente en el entorno se guarda automáticamente. Además, Javascript tiene funciones anónimas, así que el ejemplo previo se puede escribir de manera inclusive más compacta: function main() { var persona = { nombre: 'Juan' ; capturarEvento('click', function() { window.console.log(persona.nombre); ); Nuevamente, toda esta flexibilidad tiene un precio. Una función siempre conserva referencias a todos los objetos visibles en el punto donde se ha declarado. Todos implica no sólo aquellos que interesa que conserve, ni siquiera aquellos que se usan de manera explícita. Todos implica todos. Un ejemplo: function CreaClosure(x) { var y = { z: 5 ; return function(expresion) { return eval(expresion); var f = CreaClosure(2); window.console.log(f('x + y.z')); En este caso, la función CreaClosure está formando y devolviendo otra función. Esta función anónima que devuelve es un closure, conserva referencias a todos los objetos del entorno de CreaClosure, como el parámetro y el objeto . Uno podría pensar que, como aparentemente no los usa, el lenguaje optimizará y no guardará las referencias, pero no es así. La función que se devuelve, conserva referencias a ambos objetos inclusive aunque no se usen. Para demostrarlo, la función devuelta por CreaClosure recibe como argumento una expresión en texto, y la evalúa. En este ejemplo, se aplica una expresión que va a colocar a prueba el closure, accediendo al entorno de CreaClosure. Y al ejecutar este código en un navegador, se puede verificar que efectivamente funciona e imprime ¿Por qué es significativo todo esto? Porque una de las formas más habituales de crear memory leaks en Javascript, es a través de los closures. Si la variable , en espacio de un simple objeto chico sin importancia, fue un objeto más complejo, cuya referencia interesa que desaparezca al terminar CreaClosure, en verdad se estaría perpetuando esa referencia mientras mucho más tiempo (mientras la vida de la función anónima), inclusive aunque la función anónima no la utilice thisUn yerro usual al usar closures es asumir que this también estará disponible en las funciones declaradas dentro de un método. Un ejemplo: Interfaz.prototype.registrarEventos() { this.boton.onClick = function() { window.console.log('Has pulsado ' + this.boton.name); El yerro en este código está en this.boton.name, y la razón es que this no se propaga a los closures, ya que son funciones y en ocasiones tienen su propio this. A veces inclusive el this que está disponible en un callback es algo completamente diferente, como sucede habitualmente en jQuery. Es tradicional ver código que almacena this en otra variable (por ejemplo, self, en honor a Python) para que se inyecte en el closure y poder utilizarlo a continuación, ej: Interfaz.prototype.registrarEventos() { var self = this; this.boton.onClick = function() { window.console.log('Has pulsado ' + self.boton.name);

Java y javascript, Android Studio, el nuevo entorno de desarrollo

Una de las novedades que nos ha dejado la conferencia Google I/0 2013 ha sido la publicación de un nuevo ámbito de desarrollo que pasará a sustituir a Eclipse + SDK + ADT. El nuevo ámbito pretende simplificar el desarrollo de aplicaciones, estando todo mucho más formado y pensado para construir específicamente para Android. IntelliJ IDEA (El cual para muchos desarrolladores está considerado el mejor IDE del mercado). El principal meta es realizarlo todo más usable y orientado a la programación en Android, por lo que para ello se han incluido nuevas refactorizaciones y quick fixes (soluciones rapidas) para corregir yerros comunes, así como recomendaciones varias. Se ha incluido un nuevo editor gráfico mucho más potente (basado en drag-and-drop) que mejorará la experiencia y la edición de las pantallas (dicho sea de paso, el que teníamos hasta ahora era bastante mejorable). Este nuevo editor nos dará una vista previa más real del fruto final, pudiendo cambiar entre diferentes tipos de tipo de pantalla. Nuevos asistentes para crear pantallas comunes en las que poder basarnos y no tener que realizarlas desde cero Nuevas dispositivos para mejorar la usabilidad y la compatibilidad entre diferentes versiones Yo suelo usar Eclipse para construir tanto en Android como en Java en general, pero estoy deseando probarlo a fondo, sobre todo por lo bien que he oido hablar de Intellij IDEA. Por ahora Seguid estando disponible el plugin de Eclipse, pero no han dicho si mantendrán los dos ámbitos o definitivamente abandonarán el desarrollo del plugin ADT. Supongo que lo mantendrán en la web sin actualizaciones al menos hasta que el nuevo IDE sea un ámbito consolidado. Por otro lado me parece que la Fundación Eclipse no ha jugado sus bazas del todo bien en esta ocasión, ya que permitía haberse quedado como la única plataforma de desarrollo para Eclipse y como escaso le ha salido un fuerte competidor que asimismo está trabajando codo con codo con Google. Podemos descargar el instalador desde la página oficial de Android Developer. En cuanto realice determinadas pruebas crearé un nuevo articulo con mis impresiones.

Java y javascript, Antes de Migrar su base de datos a 11g

A pesar de que ya la edición de Oracle Database Versión 11g, tiene bastantes años de haber sido liberada en el mercado, aún tiene lugar una mayor porción de fundamentos de datos, corriendo en versiones previos a la revisión actual vigente ( 11.2.0.3 ), o inclusive en versiones previos como Oracle 10g, 9i, 8i, etc. La porción de documentos escritos sobre el asunto de migraciones es bastante extenso, pero el mensaje aún no ha llegado a todo el mundo. Y es que esperamos con ansiedad, que cada migración que realizamos, traiga consigo, mejor rendimiento, mayores funcionalidades y más estabilidad. Sin embargo, la migración a Oracle 11g, tiene una lista de tareas previas, que por desconocimiento o simplemente por omisión, sólo abandonar para después, ocasionando serios trastornos en vuestro ámbito operativo. Empecemos a beber los próximos puntos en cuenta: Evalúe de forma objetiva, su sistema operativo. DOS Gráfico, no debería ser vuestro sistema operativo, para vuestra fundamento de datos de producción. Por seguridad, por rendimiento y por "n" porción de argumentos, lo ideal, sería que utilicemos determinado sabor LINUX de vuestra preferencia. Ya sea el sombrerito rojo ( Red Hat ), la iguana verde ( SUSE ) o el pingüinito feliz ( Oracle Enterprise Linux ), tome en consideración, los costos de implementación y soporte, a la hora de migrar de sistema operativo. Recuerde OEL es gratis, no necesita ser licenciado y si quiere conseguir soporte al mismo estilo de los proyectos tradicionales de Oracle, los precios del mismo, arrancan en menos de $200 por año, dependiendo del hardware de su servidor. El cambiar de sistema operativo Windows a Linux, representa una mejora en rendimiento de más del 40%, en el mismo hardware, por experiencias vividas. Verifique que el software disponible para instalación, cumple con las características de arquitectura de su hardware. 32 Bits se instala sin dificultades en 64Bits, pero pierdes funcionalidades importantes. A la inversa no es probable realizar la instalación. Evite los yerros tradicionales de capa 8. Tradicionalmente, me gusta mucho, crear primero el esqueleto de la fundamento de datos en la instancia nueva, así me aseguro que todos los tablespaces y sus respectivos datafiles, quedaran en la ubicación física que deseo. Este paso, siempre me ha ganada mucho tiempo y yerros muy comunes, en la importación de la fundamento de datos. No se agote. Hace muchos años atrás, acostumbramos a quedarnos velando la importación de la fundamento de datos. Si haces el punto 3, verificas el lugar en disco, tienes suficiente memoria y tu servidor esta conectado a una UPS, deja corriendo el respaldo y anda descansa. Habilita determinado recurso para conectarte remotamente al servidor, para monitorear el avance del proceso. Si tienes determinado agente de riesgo, prepara un buen termo o coffe marker con cafecito y que tengas una feliz noche. Cuando hagas el full export de la fundamento de datos, exporta los objetos "Sin Estadísticas". Por cierta extraña razón, he logrado detectar, que si haces el import con los objetos sin estadísticas en una fundamento de datos Oracle 11g, desminuye considerablemente el tiempo de importación de los datos. Si vas a migrar a 11gR2, emplea la última edición disponible del software. No instales 11.2.0.1, despues importas los datos y despues parches a 11.2.0.3. Recuerda que en 11g, las ediciones son sustituciones completas de software, no es requerido instalar la edición fundamento de una versión y despues parcharla. Antes de descartar la instancia actual de la fundamento de datos, genera un listado con todos los paquetes inválidos antes del momento de hacer la migración o recreación de la fundamento de datos, para que tengas un punto de partida con determinado nivel de certeza, del estado de salud de todos tus procedimientos, paquetes, funciones y vistas. Cuando hallas terminado de realizar el import, verifica siempre el log del mismo y ejecuta el script de compilación común de objetos. Es normal, que después de un proceso de importación, algunos objetos queden inválidos. El mismo se descubre en ?/rdbms/admin/utlrp.sql Cuando termines de hacer la compilación de objetos inválidos, baja la fundamento de datos, reinicia el servidor. Calcula manualmente estadísticas para todos los objetos de la fundamento de datos, ajusta el dimensión del tablespace temporal y UNDO, que podrían haber crecido considerablemente y entonces, procede a hacer las pruebas de conexión de tus clientes. Si no realizaste una full recreación de la fundamento de datos en una migración de 10g a 11g, procede una vez terminada la migración con el asistente de Oracle, a purgar la papelera de reciclaje de la fundamento de datos, utilizando: purge DBA_RECYCLEBIN; También es recomendable que elimines de tu SPFILE, los parámetros viejos o ocultos ( los que empiezan con un "_", antes de iniciar a utilizar tu fundamento de datos nueva en 11g. Si estas haciendo una migración desde Oracle 9i con tu asistente, es significativo que elimines algunos parámetros, que ya no se encuentran dentro de la versión 11g. Estos parámetros podrían ocasionar que tu migracíón a través de tu asistente de fundamento de datos, tarde más de 40 minutos adicionales en el proceso de migración. Los parámetros son: _complex_view_merging = FALSE _multi_join_key_table_lookup = FALSE _library_cache_advice = FALSE _index_join_enabled = FALSE _push_join_union_view = FALSE _push_join_predicate = FALSE _always_semi_join = OFF _pred_move_around = FALSE _unnest_subquery = FALSE _predicate_elimination_enabled = FALSE _eliminate_common_subexpr = FALSE _no_or_expansion = FALSE event = '600 trace name systemstate level 10' event = '600 trace name errorstack level 10' event = '942 trace name errorstack level 10' event = '54 trace name systemstate level 10' event = '54 trace name errorstack level 10' event = '7445 trace name systemstate level 10' event = '7445 trace name errorstack level 10' event = '10195 trace name context forever, level 1' event = '10778 trace name context forever, level 1? Importante, si tus aplicaciones son cliente/servidor con Developer 6i, requieres al menos el patchset 13 instalado en todos tus clientes. Oracle liberó el año pasado el patchset 19, recomendado para Oracle 11gR2 Durante un tiempo prudencial, monitorea tu fundamento de datos, para buscar comportamientos indebidos de SQLs en ejecución. Los planes de ejecución ( explain plan ), podrían haber cambiado, con la manera de ser interpretados por el optimizador de consultas de la fundamento de datos y es probable que tengas que realizar algunos ajustes a los mismos. Si tu fundamento de datos, es más OLTP que OLAP, te recomiendo ajustar el parámetro optimizer_mode, ya que de facto el valor es ALL_ROWS, en la versión 11gR2. Recuerda, los paquetes opcionales que son utilizados por el OEM para administrar, monitorear y demás tareas específicas realizados con ellos, tienen que ser licenciados preliminarmente para poder ser utilizados y sólo se pueden usar con la edición Enterprise Edition de la fundamento de datos. No arriesgues la seguridad de tu compañía a multas y procesos legales de cobro, por utilizar características que no forman fracción de la edición de tu motor de fundamento de datos. Documenta eficazmente, que puedes usar y que no, es el mejor consejo que te puedo dar. No se te olvide una vez terminada la migración, probar tus tareas de respaldos. Ya sea el clásico utilitario "exp" o el nuevo "expdb" o "RMAN", verifica que están funcionando al 100%, antes de colocar a la gente a generar nueva información. Jamás en un proceso de migración o importación, habilites el modo "Archive" de la fundamento de datos. Si lo tienes habilitado, apagarlo antes de empezar este proceso, es un buen consejo. Documenta cada paso de la migración, así si debes volverlo a hacer o algo no salió como pensabas, puedes revisar la bitácora y descubrir el punto en donde cometiste el error. Estos 20 consejos, pueden ser de mucha utilidad si lo sigues al pie de la letra.

Java y javascript, Aplicaciones utilizando Strusts 2 Java netbeans

Struts 2 ofrece una librería de etiquetas que facilitan, entre otras, las tareas de validación e internacionalización. Estas etiquetas, cuyo TLD podemos descubrir en META-INF/struts-tags.tld, en el jar de struts2-core, pueden utilizarse tanto con JSP como con Velocity o FreeMarker. A continuación veremos una lista con las diferentes etiquetas, una pequeña definición, la clase que las implementa, algunos atributos útiles y, cuando se ha considerado necesario, un chico ejemplo (usando JSP). Sin embargo, para eludir repeticiones, comenzaremos primero enumerando algunos atributos comunes a todas las etiquetas de interfaz de usuario: cssClass: El atributo class de HTML. Indica la clase CSS a utilizar para el fundamento HTML generado. cssStyle: El atributo style de HTML. Permite definir el estilo del fundamento inline, en espacio de utilizar un archivo CSS externo o una etiqueta styledisabled : Decide si el control está deshabilitado label: Etiqueta que acompañará al widget. Genera una clásica etiqueta label de HTML. required: Booleano señalando si el tema es obligatorio. Si es así presenta un asterisco al lado de la etiqueta. tabindex: El atributo tabindex de HTML. Utilizado para establecer el orden a seguir al recorrer los controles cuando el usuario pulsa la tecla de Tabulación template: Plantilla a utilizar theme: Tema a utilizar. Ahora si, las etiquetas son las siguientes: action Permite ejecutar una acción desde una vista señalando el nombre de la acción y, opcionalmente, el lugar de nombres. Se puede pasar parámetros utilizando la etiqueta paramorg.apache.struts2.views.jsp.ActionTag executeResult: decide si el fruto de la acción (normalmente otra vista) se debe ejecutar / renderizar también. ignoreContextParams: indica si se deben incluir los parámetros de la petición actual al invocar la acción name (requerido): el nombre de la acción a ejecutar. namespace: el lugar de nombres de la acción a ejecutar. index.jsp %@ taglib uri=?/struts-tags? prefix=?s?%> html> body> Antes de s:actionbr Después de s:action /body> /html> Accion.java import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings(?serial?) public class Accion extends ActionSupport {     private String web;     public String getWeb() {         return web;     public String execute() {         web = ?mundogeek.net?;         return SUCCESS; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class Accion extends ActionSupport { private String web; public String getWeb() { return web; public String execute() { web = "mundogeek.net"; return SUCCESS; resultado.jsp %@ taglib uri=?/struts-tags? prefix=?s?%> Visita s:property value=?web? %@ taglib uri="/struts-tags" prefix="s"%> Visita s:property value="web" actionerror Presenta los yerros que se produjeron en las acciones, si es que existen. Podemos agregar yerros utilizando el método addActionError(String error) de la interfaz ValidationAware, que ActionSupport implementa. Los métodos y propiedades de ValidationAware también estarán disponibles en la vista, por lo que es probable en su espacio verificar si tienen lugar yerros con el método hasActionErrors() e iterar directamente sobre la colección actionErrors org.apache.struts2.views.jsp.ui.ActionErrorTag Accion.java import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings(?serial?) public class Accion extends ActionSupport {     public String execute() {         addActionError(?Oh dios mío, ¡un error!?);         return ERROR; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class Accion extends ActionSupport { public String execute() { addActionError("Oh dios mío, ¡un error!"); return ERROR; resultado.jsp %@ taglib uri=?/struts-tags? prefix=?s?%> html> body> s:actionerror  /body> /html> %@ taglib uri="/struts-tags" prefix="s"%> html> body> s:actionerror /body> /html> actionmessage Parecida a actionerror, pero en espacio de yerros en la acción sirve para presentar mensajes de la acción, los cuales añadimos utilizando el método addActionMessage(String mensaje) de la interfaz ValidationAware. Como el anterior, también podríamos utilizar el método hasActionMessages() para verificar la existencia de mensajes e iterar sobre la colección de strings actionMessages org.apache.struts2.views.jsp.ui.ActionMessageTag Accion.java import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings(?serial?) public class Accion extends ActionSupport {     public String execute() {         addActionMessage(?Tengo un mensaje para usted.?);         return SUCCESS; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class Accion extends ActionSupport { public String execute() { addActionMessage("Tengo un mensaje para usted."); return SUCCESS; resultado.jsp %@ taglib uri=?/struts-tags? prefix=?s?%> html> body> s:actionmessage /body> /html> %@ taglib uri="/struts-tags" prefix="s"%> html> body> s:actionmessage /body> /html> Crea una etiqueta anchor HTML. Se puede utilizar con el asunto ajax para generar llamadas asíncronas al servidor. org.apache.struts2.views.jsp.ui.AnchorTa href: La URL a cargar cuando el usuario pulse sobre el enlace title: Atributo title de HTML. append Crea un nuevo iterador a dividir de varios iteradores pasados como parámetro en manera de etiquetas paramorg.apache.struts2.views.jsp.iterator.AppendIteratorTa var: el nombre que tendrá el iterador resultante en el ValueStack Accion.java import com.opensymphony.xwork2.ActionSupport; import java.util.List; import java.util.ArrayList; @SuppressWarnings(?serial?) public class Accion extends ActionSupport {     private ListString> registrados;     private ListString> vips;     public ListString> getRegistrados() {         return registrados;     public ListString> getVips() {         return vips;     public String execute() {         registrados = new ArrayListString>();         registrados.add(?Juan?);         registrados.add(??);         vips = new ArrayListString>();         vips.add(?Pedro?);         vips.add(?María?);         return SUCCESS; import com.opensymphony.xwork2.ActionSupport; import java.util.List; import java.util.ArrayList; @SuppressWarnings("serial") public class Accion extends ActionSupport { private ListString> registrados; private ListString> vips; public ListString> getRegistrados() { return registrados; public ListString> getVips() { return vips; public String execute() { registrados = new ArrayListString>(); registrados.add("Juan"); registrados.add(""); vips = new ArrayListString>(); vips.add("Pedro"); vips.add("María"); return SUCCESS; resultado.jsp %@ taglib uri=?/struts-tags? prefix=?s?%> html> body> s:append var=?usuarios?>     s:param value=?%{registrados?      s:param value=?%{vips?  /s:append> Usuarios: ul>     s:iterator value=?usuarios?>         li>s:property /li>     /s:iterator> /ul> /body> /html> %@ taglib uri="/struts-tags" prefix="s"%> html> body> s:append var="usuarios s:param value="%{registrados" s:param value="%{vips" /s:append> Usuarios: ul> s:iterator value="usuarios li>s:property /li> /s:iterator> /ul> /body> /html&gt beanInstancia un Java Bean. Se puede pasar valores a las propiedades del bean utilizando etiquetas paramorg.apache.struts2.views.jsp.BeanTa name (requerido): La clase a instanciar var: Nombre con el que se añadirá la instancia a ValueStack Usuario.java view plain copy to clipboar printpublic class Usuario {     private String nombre;     public String getNombre() {         return nombre;     public void setNombre(String nombre) {         this.nombre = nombre; public class Usuario { private String nombre; public String getNombre() { return nombre; public void setNombre(String nombre) { this.nombre = nombre; resultado.jsp view plain copy to clipboar print%@ taglib uri=?/struts-tags? prefix=?s?%> html> body> /s:bean> Bienvenido s:property value=?#miUsuario.nombre? /body> /html> checkbox Crea un checkbox HTML. Para una lista de varios checkboxes relacionados podemos utilizar la etiqueta checkboxlist org.apache.struts2.views.jsp.ui.CheckboxTa value: Booleano que indica si el checkbox está marcado o no. index.jsp view plain copy to clipboar print%@ taglib uri=?/struts-tags? prefix=?s?%> html> body> s:form action=?Accion?>     s:submit value=?Enviar?  /s:form> /body> /html> Accion.java view plain copy to clipboar printimport com.opensymphony.xwork2.ActionSupport; @SuppressWarnings(?serial?) public class Accion extends ActionSupport {     private boolean condiciones;     public boolean isCondiciones() {         return condiciones;     public void setCondiciones(boolean condiciones) {         this.condiciones = condiciones;     public String execute() {         return SUCCESS; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class Accion extends ActionSupport { private boolean condiciones; public boolean isCondiciones() { return condiciones; public void setCondiciones(boolean condiciones) { this.condiciones = condiciones; public String execute() { return SUCCESS; resultado.jsp view plain copy to clipboar print%@ taglib uri=?/struts-tags? prefix=?s?%> html> body> s:if test=?condiciones?> Muchas gracias. /s:if> s:else> Pues es una lástima. /s:else> /body> %@ taglib uri="/struts-tags" prefix="s"%> html> body> s:if test="condiciones Muchas gracias. /s:if> s:else> Pues es una lástima. /s:else> /body> checkboxlist Crea una lista de checkboxes relacionados (todos con el mismo atributo name). Esto significa que el valor del fundamento no será un booleano señalando si está marcado o no, como en el caso de checkbox, sino una lista con los valores marcados. org.apache.struts2.views.jsp.ui.CheckboxListTa list (requerido): Iterable con los valores con los que generar la lista. listKey : Propiedad de los objetos del iterable del que el checkbox correspondiente tomará su valor. listValue : Exactamente idéntico al anterior, pero en espacio del valor, el contenido name: Nombre de los checkboxes. Accion.java view plain copy to clipboar printimport com.opensymphony.xwork2.ActionSupport; import java.util.List; import java.util.ArrayList; @SuppressWarnings(?serial?) public class Accion extends ActionSupport {     private ListString> lenguajes;     public ListString> getLenguajes() {         return lenguajes;     public String execute() {         lenguajes = new ArrayListString>();         lenguajes.add(?Python?);         lenguajes.add(?Java?);         lenguajes.add(?Ruby?);         lenguajes.add(?C#?);         lenguajes.add(?C++?);         lenguajes.add(?Lisp?);         return SUCCESS; import com.opensymphony.xwork2.ActionSupport; import java.util.List; import java.util.ArrayList; @SuppressWarnings("serial") public class Accion extends ActionSupport { private ListString> lenguajes; public ListString> getLenguajes() { return lenguajes; public String execute() { lenguajes = new ArrayListString>(); lenguajes.add("Python"); lenguajes.add("Java"); lenguajes.add("Ruby"); lenguajes.add("C#"); lenguajes.add("C++"); lenguajes.add("Lisp"); return SUCCESS; resultado.jsp view plain copy to clipboar print%@ taglib uri=?/struts-tags? prefix=?s?%> html> body> body> s:form>     s:submit value=?Enviar?  /s:form> /body> combobox Crea una mezcla de select y caja de texto. El valor de la caja de texto se auto rellena según el fundamento seleccionado en el select. org.apache.struts2.views.jsp.ui.ComboBoxTag emptyOption : Indica si deseamos agregar una alternativa vacía list (requerido): Iterable con los valores con los que generar la lista. listKey : Propiedad de los objetos del iterable del que el checkbox correspondiente tomará su valor. listValue : Exactamente idéntico al anterior, pero en espacio del valor, el contenido name: Nombre a usar para el elemento. readonly : Si deseamos que el usuario pueda escribir sus propios valores en la caja de texto. Accion.java view plain copy to clipboar printimport com.opensymphony.xwork2.ActionSupport; import java.util.List; import java.util.ArrayList; @SuppressWarnings(?serial?) public class Accion extends ActionSupport {     private ListString> lenguajes;     public ListString> getLenguajes() {         return lenguajes;     public String execute() {         lenguajes = new ArrayListString>();         lenguajes.add(?Python?);         lenguajes.add(?Java?);         lenguajes.add(?Ruby?);         lenguajes.add(?C#?);         lenguajes.add(?C++?);         lenguajes.add(?Lisp?);         return SUCCESS; import com.opensymphony.xwork2.ActionSupport; import java.util.List; import java.util.ArrayList; @SuppressWarnings("serial") public class Accion extends ActionSupport { private ListString> lenguajes; public ListString> getLenguajes() { return lenguajes; public String execute() { lenguajes = new ArrayListString>(); lenguajes.add("Python"); lenguajes.add("Java"); lenguajes.add("Ruby"); lenguajes.add("C#"); lenguajes.add("C++"); lenguajes.add("Lisp"); return SUCCESS; resultado.jsp view plain copy to clipboar print%@ taglib uri=?/struts-tags? prefix=?s?%> html> body> body> s:form action=?Otro?>         label=?Lenguaje preferido? readonly=?true?      s:submit value=?Enviar?  /s:form> /body&gt datePermite presentar una fecha almacenada en una alguna variable señalando opcionalmente el formato a utilizar. org.apache.struts2.views.jsp.DateTag format : Formato a utilizar para presentar la fecha. Si deseamos usar siempre el mismo formato podemos crear un archivo properties con una acceso struts.date.format. Por defecto se emplea el formato DateFormat.MEDIU name (requerido): Nombre de la variable que contiene la fecha a presentar nice: Emplea un formato que facilita la lectura. Por defecto se emplea inglés para presentar los mensajes; si deseamos traducirlo a determinado otro idioma tendremos que recurrir a las funciones de internacionalización de Struts 2. Las claves a traducir son las próximos CLAVEVALOR POR DEFECTO struts.date.format.past {0 ago struts.date.format.future in {0 struts.date.format.seconds an instant struts.date.format.minutes {0,choice,1#one minute|1{0 minutes struts.date.format.hours {0,choice,1#one hour|1{0 hours{1,choice,0#|1#, one minute|1, {1 minutes struts.date.format.days {0,choice,1#one day|1{0 days{1,choice,0#|1#, one hour|1, {1 hours struts.date.format.years {0,choice,1#one year|1{0 years{1,choice,0#|1#, one day|1, {1 days Accion.java view plain copy to clipboar printimport com.opensymphony.xwork2.ActionSupport; import java.util.Calendar; import java.util.Date; @SuppressWarnings(?serial?) public class Accion extends ActionSupport {     private Date ahora;     private Date anyoNuevo;     public Date getAhora() {         return ahora;     public Date getAnyoNuevo() {         return anyoNuevo;     public String execute() {         ahora = new Date();         Calendar cal = Calendar.getInstance();         int anyo = cal.get(Calendar.YEAR);         cal.set(anyo + 1, Calendar.JANUARY, 1);         anyoNuevo = cal.getTime();         return SUCCESS; import com.opensymphony.xwork2.ActionSupport; import java.util.Calendar; import java.util.Date; @SuppressWarnings("serial") public class Accion extends ActionSupport { private Date ahora; private Date anyoNuevo; public Date getAhora() { return ahora; public Date getAnyoNuevo() { return anyoNuevo; public String execute() { ahora = new Date(); Calendar cal = Calendar.getInstance(); int anyo = cal.get(Calendar.YEAR); cal.set(anyo + 1, Calendar.JANUARY, 1); anyoNuevo = cal.getTime(); return SUCCESS; resultado.jsp view plain copy to clipboar print%@ taglib uri=?/struts-tags? prefix=?s?%> html> body> body> /body&gt debugImprime información de depuración (entre otros, el contenido de ValueStack org.apache.struts2.views.jsp.ui.DebugTa divCrea un fundamento div de HTML. org.apache.struts2.views.jsp.ui.DivTag doubleselect Crea dos fundamentos select HTML, con el segundo de ellos modificando sus valores dependiendo del valor seleccionado en el primero. org.apache.struts2.views.jsp.ui.DoubleSelectTag doubleList (requerido): Lista con los valores que tendrá el segundo select. doubleMultiple : Decide si en el segundo select se pueden seleccionar varios valores o solo uno. doubleName (requerido): Nombre del fundamento list (requerido): Lista con los valores que tendrá el primer select. Artista.java view plain copy to clipboar printimport java.util.List; public class Artista {     private String nombre;     private ListString> canciones;     public Artista(String nombre, ListString> canciones) {         this.nombre = nombre;         this.canciones = canciones;     public String getNombre() {         return nombre;     public ListString> getCanciones() {         return canciones; import java.util.List; public class Artista { private String nombre; private ListString> canciones; public Artista(String nombre, ListString> canciones) { this.nombre = nombre; this.canciones = canciones; public String getNombre() { return nombre; public ListString> getCanciones() { return canciones; Accion.java view plain copy to clipboar printimport com.opensymphony.xwork2.ActionSupport; import java.util.List; import java.util.ArrayList; @SuppressWarnings(?serial?) public class Accion extends ActionSupport {     private ListArtista> artistas;     public ListArtista> getArtistas() {         return artistas;     public String execute() {         artistas = new ArrayListArtista>();         ListString> canciones_p = new ArrayListString>();         canciones_p.add(?El equilibro es imposible?);         canciones_p.add(?Años 80″);         canciones_p.add(?Promesas que no valen nada?);         Artista piratas = new Artista(?Los piratas?, canciones_p);         artistas.add(piratas);         ListString> canciones_c = new ArrayListString>();         canciones_c.add(?Viva la vida?);         canciones_c.add(?Clocks?);         canciones_c.add(?Life in technicolor?);         Artista coldplay = new Artista(?Coldplay?, canciones_c);         artistas.add(coldplay);         return SUCCESS; import com.opensymphony.xwork2.ActionSupport; import java.util.List; import java.util.ArrayList; @SuppressWarnings("serial") public class Accion extends ActionSupport { private ListArtista> artistas; public ListArtista> getArtistas() { return artistas; public String execute() { artistas = new ArrayListArtista>(); ListString> canciones_p = new ArrayListString>(); canciones_p.add("El equilibro es imposible"); canciones_p.add("Años 80"); canciones_p.add("Promesas que no valen nada"); Artista piratas = new Artista("Los piratas", canciones_p); artistas.add(piratas); ListString> canciones_c = new ArrayListString>(); canciones_c.add("Viva la vida"); canciones_c.add("Clocks"); canciones_c.add("Life in technicolor"); Artista coldplay = new Artista("Coldplay", canciones_c); artistas.add(coldplay); return SUCCESS; resultado.jsp view plain copy to clipboar print%@ taglib uri=?/struts-tags? prefix=?s?%> html> body> body> s:form action=?Otro?>     s:doubleselect label=?Selecciona la canción? list=?artistas?     s:submit value=?Enviar?  /s:form> /body> fielderror Presenta los yerros que se han detectado al cerciorar los campos del formulario. Por defecto se muestran todos los yerros, pero podemos seleccionar que se muestren sólo los relativos a ciertos campos pasándole etiquetas param. El funcionamiento es semejante al de actionerro y actionmessage : podemos agregar yerros utilizando el método addFieldError(String fieldName, String errorMessage) de la interfaz ValidationAware, que ActionSupport implementa. Hay que tener en cuenta, no obstante, que si redirigimos al formulario de acceso el propio formulario imprimará estos yerros por defecto sin necesidad de agregar esta etiqueta. Los métodos y propiedades de ValidationAware también estarán disponibles en la vista, por lo que es probable en su espacio verificar si tienen lugar yerros con el método hasFieldErrors() e iterar directamente sobre la colección fieldErrors org.apache.struts2.views.jsp.ui.FieldErrorTag index.jsp view plain copy to clipboar print%@ taglib uri=?/struts-tags? prefix=?s?%> html> body> s:fielderror  s:form action=?Accion?>     s:submit value=?Enviar?  /s:form> /body> /html> Accion.java view plain copy to clipboar printimport com.opensymphony.xwork2.ActionSupport; @SuppressWarnings(?serial?) public class Accion extends ActionSupport {     private String nombre;     public String getNombre() {         return nombre;     public void setNombre(String nombre) {         this.nombre = nombre;     public String execute() {         if(nombre.length() > 10) {             addFieldError(?nombre?, ?El nombre no puede tener más de 10 caracteres.?);             return ERROR;         return SUCCESS; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class Accion extends ActionSupport { private String nombre; public String getNombre() { return nombre; public void setNombre(String nombre) { this.nombre = nombre; public String execute() { if(nombre.length() > 10) { addFieldError("nombre", "El nombre no puede tener más de 10 caracteres."); return ERROR; return SUCCESS; resultado.jsp view plain copy to clipboar print%@ taglib uri=?/struts-tags? prefix=?s?%> html> body> body> s:fielderror  /body> %@ taglib uri="/struts-tags" prefix="s"%> html> body> body> s:fielderror /body&gt fileMuestra un tema file de HTML. Para facilitarnos la vida podemos aprovechar el interceptor fileUpload que se descubre en la selección de interceptores por defecto ( defaultStack ) y que funciona de manera similar al interceptor param. Basta crear setters y getters en la acción para las nuevas propiedades nombre (el archivo en si), nombre ContentType (el tipo MIME del archivo subido) o nombre FileName (el nombre del archivo subido) para tener entrada a estos valores en la acción. org.apache.struts2.views.jsp.ui.FileTag accept : atributo del mismo nombre de HTML que faculta indicar los tipos MIME que acepta el campo. index.jsp view plain copy to clipboar print%@ taglib uri=?/struts-tags? prefix=?s?%> html> body>         accept=?text/txt?      s:submit value=?Enviar?  /s:form> /body> /html> Accion.java view plain copy to clipboar printimport com.opensymphony.xwork2.ActionSupport; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; @SuppressWarnings(?serial?) public class Accion extends ActionSupport {     private File archivoTexto;     private String archivoTextoContentType;     private String archivoTextoFileName;     private String contenido;     public String getContenido() {         return contenido;     public File getArchivoTexto() {         return archivoTexto;     public void setArchivoTexto(File archivoTexto) {         this.archivoTexto = archivoTexto;     public String getArchivoTextoContentType() {         return archivoTextoContentType;     public void setArchivoTextoContentType(String archivoTextoContentType) {         this.archivoTextoContentType = archivoTextoContentType;     public String getArchivoTextoFileName() {         return archivoTextoFileName;     public void setArchivoTextoFileName(String archivoTextoFileName) {         this.archivoTextoFileName = archivoTextoFileName;     public String execute() throws IOException {         BufferedReader input = new BufferedReader(new FileReader(archivoTexto));         String linea = ?";         contenido = ?";         while ((linea = input.readLine()) != null)             contenido = contenido + linea;         return SUCCESS; import com.opensymphony.xwork2.ActionSupport; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; @SuppressWarnings("serial") public class Accion extends ActionSupport { private File archivoTexto; private String archivoTextoContentType; private String archivoTextoFileName; private String contenido; public String getContenido() { return contenido; public File getArchivoTexto() { return archivoTexto; public void setArchivoTexto(File archivoTexto) { this.archivoTexto = archivoTexto; public String getArchivoTextoContentType() { return archivoTextoContentType; public void setArchivoTextoContentType(String archivoTextoContentType) { this.archivoTextoContentType = archivoTextoContentType; public String getArchivoTextoFileName() { return archivoTextoFileName; public void setArchivoTextoFileName(String archivoTextoFileName) { this.archivoTextoFileName = archivoTextoFileName; public String execute() throws IOException { BufferedReader input = new BufferedReader(new FileReader(archivoTexto)); String linea = ""; contenido = ""; while ((linea = input.readLine()) != null) contenido = contenido + linea; return SUCCESS; action: Acción a la que se enviará la petición con los datos del formulario. También se puede unir otras páginas o servlets. Si no empleamos el atributo para especificar el destino se emplea la misma página del formulario. namespace: Lugar de nombres al que pertenece la acción a la que se enviará la petición. Por defecto se emplea el lugar de nombres actual. validate: Si deseamos cerciorar los campos del formulario antes de enviarlos. component Utilizado para crear nuestras particulares etiquetas sin tener que recurrir a la API de etiquetas de JSP. org.apache.struts2.views.jsp.ui.ComponentTa headEtiqueta auxiliar que se coloca dentro de la etiqueta head de HTML y se encarga de generar diferentes fundamentos necesarios para otras etiquetas, como las etiquetas para la carga de hojas de estilo o scripts. org.apache.struts2.views.jsp.ui.HeadTag hidden Crea un tema oculto. org.apache.struts2.views.jsp.ui.HiddenTa i18nCarga un archivo de recursos adicional con la traducción de vuestros mensajes y los coloca en ValueStack de manera que puedan ser accedidos fácilmente por el código que se encuentre dentro de la etiqueta. org.apache.struts2.views.jsp.I18nTa name (requerido): Nombre del ResourceBundle a cargar.

Java y javascript, CARACTERISTICAS DE JAVA

Java proporciona toda la funcionalidad de un lenguaje potente, pero sin las características menos usadas y más confusas de éstos. C++ es un lenguaje que adolece de falta de seguridad, pero C y C++ son lenguajes más difundidos, por ello Java se diseñó para ser semejante a C++ y así facilitar un veloz y sencillo aprendizaje. garbage collector thread Java reduce en un 50% los yerros más comunes de programación con lenguajes como C y C++ al descartar muchas de las características de éstos, entre las que destacan: aritmética de punteros no tienen lugar referencias registros (struct) definición de tipos (typedef) macros (#define) necesidad de liberar memoria (free) Aunque, en realidad, lo que hace es descartar las palabras reservadas (struct, typedef), ya que las clases son algo parecido. Además, el intérprete completo de Java que hay en este momento es muy pequeño, unicamente ocupa 215 Kb de RAM. ORIENTADO A OBJETOS clases instancias. Estas instancias, como en C++, requieren ser construidas y destruidas en lugares de memoria. Java incorpora funcionalidades inexistentes en C++ como por ejemplo, la resolución dinámica de métodos. Esta característica deriva del lenguaje Objective C, propietario del sistema operativo Next. En C++ se suele laborar con librerías dinámicas (DLLs) que obligan a recompilar la aplicación cuando se retocan las funciones que se encuentran en su interior. Este inconveniente es resuelto por Java mediante una interfaz específica llamada RTTI ( RunTime Type Identification ) que determina la interacción entre objetos excluyendo variables de instancias o implementación de métodos. Las clases en Java tienen una representación en el runtime que faculta a los programadores interrogar por el tipo de clase y unir dinámicamente la clase con el fruto de la búsqueda. DISTRIBUID ht ftp. Esto faculta a los programadores alcanzar a la información a través de la red con tanta facilidad como a los archivos locales. La realidad es que Java en sí no es distribuido, sino que ofrece las librerías y dispositivos para que los proyectos puedan ser distribuidos, es decir, que se corran en algúnas máquinas, interactuando. ROBUSTO arrays auténticos, en vez de listas enlazadas de punteros, con comprobación de límites, para eludir la probabilidad de sobreescribir o corromper memoria fruto de punteros que señalan a zonas equivocadas. Estas características reducen drásticamente el tiempo de desarrollo de aplicaciones en Java. byte-codes, que son el fruto de la compilación de un proyecto Java. Es un código de máquina virtual que es interpretado por el intérprete Java. No es el código máquina directamente entendible por el hardware, pero ya ha pasado todas las fases del compilador: análisis de instrucciones, orden de operadores, etc., y ya tiene generada la pila de ejecución de órdenes. Java proporciona, pues: Comprobación de punteros Comprobación de límites de arrays Excepciones Verificación de byte-codes ARQUITECTURA NEUTRAL Para establecer Java como fracción integral de la red, el compilador Java compila su código a un fichero objeto de formato independiente de la arquitectura de la máquina en que se ejecutará. Cualquier máquina que tenga el sistema de ejecución ( run-time ) puede ejecutar ese código objeto, sin importar en modo sdeterminados la máquina en que ha sido generado. Actualmente tienen lugar sistemas run-time para Solaris 2.x, SunOs 4.1.x, Windows 95, Windows NT, Linux, Irix, Aix, Mac, Apple y probablemente haya grupos de desarrollo trabajando en el porting a otras plataformas. El código fuente Java se "compila" a un código de bytes de alto nivel independiente de la máquina. Este código (byte-codes) está diseñado para ejecutarse en una máquina hipotética que es implementada por un sistema run-time, que sí es dependiente de la máquina. En una representación en que tuviésemos que indicar todos los fundamentos que forman fracción de la arquitectura de Java sobre una plataforma genérica, obtendríamos una figura como la siguiente: Máquina Virtual Java Java 2D: gráficos 2D y manipulación de imágenes Java Animation: Animación de objetos en 2D Java Telephony: Integración con telefonía Java Share: Interacción entre aplicaciones multiusuario Java 3D: Gráficos 3D y su manipulación SEGURO casting yerros de alineación. Los programadores de C emplean punteros en conjunción con operaciones aritméticas. Esto le faculta al programador que un puntero referencie a un espacio conocido de la memoria y pueda sumar (o restar) determinado valor, para mencionarse a otro espacio de la memoria. Si otros programadores conocen nuestras estructuras de datos pueden extraer información confidencial de vuestro sistema. Con un lenguaje como C, se pueden beber números enteros aleatorios y convertirlos en punteros para despues alcanzar a la memoria: printf( "Escribe un valor entero: " ); scanf( "%u",&puntero ); printf( "Cadena de memoria: %s\n",puntero ); Caballo de Troya /etc/shado testsSi los byte-codes pasan la verificación sin generar ningún mensaje de error, entonces conocemos que: El código no produce desbordamiento de operandos en la pila El tipo de los parámetros de todos los códigos de operación son conocidos y adecuados No ha sucedido ninguna conversión ilegal de datos, tal como convertir enteros en punteros El entrada a los campos de un objeto se sabe que es legal: public, private, protected No hay ningún intento de violar las normas de entrada y seguridad creadas El Cargador de Clases también ayuda a Java a mantener su seguridad, separando el lugar de nombres del sistema de archivos local, del de los recursos procedentes de la red. Esto limita cualquier aplicación del tipo Caballo de Troya, ya que las clases se buscan primero entre las locales y despues entre las procedentes del exterior. Las clases importadas de la red se almacenan en un lugar de nombres privado, vinculado con el origen. Cuando una clase del lugar de nombres privado accede a otra clase, primero se busca en las clases predefinidas (del sistema local) y despues en el lugar de nombres de la clase que hace la referencia. Esto imposibilita que una clase suplante a una predefinida. En resumen, las aplicaciones de Java resultan extremadamente seguras, ya que no acceden a zonas delicadas de memoria o de sistema, con lo cual evitan la interacción de ciertos virus. Java no posee una semántica específica para adaptar la pila de proyecto, la memoria abierta o utilizar objetos y métodos de un proyecto sin los privilegios del kernel del sistema operativo. Además, para eludir transformaciónes por fracción de los crackers de la red, implementa un método ultraseguro de autentificación por clave pública. El Cargador de Clases puede comprobar una firma digital antes de hacer una instancia de un objeto. Por tanto, ningún objeto se crea y almacena en memoria, sin que se validen los privilegios de acceso. Es decir, la seguridad se integra en el momento de compilación, con el nivel de detalle y de privilegio que sea necesario. Dada, pues la concepción del lenguaje y si todos los fundamentos se mantienen dentro del estándar marcado por Sun, no hay peligro. Java imposibilita, también, abrir ningún fichero de la máquina local (siempre que se realizan operaciones con archivos, éstas laboran sobre el disco duro de la máquina de donde partió el applet), no faculta ejecutar ninguna aplicación nativa de una plataforma e impide que se utilicen otros ordenadores como puente, es decir, nadie puede utilizar vuestra máquina para hacer peticiones o hacer operaciones con otra. Además, los intérpretes que incorporan los navegadores de la Web son aún más restrictivos. Debajo estas cláusulas (y dentro de la filosofía de que el único ordenador seguro es el que está apagado, desenchufado, dentro de una cámara acorazada en un bunker y rodeado por mil soldados de los cuerpos especiales del ejército), se puede analizar que Java es un lenguaje seguro y que los applets están libres de virus javapPORTABLE enteros INTERPRETADO El intérprete Java (sistema run-time) puede ejecutar directamente el código objeto. Enlazar (linkar) un proyecto, normalmente, consume menos recursos que compilarlo, por lo que los desarrolladores con Java pasarán más tiempo desarrollando y menos esperando por el ordenador. No obstante, el compilador actual del JDK es bastante lento. Por ahora, que todavía no hay compiladores particulares de Java para las variadas plataformas, Java es más lento que otros lenguajes de proyectoción, como C++, ya que debe ser interpretado y no ejecutado como sucede en cualquier proyecto tradicional. Se dice que Java es de 10 a 30 veces más lento que C, y que tampoco tienen lugar en Java programas de mayor envergadura como en otros lenguajes. La realidad es que ya hay comparaciones ventajosas entre Java y el resto de los lenguajes de programación, y una ingente porción de folletos electrónicos que supuran fanatismo en favor y en contra de los diferentes lenguajes contendientes con Java. Lo que se suele abandonar de lado en todo esto, es que primero habría que determinar hasta que punto Java, un lenguaje en pleno desarrollo y todavía sin definición definitiva, está maduro como lenguaje de programación para ser comparado con otros; como por ejemplo con Smalltalk, que lleva más de 20 años en cancha. La realidad es que Java para obtener ser un lenguaje independiente del sistema operativo y del procesador que incorpore la máquina utilizada, es tanto interpretado como compilado. Y esto no es ningún contrasentido, me explico, el código fuente escrito con cualquier editor se compila generando el byte-code. Este código intermedio es de muy debajo nivel, pero sin conseguir las instrucciones máquina particulares de cada plataforma y no tiene nada que ver con el p-code de Visual Basic. El byte-code corresponde al 80% de las instrucciones de la aplicación. Ese mismo código es el que se puede ejecutar sobre cualquier plataforma. Para ello hace falta el run-time, que sí es completamente dependiente de la máquina y del sistema operativo, que interpreta dinámicamente el byte-code y agrega el 20% de instrucciones que faltaban para su ejecución. Con este sistema es sencillo crear aplicaciones multiplataforma, pero para ejecutarlas es indispensable que exista el run-time correspondiente al sistema operativo utilizado. MULTITHREADED Al ser multithreaded (multihilvanado, en mala traducción), Java faculta muchas actividades simultáneas en un programa. Los threads (a veces llamados, procesos ligeros), son básicamente pequeños procesos o piezas independientes de un mayor proceso. Al estar los threads contruidos en el lenguaje, son más fáciles de usar y más robustos que sus homólogos en C o C++. El beneficio de ser miltithreaded consiste en un mejor rendimiento interactivo y mejor comportamiento en tiempo real. Aunque el comportamiento en tiempo real está limitado a las capacidades del sistema operativo subyacente (Unix, Windows, etc.), aún supera a los ámbitos de flujo único de proyecto (single-threaded) tanto en facilidad de desarrollo como en rendimiento. Cualquiera que haya utilizado la tecnología de navegación concurrente, sabe lo frustrante que puede ser esperar por una mayor imagen que se está trayendo. En Java, las imágenes se pueden ir trayendo en un thread independiente, permitiendo que el usuario pueda alcanzar a la información en la página sin tener que esperar por el navegador. DINAMICO Java se beneficia todo lo probable de la tecnología enfocada a objetos. Java no intenta conectar todos los módulos que comprenden una aplicación hasta el tiempo de ejecución. Las librería nuevas o actualizadas no paralizarán las aplicaciones actuales (siempre que mantengan el API anterior). Java también simplifica el uso de protocolos nuevos o actualizados. Si su sistema ejecuta una aplicación Java sobre la red y descubre una pieza de la aplicación que no sabe manejar, tal como se ha explicado en párrafos anteriores, Java es capaz de traer automáticamente cualquiera de esas piezas que el sistema requiere para funcionar. Java, para eludir que los módulos de byte-codes o los objetos o nuevas clases, haya que estar trayéndolos de la red cada vez que se necesiten, implementa las alternativas de persistencia, para que no se eliminen cuando de limpie la caché de la máquina.

Java y javascript, Características de JAVA

Es un lenguaje de programación que proporciona la potencia del diseño orientado a objetos con una sintaxis fácilmente accesible y un ámbito robusto y agradable. Ofrece un conjunto de clases potente y flexible. Pone al alcance de cualquiera la utilización de aplicaciones que se pueden incluir directamente en páginas Web (aplicaciones denominadas applets Características: -Orientación a objetos En este apariencia Java fuese diseñado partiendo de cero, no siendo derivado de otro lenguaje previo y no tiene compatibilidad con ninguno de ellos. En Java el concepto de objeto resulta sencillo y sencillo de ampliar. Además se conservan fundamentos "no objetos", como números, caracteres y otros tipos de datos simples. -Riqueza semántica Pese a su simpleza se ha conseguido un considerable potencial, y aunque cada tarea se puede hacer de un número reducido de formas, se ha conseguido un mayor potencial de expresión e innovación desde el punto de vista del programador. - Robusto Java verifica su código al mismo tiempo que lo escribe, y una vez más antes de ejecutarse, de forma que se alcanza un alto borde de codificación sin yerros. Se realiza un descubrimiento de la gran fracción de los yerros mientras el tiempo de compilación, ya que Java es estricto en cuanto a tipos y declaraciones, y así lo que es rigidez y falta de flexibilidad se convierte en eficacia. Respecto a la gestión de memoria, Java libera al programador del compromiso de tener que controlar especialmente la asignación que de ésta hace a sus necesidades específicas. Este lenguaje posee una gestión avanzada de memoria llamada gestión de basura, y un empleo de excepciones orientado a objetos integrados. Estos fundamentos realizarán muchas tareas antes tediosas a la vez que obligadas para el programador. - Modelo de objeto rico Existen algúnas clases que contienen las abstracciones escenciales para facilitar a los proyectos una mayor capacidad de representación. Para ello se contará con un conjunto de clases comunes que pueden aumentar para admitir todas las necesidades del programador. Además la biblioteca de clases de Java ofrece un conjunto único de protocolos de Internet. El conjunto de clases más complicado de Java son sus paquetes gráficos AWT ( Abstract Window Toolki ) y Swing. Estos paquetes implementan componentes de una interfaz de usuario gráfica escencial general a todos los ordenadores personales modernos. - Fácil aprendizaje El único requerimiento para aprender Java es tener una comprensión de los conceptos básicos de la programación enfocada a objetos. Así se ha creado un lenguaje simple (aunque eficaz y expresivo) pudiendo mostrarse cualquier planteamiento por fracción del programador sin que las interioridades del sistema subyacente sean desveladas. Java es más complejo que un lenguaje simple, pero más fácil que cualquier otro ámbito de programación. El único impedimento que se puede mostrar es obtener entender la programación enfocada a objetos, apariencia que, al ser independiente del lenguaje, se muestra como insalvable. - Completado con utilidades El paquete de utilidades de Java viene con un conjunto completo de estructuras de datos complejas y sus métodos asociados, que serán de inestimable ayuda para implementar applets y otras aplicaciones más complejas. Se dispone también de estructuras de datos habituales, como pil y tablas hash, como clases ya implementadas. Existirá una interfaz Observer/Observable que permitirá la implementación simple de objetos dinámicos cuyo estado se visualiza en pantalla. El JDK ( Java Development Kit) suministrado por Sun Microsystems incluye un compilador, un intérprete de aplicaciones, un depurador en línea de comandos, y un visualizador de applets entre otros elementos. - Interactivo y animado Uno de los requisitos de Java desde sus origenes fuese la probabilidad de crear proyectos en red interactivos, por lo que es capaz de realizar algúnas cosas a la vez sin perder rastro de lo que debería suceder y cuándo. Para se da soporte a la utilización de múltiples hilos de programación ( multithread Las aplicaciones de Java facultan situar figuras animadas en las páginas Web, y éstas pueden concebirse con logotipos animados o con texto que se desplace por la pantalla. También pueden tratarse gráficos generados por determinado proceso. Estas animaciones pueden ser interactivas, permitiendo al usuario un control sobre su apariencia. - Arquitectura neutral Java está diseñado para que un proyecto escrito en este lenguaje sea ejecutado correctamente independientemente de la plataforma en la que se esté actuando (Macintosh, PC, UNIX...). Para obtener esto emplea una compilación en una representación intermedia que recibe el nombre de códigos de byte, que pueden interpretarse en cualquier sistema operativo con un intérprete de Java. La desventaja de un sistema de este tipo es el rendimiento; sin embargo, el hecho de que Java fue diseñado para funcionar razonablemente bien en microprocesadores de limitada potencia, unido a la fácilidad de traducción a código máquina hacen que Java supere esa desventaja sin problemas. - Esfuerzo en red Java anima las páginas Web y hace probable la inclusión de aplicaciones interactivas y especializadas. Aporta la probabilidad de distribuir contenidos ejecutables, de forma que los suministradores de información de la Web pueden crear una página de hipertexto ( página Web ) con una interacción continuada y compleja en tiempo real; el contenido ejecutable es transferido literalmente al ordenador del usuario. Los protocolos básicos para laborar en Internet están encapsulados en unas cuantas clases simples. Se incluyen implementaciones ampliables de los protocolos FTP, HTTP, NNTP y SMTP junto con conectores de red de dedebajo nivel e interfaces de nombrado. Esto le faculta interactuar con esos servicios de red poderosos sin tener que entender realmente los detalles de dedebajo nivel de esos protocolos. Este lenguaje está diseñado para cumplir los requisitos de entrega de contenidos interactivos mediante el uso de applets insertados en sus páginas HTML. Además, las clases de Java admiten muy bien estos protocolos y formatos. El envío de las clases de Java a través de Internet se realiza con mayor facilidad, ya que tiene lugar una interfaz unificada, resolviendo así los típicos dificultades de diferencia de versiones. Java ofrece un conjunto de clases para tratar con una abstracción de los conectores de red ( sockets) originales de la versión UNIX de Berckley, encapsular la noción de una dirección de Internet o conectar sockets con flujos de datos de Entrada/Salida. Con todas estas probabilidades crece el dinamismo y competitividad de la Web, ya que que es capaz de captar el interés del usuario mientras largo tiempo y faculta a los programadores convertir la Web en un sistema de entrega de software. - Applet Una applet (miniaplicación) es un chico proyecto en Java transferido dinámicamente a través de Internet. Presentan un comportamiento inteligente, pudiendo reaccionar a la acceso de un usuario y cambiar de manera dinámica. Sin embargo, la verdadera novedad es el mayor potencial que Java ofrece en este aspecto, haciendo probable que los proyectodores ejerzan un control sobre los proyectos ejecutables de Java que no es probable descubrir en otros lenguajes. - Seguridad Existe una preocupación lógica en Internet por el asunto de la seguridad: virus, caballos de Troya, y proyectos parecidas navegan de manera normal por la red, constituyendo una amenaza palpable. Java ha sido diseñado poniendo un énfasis especial en el asunto de la seguridad, y se ha conseguido lograr alguna inmunidad en el apariencia de que un proyecto realizado en Java no puede hacer llamadas a funciones generales ni alcanzar a recursos arbitrarios del sisasunto, por lo que el control sobre los proyectos ejecutables no es equiparable a otros lenguajes. Los niveles de seguridad que muestra son: Fuertes restricciones al entrada a memoria, como son la eliminación de punteros aritméticos y de operadores ilegales de transmisión. Rutina de verificación de los códigos de byte que asegura que no se viole ninguna construcción del lenguaje. Verificación del nombre de clase y de restricciones de entrada mientras la carga. Sistema de seguridad de la interfaz que refuerza las medidas de seguridad en muchos niveles. - Lenguaje basado en C++ Java fuese extendido basándose en C++, pero eliminando rasgos del mismo escaso empleados, optándose por una codificación comprensible. Básicamente, encontramos las próximos diferencias con C++: Java no soporta los tipos struct, union ni punteros No soporta typede ni #define. Se distingue por su manera de manejar ciertos operadores y no faculta una sobrecarga de operadores. No soporta herencia múltiple. Java maneja argumentos en la línea de comandos de manera variada a como lo hacen C o C++. Tiene una clase String que es fracción del paquete java.lang y se diferencia de la matriz de caracteres terminada con un nulo que usan C y C++. Java cuenta con un sistema automático para asignar y liberar memoria, con lo que no es indispensable utilizar las funciones previstas con este fin en C y C++. -Gestión de la Entrada/Salida En espacio de utilizar primitivas como las de C para laborar con ficheros, se utlizan primitivas parecidas a las de C++, mucho más elegantes, que facultan tratar los ficheros, sockets, teclado y monitor como flujos de datos. De este modo se pueden utilizar felicidades primitivas para cualquier operación de Entrada/Salida. - Distintos tipos de aplicaciones Aplicaciones: Se ejecutan sin necesidad de un navegador. Applets: Se pueden descargar de Internet y se observan en un navegador. JavaBeans: Componentes software Java, que se puedan incorporar gráficamente a otros componentes. JavaScript: Conjunto del lenguaje Java que puede codificarse directamente sobre cualquier documento HTML Servlets: Módulos que facultan sustituir o utilizar el lenguaje Java en espacio de proyectos CGI (Common Gateway Interface) a la hora de dotar de interactividad a las páginas Web.

Entradas populares