La esperanza es el peor de los males, pues prolonga el tormento del hombre
F. Nietzsche

[Struts] – Múltiples ficheros Message Resources

Sabemos de las bondades de la modularización: facilitar el trabajo en equipo y la reutilización de las partes para otros proyectos. Ya hemos visto que es posible fragmentar (dividirlos en módulos) otros ficheros que utilizamos en las aplicaciones web que se tornan también monstruosos, Fragmentar Ficheros de Configuración de Frameworks. Y también es posible fragmentar los archivos que contienen los mensajes de nuestra aplicación.

Para ello debemos de declarar las partes en nuestro struts-config.xml:

<message-resources

parameter=“es/lycka/pruebas/propiedades/MessageResources”/>

<message-resources

parameter=“es.lyck.pruebas.propiedades.ErroresResources”

key=“errores”>

</message-resources>

<message-resources

parameter=“es.lyck.pruebas.propiedades.TitulosResources”

key=“titulos”>

</message-resources>

No existe limitación en el número de recursos a utilizar, pero estos recursos NO se recombinan en un único recurso: simplemente se organizan en grupos o categorías de mensajes definidos por la propiedad key de las anteriores declaraciones. Típicamente se organizan estas categorías o bien por tipo de mensajes (errores, cabeceras, nombres de campo, mensajes de información…) o bien por áreas de trabajo para facilitar el trabajo en equipo (login, clientes, productos, compras, ventas…).

La manera de invocarlos dentro de nuestras JSPs sería:

<bean:message bundle=“labels” key=“label.url”/>

Si la aplicación web está dividida en módulos ([Struts] – Aplicaciones modulares), cada módulo utiliza sus propios ficheros de mensajes, con lo cual en dos módulos diferentes pueden existir dos mensajes con las mismas claves (internamente se identifican por el nombre del módulo a modo de prefijo y la clave del mensaje).

Como decía arriba, los distintos ficheros de mensajes NO se recombinan en un único recurso; por tanto, no podemos tener un fichero de mensajes comunes a una organización, y otro particular para cada aplicación que se recombinen en uno único. Se os ocurre alguna solución para esto ? que no sea el copia y pega del fichero común en cada fichero particular, y no implique reescribir Struts :)

También te puede interesar:

5 Comentarios hasta el momento »

  1. :s dijo

    29 de September del 2008 a las 10:35 pm

    Malaxo el tutorial :s

  2. Oscar dijo

    15 de January del 2010 a las 1:37 pm

    A parte del problema que tu dices, para visualizar un msg siempre tienes que indicar el “bundle” lo cual al final acabaría siendo un engorro y su mantenimiento más bien lioso.

    Lo único interesante que se me ocurre sería usar múltiples struts-config. Cada uno con sus correspondientes acciones, formularios y fichero de mensajes organizados por las diversas funcionalidades/módulos de la aplicación.

    Esto no sería nada extraño ya que los mensajes y acciones del módulo de “Usuarios” no tienen por qué tener nada que ver con las acciones y mensajes del módulo de “Compras” por ejemplo.

    Así se conseguiría usar los mensajes de un modo transparente al “bundle” y daría la ilusión de recombinación que tú dices.

    Saludos.

  3. YeSSa dijo

    17 de April del 2010 a las 7:07 pm

    Ajam… y entonces cual es la solucion a la ultima interrogante???

  4. pepe dijo

    5 de October del 2011 a las 11:52 am

    tengo definidos 2 archivos de recursos de la siguiente manera en el struts config:

    En la jsp trato de referenciarlos de la siguiente manera:

    Al probar me da portlet inhabilitado y no muestra nada, además en la consola se muestra el siguiente mensaje de error:
    [5/10/11 13:42:12:293 CEST] 00000439 ServletWrappe E SRVE0068E: Se ha generado una excepción no detectada en uno de los métodos de servicio del servlet: CIDOPPortlet. Se ha generado la excepción: java.lang.NoClassDefFoundError: com.gvdi.oinarri.control.errores.ControladorErrores
    at com.gvdi.oinarri.control.errores.ControladorErroresHandler.execute(ControladorErroresHandler.java:49)
    at com.ibm.wps.portlets.struts.WpsStrutsUtil.processException(WpsStrutsUtil.java:2710)
    at com.ibm.wps.portlets.struts.WpsStrutsUtil.executeCommand(WpsStrutsUtil.java:1438)
    at com.ibm.wps.portlets.struts.WpsStrutsUtil.executeCommand(WpsStrutsUtil.java:1322)
    at com.ibm.wps.portlets.struts.WpsStrutsUtil.executeSavedCommand(WpsStrutsUtil.java:1240)
    at com.ibm.wps.portlets.struts.WpsStrutsPortlet.doService(WpsStrutsPortlet.java:1325)
    at com.ibm.wps.portlets.struts.WpsStrutsPortlet.doView(WpsStrutsPortlet.java:1368)
    at org.apache.jetspeed.portlet.PortletAdapter.service(PortletAdapter.java:158)
    at com.ibm.wps.pe.pc.legacy.invoker.impl.PortletDelegateImpl._dispatch(PortletDelegateImpl.java:347)
    at com.ibm.wps.pe.pc.legacy.invoker.impl.PortletDelegateImpl.access$200(PortletDelegateImpl.java:70)
    at com.ibm.wps.pe.pc.legacy.invoker.impl.PortletDelegateImpl$Context.callPortlet(PortletDelegateImpl.java:550)
    at com.ibm.wps.pe.pc.legacy.services.PortletFilterServiceImpl.doFilter(PortletFilterServiceImpl.java:367)
    at com.ibm.wps.pe.pc.legacy.services.PortletFilter.doFilter(PortletFilter.java:42)
    at com.ibm.wps.pe.pc.legacy.invoker.impl.PortletDelegateImpl.dispatch(PortletDelegateImpl.java:141)
    at org.apache.jetspeed.portlet.Portlet.doGet(Portlet.java:499)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
    at com.ibm.wps.pe.pc.legacy.cache.CacheablePortlet.service(CacheablePortlet.java:120)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at org.apache.jetspeed.portlet.Portlet.service(Portlet.java:493)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1095)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:569)
    at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
    at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.include(WebAppRequestDispatcher.java:639)
    at com.ibm.wps.pe.pc.legacy.invoker.impl.PortletInvokerImpl.callMethod(PortletInvokerImpl.java:370)
    at com.ibm.wps.pe.pc.legacy.invoker.impl.PortletInvokerImpl.render(PortletInvokerImpl.java:99)
    at com.ibm.wps.pe.pc.legacy.PortletContainerImpl.callPortletMethod(PortletContainerImpl.java:1256)
    at com.ibm.wps.pe.pc.legacy.PortletContainerImpl.renderPortlet(PortletContainerImpl.java:461)
    at com.ibm.wps.pe.pc.PortletContainerImpl.doRenderPortlet(PortletContainerImpl.java:647)
    at com.ibm.wps.pe.ext.render.AbstractRenderManager.performService(AbstractRenderManager.java:264)
    at com.ibm.wps.pe.pc.PortletContainerImpl.renderPortlet(PortletContainerImpl.java:132)
    at com.ibm.wps.engine.tags.PortletRenderTag.doStartTag(PortletRenderTag.java:179)
    at com.ibm._jsp._Control._jspx_meth_portal$1skin_portletRender_0(_Control.java:951)
    at com.ibm._jsp._Control._jspService(_Control.java:580)
    at com.ibm.ws.jsp.runtime.HttpJspBase.service(HttpJspBase.java:87)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1095)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1036)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:118)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:87)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:832)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:679)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:565)
    at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
    at com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper.java:122)
    at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:226)
    at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.include(WebAppRequestDispatcher.java:639)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.handleRequest(DispatcherServiceImpl.java:93)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.include(DispatcherServiceImpl.java:53)
    at com.ibm.wps.services.dispatcher.Dispatcher.include(Dispatcher.java:50)
    at com.ibm.wps.engine.templates.skins.Default.render(Default.java:154)
    at com.ibm.wps.engine.templates.SkinTemplate.render(SkinTemplate.java:68)
    at com.ibm.wps.composition.elements.Component.render(Component.java:634)
    at com.ibm.wps.composition.elements.Control.render(Control.java:155)
    at com.ibm.wps.composition.Composition.render(Composition.java:2962)
    at com.ibm.websphere.personalization.transformation.PznTransformationLayoutModel.render(PznTransformationLayoutModel.java:90)
    at com.ibm.wps.model.wrappers.LayoutModelWrapperFactoryImpl$LayoutModelWrapperImpl.render(LayoutModelWrapperFactoryImpl.java:275)
    at com.ibm.wps.engine.tags.ComponentRenderTag.doStartTag(ComponentRenderTag.java:75)
    at com.ibm._jsp._UnlayeredContainer_2D_V._jspx_meth_portal$1skin_layoutNodeRender_0(_UnlayeredContainer_2D_V.java:253)
    at com.ibm._jsp._UnlayeredContainer_2D_V._jspService(_UnlayeredContainer_2D_V.java:157)
    at com.ibm.ws.jsp.runtime.HttpJspBase.service(HttpJspBase.java:87)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1095)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1036)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:118)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:87)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:832)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:679)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:565)
    at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
    at com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper.java:122)
    at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:226)
    at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.include(WebAppRequestDispatcher.java:639)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.handleRequest(DispatcherServiceImpl.java:93)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.include(DispatcherServiceImpl.java:53)
    at com.ibm.wps.services.dispatcher.Dispatcher.include(Dispatcher.java:50)
    at com.ibm.wps.engine.templates.skins.Default.render(Default.java:154)
    at com.ibm.wps.engine.templates.SkinTemplate.render(SkinTemplate.java:68)
    at com.ibm.wps.composition.elements.Component.render(Component.java:634)
    at com.ibm.wps.composition.Composition.render(Composition.java:2962)
    at com.ibm.websphere.personalization.transformation.PznTransformationLayoutModel.render(PznTransformationLayoutModel.java:90)
    at com.ibm.wps.model.wrappers.LayoutModelWrapperFactoryImpl$LayoutModelWrapperImpl.render(LayoutModelWrapperFactoryImpl.java:275)
    at com.ibm.wps.engine.tags2.PageRenderTag.doStartTag(PageRenderTag.java:534)
    at com.ibm._jsp._Home._jspService(_Home.java:91)
    at com.ibm.ws.jsp.runtime.HttpJspBase.service(HttpJspBase.java:87)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1095)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1036)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:118)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:87)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:832)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:679)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:565)
    at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
    at com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper.java:122)
    at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:226)
    at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.include(WebAppRequestDispatcher.java:639)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.handleRequest(DispatcherServiceImpl.java:93)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.include(DispatcherServiceImpl.java:53)
    at com.ibm.wps.services.dispatcher.Dispatcher.include(Dispatcher.java:58)
    at com.ibm.wps.engine.templates.screens.Default.render(Default.java:96)
    at com.ibm.wps.engine.templates.ScreenTemplate.render(ScreenTemplate.java:59)
    at com.ibm.wps.engine.tags2.ScreenRenderTag.doStartTag(ScreenRenderTag.java:189)
    at com.ibm._jsp._Default._jspx_meth_portal$1core_screenRender_0(_Default.java:9136)
    at com.ibm._jsp._Default._jspx_meth_c_if_67(_Default.java:9157)
    at com.ibm._jsp._Default._jspService(_Default.java:4226)
    at com.ibm.ws.jsp.runtime.HttpJspBase.service(HttpJspBase.java:87)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1095)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1036)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:118)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:87)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:832)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:679)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:565)
    at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
    at com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper.java:122)
    at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:226)
    at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.include(WebAppRequestDispatcher.java:639)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.handleRequest(DispatcherServiceImpl.java:93)
    at com.ibm.wps.services.dispatcher.DispatcherServiceImpl.include(DispatcherServiceImpl.java:53)
    at com.ibm.wps.services.dispatcher.Dispatcher.include(Dispatcher.java:50)
    at com.ibm.wps.engine.templates.themes.Default.doDispatch(Default.java:283)
    at com.ibm.wps.engine.templates.themes.Default.render(Default.java:236)
    at com.ibm.wps.engine.templates.ThemeTemplate.render(ThemeTemplate.java:65)
    at com.ibm.wps.engine.phases.WPRenderPhase.processRendering(WPRenderPhase.java:394)
    at com.ibm.wps.engine.phases.WPBaseRenderPhase.execute(WPBaseRenderPhase.java:189)
    at com.ibm.wps.state.phases.AbstractRenderPhase.next(AbstractRenderPhase.java:106)
    at com.ibm.wps.engine.phases.WPAbstractRenderPhase.next(WPAbstractRenderPhase.java:97)
    at com.ibm.wps.engine.Servlet.callPortal(Servlet.java:806)
    at com.ibm.wps.engine.Servlet.doGet(Servlet.java:608)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
    at com.ibm.wps.engine.Servlet.doFilter(Servlet.java:1188)
    at com.ibm.wps.resolver.servlet.ContentHandlerCleanup.doFilter(ContentHandlerCleanup.java:648)
    at com.ibm.wps.resolver.servlet.AbstractFilter.doFilter(AbstractFilter.java:82)
    at com.ibm.wps.engine.Servlet.service(Servlet.java:1179)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1095)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1036)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:145)
    at com.ibm.catalog.servlet.filter.ParameterFilter.doFilter(ParameterFilter.java:130)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
    at com.ibm.wps.engine.ExtendedLocaleFilter.doFilter(ExtendedLocaleFilter.java:113)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
    at com.ibm.wps.resolver.friendly.servlet.FriendlySelectionFilter.doFilter(FriendlySelectionFilter.java:191)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
    at com.ibm.wps.mappingurl.impl.URLAnalyzer.doFilter(URLAnalyzer.java:365)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
    at com.ibm.wps.engine.VirtualPortalFilter.doFilter(VirtualPortalFilter.java:88)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
    at com.ibm.wps.state.filter.StateCleanup.doFilter(StateCleanup.java:89)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:190)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:130)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:87)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:832)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:679)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:565)
    at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
    at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:90)
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:748)
    at com.ibm.ws.wswebcontainer.WebContainer.handleRequest(WebContainer.java:1461)
    at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:119)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:458)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:387)
    at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:102)
    at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
    at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
    at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
    at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:136)
    at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:195)
    at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:743)
    at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:873)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1473)
    Caused by: java.lang.ClassNotFoundException: com.gvdi.oinarri.control.errores.ControladorErrores
    at com.ibm.ws.classloader.CompoundClassLoader.findClass(CompoundClassLoader.java:479)
    at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:380)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:597)
    … 176 more

    Alguna sugerencia?

  5. yoyoooyoy dijo

    5 de October del 2011 a las 1:23 pm

    Buenas majo,

    mándame un correo con tu código (el mail está en la página de contacto) y le echo un ojo cdo pueda, pero no tiene pinta que sea un error del tema de esta entrada.

    Saludos

Comentarios RSS · TrackBack URI

Dejanos tu Comentario

Nombre: (Requerido)

E-Mail: (Requerido)

Sitio WEB:

Comentario:

Comenta