La caida de Struts

Estándar
2016_08_12_struts_fall

Hubo Complicaciones…

Pues si, intentar usar la nueva versión de Struts dio demasiada lata, así que de aquí en adelante los tutoriales de aplicaciones web serán con Spring MVC

Panel 1
Parecia simple, hacer unos ejemplos con Struts 2.5 para e blog..

Hash: ¡¿Que diablos paso?!, ¡Faltan jars!, ¿¡Xwork-core!?, ¡Tomcat 8 NO soportado!, ¿¡Java 8 no soportado?!

Pero hubo complicaciones

Panel 2
Hash: ¿Hm?

Panel 3
Al parecer la nueva version de Struts tiene ciertos “detalles”

Panel 4
Que seria mejor evitar
Hash: ¡YA ESTUVO!, ¡NOS CAMBIAMOS DE FRAMEWORK!

Panel 5
¡Nos pasamos a Spring MVC!

Anuncios

Hola Mundo: Proyecto básico con Apache Struts

Estándar
hash_Example

Un ejemplo sencillo.

Ya en una entrada anterior describimos y realizamos los preparativos para un proyecto de aplicación Web usando Apache Struts, se preparo el servidor, proyecto y se agregaron las librerias básicas, pues ahora llego el momento de efectuar el obligatorio Hola Mundo.

El proyecto que efectuaremos es bastante sencillo, al acceder a la aplicación se nos solicitara que ingresemos nuestro nombre y al presionar el botón Login nos llevara a otra pagina donde se mostrara un saludo mas el nombre que agregamos pasado a mayusculas, un ejemplo trivial en efecto, pero el objectivo es mostrar como se compone una aplicación con Struts, los usos practivos llegaran mas adelante 😉

Antes de empezar con el código sera buena idea describir los componentes básicos de una aplicación realizada con Struts, estos son

  • Acciones: Son las llamadas que hace la pagina a los objectos Java que componen la aplicación, pueden ser tan simples como pasarse a otra pagina o tan complejos como generar un documento y descargarlo.
  • Paginas JSP: Paginas Web que se desplegaran en el navegador y presentaran los datos o servir para hacer las llamadas a las acciones
  • Objectos Java: Es donde realizaremos todas las consultas y procesamiento de datos, tomando ventaja de las facilidades que da el Java para esto
  • Métodos Getter y Setter: Via estos metodos enviaremos y extraeremos datos de los objectos Java

Cada uno de estos elementos, su función y uso se analizara con mas detalle en futuras entradas.

Antes de comenzar me gustaria agradecer a Mkyong.com ya que el ejemplo que presentare esta basado en el ejemplo de Aplicación Struts2 presentado en esta pagina: http://www.mkyong.com/struts2/struts-2-hello-world-example/ por lo que no puedo sino recomendar que le den una leida en algun momento que tengan.

Ahora si pasemos al ejemplo.

Primero crearemos una clase la cual contendrá y procesara los datos, en este caso el nombre de usuario:

package mx.hashSoft.ejemploStruts.action;

import com.opensymphony.xwork2.ActionSupport;

/**
 * Clase para manejar la accion
 * @author David
 */
public class EjemploAction extends ActionSupport {
    private String nombre;

    /**
     * Toma el nombre que se halla ingresado y lo convierte a mayuscular
     * Este metodo se ejecutara automanticamente al llamar la accion correspondiente
     * @return Resultado de la accion
     */
    @Override
    public String execute(){
        nombre = nombre.toUpperCase();

        return "SUCCESS";
    }    

