lunes, 31 de diciembre de 2007

Cambio de idioma con struts

Este es una pequeña ayuda para los que quieran desarrollar una página web con diferentes idiomas. Es para un proyecto con tecnología J2EE y con soporte de struts.

Se requiere conocimientos básicos de struts, vamos a hacer un resumen:

El framework struts es un estándar para el desarrollo de aplicaciones web. Tiene las siguientes características:


  • Es open source

  • Está basado en el Modelo Vista Controlador

  • Implementa la arquitectura JSP

  • Se guarda la información de los ruteos y mapeos en un único archivo de configuración llamado struts-config.xml


Componentes de Struts

El controlador:
Es el encargado de recibir las peticiones e interpretar la URL para llamar a una clase Action y seleccionar el módulo adecuado. Lo provee el framework.

El archivo struts-config.xml
Este archivo contiene la configuración y todo el ruteo para una aplicación con soporte de Struts. Este archivo xml debe estar en el directorio WEB-INF de la aplicación.

Clases Action
Actúa como puente entre el link invocado por el usuario y los servicios de negocio. Los actions procesan una solicitud y devuelven un objeto ActionForward que identifica el siguiente componente a invocar.

Recursos de vista
Consisten en JSP (Java Server Pages), páginas HTML, archivos JavaScript y de estilo, Resource bundles, JavaBeans, and tags de Struts JSP.

ActionForms
Facilita la forma de validar la data capturada desde una peticion HTTP. Actúa como un "firewall" entre los formularios (páginas web) y la aplicación (actions). Estos componentes permiten la validación de la entrada antes de llegar al action o ejecutar la acción. Si la entrada no es válida se puede mostrar un error.

Pasos para cambiar el idioma.
Vamos a asumir que ya está creado el proyecto Web con soporte de Struts. El ejemplo que se utilizará será una validación de campos en diferentes idiomas.

Configuración del archivo struts-config.xml:
De este archivo nos interesa configurar el ActionForm, el Action y el archivo de recursos de mensajes

Para el ActionForm se agrega lo siguiente en la etiqueta form-beans:

<form-beans>
<form-bean name="myForm" type="pruebaweb.forms.myForm">
</form-bean>
</form-beans>

El Action se configura de la siguiente forma:

<action-mappings>
<action name="myForm" path="/myAct"
type="pruebaweb.actions.myAction" input="index.jsp">
<forward name="inicio"
path="index.jsp"></forward>
</action>
</action-mappings>

Finalmente los recursos de mensaje:

<message-resources parameter="pruebaweb.resources.ApplicationResources"/>


Esto último debemos tenerlo en cuenta a la hora de querer cambiar el idioma, ya que es el nombre del archivo que contiene los mensajes a mostrar en pantalla. El archivo de mensajes en este caso se llamaría ApplicationResources.properties y se encuentra en el paquete pruebaweb.resources

Creando el ActionForm (myForm)
El ActionForm contendrá los campos necesarios para capturar los datos de entrada desde la página html. Para el ejemplo tendremos un Rut y un nombre como campos:

package pruebaweb.forms;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class myForm extends ActionForm {
private String rut = null;
private String nombre = null;
private String ok = null;
public void reset(ActionMapping mapping, HttpServletRequest request) {
rut = null;
nombre = null;
ok = null;
}
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if ((rut != null) && (rut.length() == 0)) {
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError("error.rut"));
}
if ((nombre != null) && (nombre.length() == 0)) {
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError("error.nombre"));
}
return errors;

}
public String getRut() { return rut;}
public void setRut(String r) { this.rut = r;}
public String getNombre() { return nombre;}
public void setNombre(String n) { this.nombre = n;}
public String getOk() { return ok;}
public void setOk(String string) { ok = string;}
}

Creando el action (myAction)
Vamos a crear tres funciones, una para iniciar, una para validar un rut y nombre, y una para cambiar el idioma.

package pruebaweb.actions;

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.Globals;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

public class myAction extends DispatchAction {
public ActionForward inicio(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
return mapping.findForward("inicio");
}
public ActionForward cambiaIdioma(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
pruebaweb.forms.myForm myForm = (pruebaweb.forms.myForm) form;
request.getSession().setAttribute(Globals.LOCALE_KEY,
new Locale(myForm.getIdioma(), ""));
return mapping.getInputForward();
}
public ActionForward validar(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
ActionForward forward = new ActionForward();
pruebaweb.forms.myForm myForm = (pruebaweb.forms.myForm) form;
if("Juanito".equalsIgnoreCase(myForm.getNombre()) &&
"19".equals(myForm.getRut())){
request.setAttribute("estado", "Ok");
}else{
request.setAttribute("estado", "No");
}
forward = mapping.findForward("inicio");
return (forward);
}
}

Creando el jsp (index.jsp)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html:html>
<HEAD>
<%@ page
language="java"
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"
%>
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>Ejemplo</TITLE>
<script language="JavaScript">
function ir(accion, idioma){
document.forms[0].accion.value = accion;
document.forms[0].idioma.value = idioma;
document.forms[0].submit();
}
</script>
</HEAD>
<BODY>
<html:errors/>
<html:form action="/myAct">
<input type="hidden" name="accion" value="validar">
<input type="hidden" name="idioma" value="">
<table width="40%">
<tr>
<td width="20%"><bean:message key="rut"/></td>
<td width="2%">:</td>
<td width="30%"><html:text name="myForm" property="rut"/></td>
</tr>
<tr>
<td><bean:message key="nombre"/></td>
<td>:</td>
<td><html:text name="myForm" property="nombre"/></td>
<tr>
<tr>
<td colspan="2"> </td>
<td><input type="submit" name="boton" value="Verificar"></td>
<tr>
</table>
<bean:message key="mensaje"/>
<br><br>
<logic:present name="estado">
<font style="color: blue;font-size: 26px"><bean:write name="estado"/></font>
</logic:present>
<br>
<a href="JavaScript:ir('cambiaIdioma','')">Español</a>
<a href="JavaScript:ir('cambiaIdioma','en')">Inglés</a>
</html:form>
</BODY>
</html:html>

Creando el archivo ApplicationResources.properties

mensaje=Enter your Rut and Name
rut=Rut
nombre=Name

Para agregar otro idioma basta con crear un archivo con el mismo nombre que el anterior y agregarle un guión bajo y una definición, por ejemplo para inglés ApplicationResources_en.properties
Creando el archivo ApplicationResources_en.properties

errors.header=<ul>
errors.footer=</ul>
error.rut=<li>Rut no válido</li>
error.nombre=<li>Nombre no válido</li>
error.general=<li>Error general</li>
mensaje=Enter your Rut and Name
rut=Rut
nombre=Name


Rimaster ®

No hay comentarios.: