Iniciar sesión

Hello world struts2

Rodrigo

Traducido por Rodrigo

Creado 2014-07-07 21:31:30 Modificado 2014-07-07 21:38:49

Struts2 es un framework para las aplicaciones web, basado en el patrón de diseño mvc, es muy útil cuando necesitas construir una aplicacón web, struts2 te da todas las herramientas que necesitas y el código es muy limpio y bsándose en la arquitectura mvc, el código se vuelve incluso más claro

En este tutorial vamos a desarrollar un ejemplo básico de hola mundo usando el framework struts2, eclipse tomcat y apache ant (la herramienta que limpia/compila el projecto), vamos a explicar el código en detalle en el paso de Probando, así que no te preocupes por el código si no entiendes, hasta llegar a ese punto 

este tutorial fue escrito usando el siguiente equipo:

  • Hardware:           laptop Thinkpad E430 Intel I5, 4gb Ram, 500gb HDD
  • SO:                    x86_64 GNU/Linux Ubuntu 14.10
  • Kernel:               3.13.0-29-generic
  • IDE/Text editor:   Eclipse Java EE IDE for Web Developers Version: Kepler Service Release 2
  • JDK:                   Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
  • Struts:                struts-2.3.15.3
  • Tomcat:              apache-tomcat-6.0.35 (como contenedor de servlet)
  • Navegador:         Chromium Version 34.0.1847.116 Ubuntu 14.04 aura (260972)

 

1.- Configurando el ambiente:

Primero necesitamos añadir las librerías necesarias de struts2 para trabajar en el ejemplo, ve a http://struts.apache.org/download.cgi y descarga la última versión, luego neceitarás añadir las siguientes librerías a tu proyecto:

  • commons-fileupload-1.3.jar
  • commons-io-2.0.1.jar
  • commons-logging-1.1.3.jar
  • freemarker-2.3.19.jar
  • ognl-3.0.6.jar
  • struts2-core-2.3.15.3.jar
  • xwork-core-2.3.15.3.jar
  • javassist-3.11.0.GA.jar
  • commons-lang3-3.1.jar

este es mi classpath:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
	<classpathentry kind="var" path="TOMCAT_HOME/lib/servlet-api.jar"/>
	<classpathentry kind="var" path="TOMCAT_HOME/lib/jasper.jar"/>
	<classpathentry kind="var" path="TOMCAT_HOME/lib/jsp-api.jar"/>
	<classpathentry kind="var" path="TOMCAT_HOME/lib/el-api.jar"/>
	<classpathentry kind="var" path="TOMCAT_HOME/lib/annotations-api.jar"/>
	<classpathentry kind="src" path="WEB-INF/src"/>
	<classpathentry kind="src" output="work" path="work"/>
	<classpathentry kind="lib" path="WEB-INF/lib/commons-fileupload-1.3.jar"/>
	<classpathentry kind="lib" path="WEB-INF/lib/commons-io-2.0.1.jar"/>
	<classpathentry kind="lib" path="WEB-INF/lib/commons-logging-1.1.3.jar"/>
	<classpathentry kind="lib" path="WEB-INF/lib/freemarker-2.3.19.jar"/>
	<classpathentry kind="lib" path="WEB-INF/lib/ognl-3.0.6.jar"/>
	<classpathentry kind="lib" path="WEB-INF/lib/struts2-core-2.3.15.3.jar"/>
	<classpathentry kind="lib" path="WEB-INF/lib/xwork-core-2.3.15.3.jar"/>
	<classpathentry kind="lib" path="WEB-INF/lib/javassist-3.11.0.GA.jar"/>
	<classpathentry kind="lib" path="WEB-INF/lib/commons-lang3-3.1.jar"/>
	<classpathentry kind="output" path="WEB-INF/classes"/>
</classpath>

lista de directorios:

2.- Creando la página index:

una vez instaladas las librerías, podemos crear nuestra página index.
index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
<title>Hello World</title>
</head>
<body>
<s:form action="Hello">
	<s:textfield key="name"/>	
	<s:submit/>
</s:form>
</body>
</html>

3.- Creando la página success:

Hemos creado la página index la cual hace un submit al struts2 action Hello, si las cosas van bien, redireccionamos a la página sucess y decimos hola, sino, manejamos el error.
success.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
<title>Hello World</title>
</head>
<body>
	<h3>Hello: <s:text name="name"/></h3>
</body>
</html>

4.- Creando la clase action:

Hasta este punto hemos creado 2 jsp, página de presentación, no tienen lógica dentro, sólo muestran datos, ahora vamos a crear la clase strtus2 action que va a manejar los datos solicitados y validarlos antes de ir a la página success

package com.rrivero.action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	private String name = "";

	public void validate() {
		if (name == null || name.equals(""))
			addFieldError("name", "Name not null");

		else if (name.length() < 4)
			addFieldError("name", "Name minimum length = 4");
	}

	@Override
	public String execute() throws Exception {

		return SUCCESS;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

5.- Creando struts.xml:

Para trabajar con struts2 necesitamos decirle cual es el "Hello" mapping del index.jsp cuando hacemos clic en submit, definido en el tag form->action

<?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>
	<package name="default" extends="struts-default">
				<action name="Hello" class="com.rrivero.action.HelloAction">	
					<result name="input">/index.jsp</result>	
					<result name="success">/WEB-INF/jsp/success.jsp</result>		
				</action>			
    </package>
    
</struts>

como puedes ver le estamos diciendo a struts que el mapeo "Hello" va hacia la clase com.rrivero.HelloAction

6.- Creando el web.xml:

Otra cosa que debemos hacer para trabajar con struts es la configuración "web", hicimos el mapeo de la aplicación y ahora tenemos que decirle a la aplicación que estamos usando struts y los mapeos serán manejados por struts

<?xml version="1.0"?>
<!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>Hello World</display-name>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>

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

7.- Probando la aplicación:

Hasta este punto hemos terminado, ahora vamos a probar como funciona struts2, ve hacia http://127.0.0.1:8080/helloWorldStruts2/ y verás la siguiente página:

Ahora haz clic en el submit con el nombre vacío, veremos la siguiente página

Actions:

Como puedes ver dice "nombre no nulo", ¿cómo logramos eso? déjame explicarte, en struts2 tienes 5 results principales

  • ERROR The action execution was a failure.
  • INPUT The action execution require more input in order to succeed.
  • LOGIN The action could not execute, since the user most was not logged in.
  • NONE The action execution was successful but do not show a view.
  • SUCCESS The action execution was successful.

y pueden además ser manejados en el action como  métodos:

package com.rrivero.action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloAction extends ActionSupport {
@Override public void validate() { if (name == null || name.equals("")) addFieldError("name", "Name not null"); else if (name.length() < 4) addFieldError("name", "Name minimum length = 4"); } @Override public String input() { //we prepare our form data, comboboxes etc... return INPUT; } @Override public String execute() throws Exception { //do all the logic AnotherClass anotherClass= new AnotherClass(); int inserts=anotherClass.insertData(); if(inserts>0) return SUCCESS; else return ERROR; } }

entonces el método de validate, valida los datos antes de usarlos, luego si los datos son correctos continúa con el método execute, sino automáticamente nos retornará al input de nuevo con los mensajes de error, el método input; podemos escoger si codificar o no el método input, si no necesitas preparar el formulario con comboboxes o datos provenientes desde la base de datos o cualquier dato que necesite ser procesado antes de ir a la página de presentación, no necesitas codificar el método input, método execute es el que ejecuta la lógica del action y el método por valor de fábrica

Jsp:

los jsp en struts2 sólo muestran datos y/o muestran un formulario para trabajar con el, analizemos el código, tenemos un tag diferente incluído para trabajar con struts

<%@ taglib prefix="s" uri="/struts-tags" %>

sólo entonces podemos trabajar con struts2, hay muchos tags de struts para usar, veamos el formulario y el submit:

<s:form action="Hello">
	<s:textfield key="name"/>	
	<s:submit/>
</s:form>

lo que tenemos aquí es un form tag diciendo que vamos a hacer el submit con los datos hacia el mapping "Hello" en el struts.xml y además vamos a enviar una variable vía post llamada "name"

<action name="Hello" class="com.rrivero.action.HelloAction">	
					<result name="input">/index.jsp</result>	
					<result name="success">/WEB-INF/jsp/success.jsp</result>		
				</action>			

tenemos 2 results para el mapeo "Hello", el input el cual va hacia el index y el success el cual va hacia la página sucess, recuerda que si no pasamos la validación seremos redireccionados al input, por lo que es necesario decirle a struts, dónde está el input

Data:

Para obtener los datos, en este caso la variable post "name", e incluso si fuera una variable get, sólo necesitamos crear una variable llamada "name" privada con sus getter y setter

package com.rrivero.action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloAction extends ActionSupport {
	
	private static final long serialVersionUID = 1L;
	private String name="";
       /*... + methods...*/
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}	
}

ahora los datos están guardados, la variable "name" tiene un valor, ahora podemos usar el valor de la variable "name" en la siguiente página de presentación, en el index hicimos submit con la variable "name" tuvimos que "setear" el name a través de setName() (POST variable), y luego recuperaremos el valor de "name", por lo tanto, necesitamos tener el método get para esta variable (getName()), mostraremos el "name" en el siguiente jsp

<h3>Hello: <s:text name="name"/></h3>

ahora escribe un nombre y haz submit

verás la siguiente página

 

 

Descárgalo en https://drive.google.com/file/d/0BwOqSob-RrBOamo3b2RZblh6VXc/edit?usp=sharing

8.- Conclusión:

Struts2 te da herramientas muy útiles para trabajar en aplicaiones web, usando el patrón de diseño mvc, código limpio y elegante, y reduce el tiempo de desarrollo considerablemente, la manera en como maneja los datos es muy cómoda, no tienes que usar métodos de los servlets para obtener los datos solicitados, no importa si los datos enviados "get" o "post", sólo necesitas getters y setters para esa variable

9.- Links de referencias:




comments powered by Disqus