    /**
     * Nos regresa el valor de la cadena nombre
     * @return nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * Nos permite establecer el valor de la cadena nombre
     * @param nombre valor que se desea establecer en nombre
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
}

Notara que la clase es relativamente sencilla sin embargo hay que mencionar el metodo execute, este método es obligatorio que exista, de otro modo al llamar a esta clase la aplicación se caera.

Tambien hay que mencionar los metodos getter y setter, para cada campo de la clase que quiera que pueda accederse desde el JSP *debe* de tener tanto el getter como el setter.

Ahora vaya a Web Pages en su proyecto y cree la carpeta pages y los archivos bienvenido.jsp y login.jsp, como se ve en la figura.

paginas

Paginas JSP del proyecto

Y en dichos archivos ponga el siguiente contenido

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
    <head>
        <title>Hola mundo con Struts 2</title>
    </head>
    <body>
<h1>Hola mundo con Struts 2</h1>
<s:form action="Bienvenido">
            <s:textfield name="nombre" label="Nombre" />
            <s:submit />
        </s:form>
    </body>
</html>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
    <head>
        <title>Hola mundo con Struts 2</title>
    </head>
    <body>
<h1>Hola mundo con Struts 2</h1>
<h2>
            Hola
            <s:property value="nombre" /></h2>
</body>
</html>

Estos archivos son mayormente archivos html regulares, pero con algunas etiquetas no convencionales, especificamente las que comienzan con <s:, estas con las etiquetas del framework Apache Struts.

Ahora cree una carpeta classes en Web Pages/WEB-INF y en esta cree un archivo xml con el nombre struts.xml, como se observa en la figura

archivo_struts_xml

Ubicación del archivo struts.xml

El contenido del archivo struts.xml es el siguiente

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.devMode" value="true" />
    <constant name="struts.action.extension" value=""/>

    <package name="ejemplo" namespace="/" extends="struts-default">

        <action name="Login">
            <result>pages/login.jsp</result>
        </action>

        <action name="Bienvenido" class="mx.hashSoft.ejemploStruts.action.EjemploAction">
            <result name="SUCCESS">pages/bienvenido.jsp</result>
        </action>
    </package>

</struts>

En una entrada proxima detallaremos que hace cada campo, pero lo que ve en el archivo se resume basicamente en lo siguiente:

  • Declaramos las acciones de modo que cuando ponga en el navegador http://<url>/<accion > se llame a la accion correspondiente
  • Se indica que clase se debe instanciar para realizar la accion necesaria
  • Despues de llamar el metodo execute la clase nos regresara una cadena resultado, que se compara contra los resultados
  • Se redirecciona a la pagina cuyo resultado sea igual al que regreso el metodo execute
  • La pagina resultante obtendra datos via los getter del la clase que se instancio al llamar al evento y los desplegara

Si ejecutara la aplicación ahora le apareceria en pantalla un bonito mensaje de error como el que se ve en la figura.

struts_error

Error al ejecutar la aplicación

No se espante, lo que ha pasado asi es que se ha llamado a una acción que no existe, esto es mas que nada por la forma en que NetBeans ejecuta las aplicaciones Web, para corregir esto configuraremos el proyecto para que agrege /Login a la URL al ejecutar la aplicación, para esto acceda a las propiedades del proyecto con el boton derecho y acceda a la sección “Run”.

run

Propiedades del proyecto, seccion Run

En el campo “Relative URL” ingrese “/Login” y presione OK, hecho esto vuelva a correr el proyecto y obtendra una pantalla como la figura.

login

Entrada de la aplicación

Ingrese un nombre o cualquier palabra en el campo de texto y presione el boton, esto le dara como resultado un mensaje donde la palabra que escribo habra pasado a mayusculas, como muestra la figura.

saludo

Salida del programa

Si bien este ejemplo es muy sencillo cumple con el proposito de presentar los tres compoentes basicos que componen una aplicación realizada con Struts, las clases action para afectuar las operaciones, los archivos JSP para recibir y presentar los datos y las acciones en struts.xml para conectar estos dos.

Ya en entradas posteriores se presentara a mas detalle que función y que posibilidades presenta cada elemento, pero por el momento espero que esta entrada fuera de utilidad para comenzar, y nos vemos en la proxima entrada.

Preparando un proyecto de Apache Struts en NetBeans

Estándar
hash_preparativos

Preparativos

Apache Struts es un framework que le permite la creación de aplicaciones web usando una combinacion razonablemente organizada de código en Java junto con JSP dandole acceso a las funcionalidades que Java y sus librerias le presentan.

Como crear una aplicación Web no es exactamente un proceso trivial, al menos no si se desea entender que se esta haciendo, es muy fácil sentirse sobrepasado al iniciar por lo que empezaremos los tutoriales sobre Apache Struts con la descripción paso a paso de como *preparar* el proyecto, que necesitamos y como configurarlo.

Servidor Apache Tomcat
El primer requerimiento de cualquier proyecto de aplicación web es tener configurado en el entorno de desarrollo al menos un servidor, como por ejemplo Apache Tomcat, en el cual correr las aplicaciones.

Para comenzar vaya a http://tomcat.apache.org/ y descarge la versión mas reciente del servidor, 8.0.29 a la fecha de escribir esta entrada, descarge el .zip de la versión de core acorde a su arquitectura, hecho esto extraiga el contenido de dicho archivo en alguna ubicación en su computadora.

Una vez que halla descomprimido los archivos del servidor vaya a al menú Tools->Servers en el entorno NetBeans, esto le mostrara una pantalla como la que se ve en la figura.

server

Configuración de servidores

Presione el boton “Add Server”, lo que le presentara un dialogo para agregar un servidor al entorno, seleccione Apache Tomcat y presione siguiente.

server_config

Configuración del servidor

En este dialogo tendra que ingresar la ruta del servidor (esto es la carpeta tomcat-8.0.29 contenida en el zip que descargo) y especificar la cuenta del administrador de dicho servidor, en este caso escriba el nombre de usuario y contraseña que desee, solo deja seleccionada la opción “Create user if dosen’t exist” para crear esa cuenta si es necesario, presione finalizar y listo, ya agrego un servidor Tomcat a su entorno de desarollo.

server_listo

Servidor Configurado

Un ultimo detalle a considerar es un error que tienen los archivos de configuración de tomcat en su versión 7 y 8 el cual no dejara que arranque desde NetBeans (le mandara un error diciendo que “”127.0.0.1″ no se reconoce como un comando interno o externo”), para corregirlo vaya al archivo bin/catalina.bat y busque la linea:

:noJuliConfig
set “JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%”

y remplacela con:

:noJuliConfig
set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%

hecho esto busque:

:noJuliManager
set “JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%”

y remplacela con:

:noJuliManager
set JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%

Es mas que nada remover las comillas en esos comandos, hecho esto el servidor quedara correctamente configurado.

Crear un proyecto WebApp en NetBeans
Ya que hemos agregado un servidor web a nuestro entorno llego el momento de crear un proyecto para aplicación web, esto es relativamente sencillo, basta con ir a “File->New Proyect” y seleccionar Java Web->Web Aplication, presionamos siguiente para que nos pida el nombre y ubicación y luego nos pedira que servidor deseamos usar, como se ve en la figura usaremos el servidor Tomcat que acabamos de configurar.

proyecto_server

Servidor que usaremos para el proyecto

Presione siguiente y se le preguntara si desea usar alguno de los frameworks incluidos con NetBeans, ya que Struts 2 no esta disponible solo de en finalizar, como se observa en la figura los proyectos web tienen un icono diferente para distinguirlos.

proyecto_terminado

Proyecto Web creado

 

Framework Apache Struts
Ahora que tenemos listo nuestro proyecto Web es momento de agregar las librerias que confirman el framework Apache Struts, para esto vaya a la pagina https://struts.apache.org/ y al enlace de descargas, ahi descargue ya sea la versión completa del framework o solo las depedencias esenciales.

Ya que halla extraido el contenido del archivo .zip localice los siguientes archivos y coloquelos en la carpeta lib (creela de ser necesario) del proyecto:

  • commons-fileupload-1.3.1.jar
  • commons-io-2.2.jar
  • commons-lang-2.4.jar
  • commons-lang3-3.2.jar
  • freemarker-2.3.22.jar
  • javassist-3.11.0.GA.jar
  • ognl-3.0.6.jar
  • struts2-core-2.3.24.1.jar
  • xwork-core-2.3.24.1.jar

Ya que tenga esos archivos en la carpeta lib proceda a crear una libreria Struts2-base y agregela al proyecto, una forma de como hacer esto puede consultarse en la entrada Agregando Librerias a un proyecto en NetBeans de este blog, en la figura se observa como se ve la figura

libreria

Libreria base de Apache Struts

 

Archivo web.xml
Las aplicaciones Web necesitan de un archivo que le describa al servidor como van a funcionar, este archivo es el web.xml, por defecto los proyectos en NetBeans no generan automaticamente este archivo por lo que lo crearemos manualmente.

Para esto acceda a la vista de archivos desde el menú “Window->Files”  y vaya a la carpeta web/WEB-INF del proyecto, estara esta vacia, de clic derecho sobre esta carpeta y seleccione New->Other y vaya a Web->Standart Deployment Descriptor (web.xml), como se ve en la figura

web_xml_nuevo

Archivo web.xml

Prescione Next y Finish y habra creado el archivo web.xml, ahora abra el archivo y remplace el contenido de web.xml con lo siguiente:

<!DOCTYPE web-app PUBLIC  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
    <display-name>Struts 2 Web Application</display-name>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

Este contenido configura el uso de Struts 2 por nuestra aplicación.

archivo_web_xml

Archivo web.xml en ubicación y con contenido correctos.

Tras realizar estos pasos tendra listo un proyecto con todo lo necesario para hacer uso del framework Apache Struts, dado que esta entrada termino siendo un tanto larga y requerir de multiples pasos dejaremos el ejemplo mas basico para la siguiente entrada, en todo caso si esta intersado en hacer uso de Struts espero que esta entrada le sea de utilidad en como comenzar.

Nos vemos en la proxima entrada.