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 StrutsEl 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.xmlEste 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 ActionActú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 vistaConsisten en JSP (Java Server Pages), páginas HTML, archivos JavaScript y de estilo, Resource bundles, JavaBeans, and tags de Struts JSP.
ActionFormsFacilita 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.resourcesCreando 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 ®