java - ¿La mejor manera de externalizar HTML en aplicaciones GWT?
(14)
¿Por qué no usar IFRAME de buenos tiempos? Simplemente cree un iFrame donde desee poner una pista y cambiar su ubicación cuando cambie la "página" de GWT.
Ventajas:
- Los hits se almacenan en archivos HTML que se pueden mantener separados de cualquier estructura
- Carga de estilo AJAX sin codificación en el lado del servidor
- Si es necesario, la aplicación podría interactuar con la información cargada.
Desventajas:
- Cada archivo de sugerencias debe tener un enlace a CSS compartido para una apariencia común
- Difícil de internacionalizar
Para mejorar este enfoque, puede manejar los errores de carga y redirigir al idioma / tema predeterminado en los errores 404. Entonces, la prioridad de búsqueda será así:
- Tema actual para el idioma actual
- Tema actual para el idioma por defecto
- Tema predeterminado para el idioma actual
- Página de error predeterminada
Creo que es bastante fácil crear dicho componente GWT para incorporar interacciones de iFrame
¿Cuál es la mejor manera de externalizar grandes cantidades de HTML en una aplicación GWT? Tenemos una aplicación GWT bastante complicada de aproximadamente 30 "páginas"; Cada página tiene una especie de guía en la parte inferior que contiene varios párrafos de marcado HTML. Me gustaría externalizar el HTML para que pueda permanecer tan "sin escapar" como sea posible.
Sé y entiendo cómo usar archivos de propiedades en GWT; eso es ciertamente mejor que incrustar el contenido en las clases de Java, pero aún así es un poco feo para HTML (es necesario hacer una contra-escritura de todo, así como citas de escape, etc.)
Normalmente este es el tipo de cosa que pondrías en un JSP , pero no veo nada equivalente a eso en GWT. Estoy considerando simplemente escribir un widget que simplemente obtenga el contenido de los archivos html en el servidor y luego agregue el texto a un widget HTML. Pero parece que debería haber una forma más simple.
El marco de Portlets de GWT ( http://code.google.com/p/gwtportlets/ ) incluye un WebAppContentPortlet. Esto sirve cualquier contenido de su aplicación web (HTML estático, JSP, etc.). Puede ponerlo en una página con funcionalidad adicional en otros Portlets y todo se recupera con una sola llamada asíncrona cuando se carga la página.
Eche un vistazo a la fuente de WebAppContentPortlet y WebAppContentDataProvider para ver cómo se hace o intente utilizar el propio marco. Aquí están los bits relevantes de la fuente:
WebAppContentPortlet (lado del cliente)
((HasHTML)getWidget()).setHTML(html == null ? "<i>Web App Content</i>" : html);
WebAppContentDataProvider (lado del servidor):
HttpServletRequest servletRequest = req.getServletRequest();
String path = f.path.startsWith("/") ? f.path : "/" + f.path;
RequestDispatcher rd = servletRequest.getRequestDispatcher(path);
BufferedResponse res = new BufferedResponse(req.getServletResponse());
try {
rd.include(servletRequest, res);
res.getWriter().flush();
f.html = new String(res.toByteArray(), res.getCharacterEncoding());
} catch (Exception e) {
log.error("Error including ''" + path + "'': " + e, e);
f.html = "Error including ''" + path +
"''<br>(see server log for details)";
}
En GWT 2.0, puedes hacer esto usando el UiBinder .
<ui:UiBinder xmlns:ui=''urn:ui:com.google.gwt.uibinder''>
<div>
Hello, <span ui:field=''nameSpan’/>, this is just good ‘ol HTML.
</div>
</ui:UiBinder>
Estos archivos se mantienen separados de su código Java y se pueden editar como HTML. También ofrecen integración con los widgets de GWT, de modo que puede acceder fácilmente a elementos dentro del HTML desde su código GWT.
Estaba haciendo una investigación similar y, hasta ahora, veo que la mejor manera de abordar este problema es a través de DeclarativeUI o UriBind . Desafortunadamente, todavía está en la incubadora, así que tenemos que solucionar el problema.
Lo resuelvo de dos maneras diferentes:
Superposición activa, es decir: creas tu HTML / CSS estándar e inyectas el código GET a través de la etiqueta
<script>
. En cualquier lugar donde necesite acceder a un elemento desde el código GWT, escriba algo como esto:RootPanel.get("element-name").setVisible(false);
Usted escribe su código 100% GWT y luego, si se necesita una gran porción de HTML, puede llevarlo al cliente a través de IFRAME o AJAX y luego inyectarlo a través del panel HTML de esta manera:
String html = "<div id=''one'' " + "style=''border:3px dotted blue;''>" + "</div><div id=''two'' " + "style=''border:3px dotted green;''" + "></div>"; HTMLPanel panel = new HTMLPanel(html); panel.setSize("200px", "120px"); panel.addStyleName("demo-panel"); panel.add(new Button("Do Nothing"), "one"); panel.add(new TextBox(), "two"); RootPanel.get("demo").add(panel);
GWT 2.0, cuando se lance, debería tener un ClientBundle, que probablemente aborde esta necesidad.
He usado ClientBundle en una configuración similar. He creado un paquete my.resources y puse mi documento HTML y la siguiente clase allí:
package my.resources;
import com.google.gwt.core.client.GWT;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.TextResource;
public interface MyHtmlResources extends ClientBundle {
public static final MyHtmlResources INSTANCE = GWT.create(MyHtmlResources.class);
@Source("intro.html")
public TextResource getIntroHtml();
}
Luego obtengo el contenido de ese archivo llamando al siguiente código de mi cliente de GWT:
HTML htmlPanel = new HTML();
String html = MyHtmlResources.INSTANCE.getIntroHtml().getText();
htmlPanel.setHTML(html);
Consulte http://code.google.com/webtoolkit/doc/latest/DevGuideClientBundle.html para obtener más información.
No estoy seguro de entender su pregunta, pero voy a suponer que ha incluido este resumen común en su propio widget. Si es así, el problema es que no te gusta la forma fea de incrustar HTML en el código Java.
GWT 2.0 tiene UiBinder , que le permite definir la GUI en una plantilla HTML sin formato, y puede inyectar valores en la plantilla desde el mundo Java. Lee la UiBinder y da un buen resumen.
Puede intentar implementar un Generator
para cargar HTML externo desde un archivo en tiempo de compilación y crear una clase que lo emita. No parece haber mucha ayuda en línea para crear generadores, pero aquí hay una publicación para el grupo de GWT que podría ayudarlo a comenzar: Grupo de GWT en groups.google.com .
Puede probar la aplicación GWT con las plantillas html generadas y enlazadas en tiempo de ejecución, sin tiempo de compilación.
Puede usar servlets con jsps para las partes html de la página y aún así incluir el javascript necesario para ejecutar la aplicación gwt en la página.
Puedes usar algún mecanismo de plantillas. Prueba las plantillas FreeMarker o Velocity . Tendrá su HTML en los archivos que se recuperarán mediante la creación de plantillas de bibliotecas. Estos archivos se pueden nombrar con extensiones adecuadas, por ejemplo, .html, .css, .js que se pueden ver por sí solos.
Sin conocer GWT, pero ¿no puede definir y anclar la etiqueta div en el html de su aplicación y luego realizar una obtención contra los archivos HTML que necesita y adjuntar a la div? ¿Qué tan diferente sería esto de una micro-template ?
ACTUALIZAR:
Acabo de encontrar este agradable complemento de jQuery en respuesta a otra pregunta de .
Yo diría que carga el html externo a través de un Frame .
Frame frame = new Frame();
frame.setUrl(GWT.getModuleBase() + getCurrentPageHelp());
add(frame);
Puede organizar alguna convención o búsqueda para que getCurrentPageHelp ( ) devuelva la ruta apropiada (por ejemplo: /manuals/myPage/help.html )
Aquí hay un example de marco en acción.