2012-01-04 7 views
6

Actualmente estoy programando la aplicación web basada en Vaadin. Estoy muy contento con el ciclo de aprendizaje y la forma en que se puede diseñar la IU fácil.Alternativa de Vaadin para UI con mucha carga

En ventajas generales de Vaadin son:

  • "nativo" de programación de interfaz de usuario para los usuarios de Java (jerarquía de componentes/detectores de eventos/arrastre & gota/validación).
  • Out-of-box buena colección de componentes (árbol/tabla/lista/...).

Las desventajas son:

  • grande y complejo salida HTML. Eso ralentiza el tiempo de respuesta del navegador (también se menciona here y there) y conduce a algunas peculiaridades de representación del navegador al navegador.
  • Dificultades para manejar un gran número de componentes (consulte Can CustomLayout handle 5000 components?).
  • La necesidad de recompilar el conjunto de widgets si usa componentes de terceros.

Mi pregunta a la comunidad es:

qué marco Web encaja mejor con los siguientes requisitos:

  • Separación de presentación con los manipuladores de evento/acción.
  • Componentes comunes salidos de la caja (con funciones avanzadas como la columna de la tabla arrastre & soltar, cargar de forma diferida).
  • Soporte de diseño (sin dolor de cabeza con relleno y alineación de componentes).
  • Propagación de eventos al servidor y al procesamiento de eventos del lado del servidor.
  • Posibilidad de generar su HTML (si el marco no está basado en HTML) y también capturar eventos para él (por ejemplo, clics del mouse).
  • La posibilidad de registrar devoluciones de llamadas de Stoke clave (por ejemplo, Ctrl-S) es un plus.
  • Curva de aprendizaje corta para el desarrollador de Java es una ventaja.

La combinación sensata de enfoques cabría también. Proporcione el enlace para la aplicación "Hello World", implementado en función del marco que sugiera. Estoy considerando Apache Wicket/Echo2/Tapestry/Click/GWT, pero es difícil hacer una elección sin jugar durante un par de meses (con suerte sin una profunda decepción).

+0

La frase "Cuál sería su elección de Web Framework" garantiza que esta pregunta se cerrará. – skaffman

+0

@skaffman solo por curiosidad, ¿por qué esa frase lo hace inadecuado para el foro? Pensé que sería interesante escuchar los puntos de vista de los desarrolladores que utilizan otros marcos. Uso Vaadin y no tengo experiencia con otros frameworks y realmente me gustaría leer opiniones sobre alternativas. – AndroidHustle

+2

@AndroidHustle: http://stackoverflow.com/faq#dontask – skaffman

Respuesta

3

Estoy completamente de acuerdo con todos sus contras mencionados y no puedo decir mucho en contra. Como soy bastante nuevo en GWT, solo puedo compartir mi pequeña experiencia que he recopilado durante los últimos 2 meses.

  • Separación de presentación con los manipuladores de evento/acción.

creo UiBinder con @UiHandler anotación ("closeButton") @UiField en GWT 2.0 y posterior es exactamente para el código de formulario HTML separación y manipuladores. También el patrón de MVP con el bus de eventos es la respuesta perfecta del equipo de GWT.

  • curva de aprendizaje corta para desarrolladores de Java es un plus.

no soy ingenuo y no creo que es posible obtener un resultado de calidad sólo con el conocimiento de Java sin comprender las tecnologías web.

La mayoría de los marcos de IU de GWT que he revisado y leído, presentan más problemas que soluciones. De alguna manera se las arreglan para obtener uno o pocos beneficios y lo limitan de otras funciones que vienen en las nuevas versiones de GWT. He elegido no usar vaadin porque me dio la sensación de que me obligaría a hacer el desarrollo de la aplicación de la web en su camino, lo que acepto es fácil de entender, pero de alguna manera limitado. Me gusta tener un poco de libertad eligiendo el GWT clásico sin controles sofisticados.

También creo que los componentes de la interfaz de usuario de GWT son limitados y no hay alternativas de calidad. Algo está mal aquí. Creo que el equipo de google tiene que hacer algo en esta parte.

Saludos RemisB

+0

+1 de opinión. ¿Cuánto tiempo le tomará implementar la pieza de interfaz que mencioné en GWT? –

3

Usted puede utilizar una tabla Vaadin para resolver el problema original, más o menos así. El truco es crear un Vaadin Container y poner componentes en él, como datos. Del lado del texto, ajuste una etiqueta en VerticalLayout y luego agregue un oyente de clic. Esto proporciona la capacidad de mostrar "párrafos" de texto XHTML, detectar clics en ellos con ubicaciones relativas y aún así poder manejar una gran cantidad de párrafos.

Puede que necesite modificar su styles.css para permitir el ajuste del texto dentro de una fila de la tabla, por lo que obtendrá filas desordenadas.

package com.soletta.clickytable; 

import com.vaadin.Application; 
import com.vaadin.data.util.IndexedContainer; 
import com.vaadin.event.LayoutEvents.LayoutClickEvent; 
import com.vaadin.event.LayoutEvents.LayoutClickListener; 
import com.vaadin.terminal.Sizeable; 
import com.vaadin.terminal.gwt.server.WebApplicationContext; 
import com.vaadin.ui.Button; 
import com.vaadin.ui.Label; 
import com.vaadin.ui.Table; 
import com.vaadin.ui.VerticalLayout; 
import com.vaadin.ui.Window; 
import com.vaadin.ui.Window.CloseEvent; 
import com.vaadin.ui.Window.CloseListener; 

public class ClickytableApplication extends Application { 
    @Override 
    public void init() { 
     Window mainWindow = new Window("Clickytable 2 Application"); 
     setMainWindow(mainWindow); 
     mainWindow.addListener(new CloseListener(){ 
      public void windowClose(CloseEvent e) { 
       WebApplicationContext context = (WebApplicationContext) getContext(); 
       context.getHttpSession().invalidate(); 
       close(); 
      }}); 

     IndexedContainer container = new IndexedContainer(); 
     container.addContainerProperty("text", VerticalLayout.class, new VerticalLayout()); 
     container.addContainerProperty("edit", Button.class, new Button("Edit")); 

     for (int i = 0; i < 10; i++) { 
      final int index = i; 
      Object item = container.addItem(); 
      Label lbl = new Label("Text Content " + i); 
      VerticalLayout vl = new VerticalLayout(); 
      vl.setWidth(100, Sizeable.UNITS_PERCENTAGE); 
      vl.addComponent(lbl); 
      vl.addListener(new LayoutClickListener() { 
       public void layoutClick(LayoutClickEvent event) { 
        System.out.println(String.format("Clicked on text %,d at client(%,d,%,d), relative(%,d %,d)\n", index, event.getClientX(), event.getClientY(), event.getRelativeX(), event.getRelativeY())); 
       } 
      }); 

      container.getItem(item).getItemProperty("text").setValue(vl); 
      container.getItem(item).getItemProperty("edit").setValue(new Button("Button " + i)); 
     } 

     Table table = new Table("ClickyTable 2", container); 
     table.setColumnExpandRatio("text", 1); 
       table.setColumnExpandRatio("edit", 0); 
     table.setSizeFull(); 

     VerticalLayout fl = new VerticalLayout(); 
     fl.setSizeFull(); 
     fl.addComponent(table); 

     mainWindow.setContent(fl); 
    } 
} 

Con algunos cambios de estilo en su lugar, el resultado puede ser algo como esto:

ClickTable Screen Shot http://www.soletta.com/images/ClickyTable.PNG

+0

Gracias por tu comentario. ¿Puedo pedirle que cambie la cantidad de componentes de 10 a 700 (en 'for'-loop y también el número o filas visibles en la tabla)? ¿Table wok si cargué 3Mb de datos XHTML (divididos en párrafos, 1 párrafo por línea)? Esto es lo mínimo que necesito. Tal vez también puede recomendar cómo implementar la interfaz de usuario de captura de pantalla? Si no es posible con Vaadin, entonces ... –

+0

He modificado para 700 elementos - sin diferencia de velocidad. Inserté varios párrafos de texto en lugar de una simple etiqueta, y la velocidad sigue siendo buena. Necesitas hacer un poco de CSS personalizado: básicamente debes anular el "espacio en blanco: normal" y eliminar el desbordamiento: hidden, en varios lugares. Vaadin hace todo el paginado automáticamente, internamente. –

+0

Gracias por una buena idea. +1 por esfuerzos. La dificultad es que tengo varios enlaces por párrafo, que deberían ser grandes (digamos 10), en general es "enlace de texto de enlace de texto": 20 fragmentos en total. En este caso, necesito 'HorizontalLayout' que está lleno de ... VerticalLayout + Label para cada fragmento. ¿Estoy en lo cierto? Si es así, me puedo imaginar cuál será el tamaño de HTML. Por otro lado, puedo tratar de usar ['ClickableCustomLayout'] (http://vaadin.com/directory#addon/clickable-custom-layout) en cada fila; eso es peor. –

1

Si alguna vez se encuentra poniendo cientos de componentes en la página web en la Vaadin, probablemente debería reconsiderar la estructura de tu aplicación ¿Por qué no implementar un widget personalizado para la parte de la interfaz de usuario que requiere una gran cantidad de widgets? Es solo GWT y por lo tanto bastante fácil. Entonces puede tener lo mejor de ambos mundos: la simplicidad de Vaadin con control total de HTML5 en el lado del cliente.

+0

** Joonas **, gracias por los comentarios. También gracias por su ayuda en el foro de Vaadin. Volver a considerar la IU es sencillo. Considere el siguiente ejemplo: me gustaría mostrar la página HTML con muchos enlaces, y al hacer clic en el vínculo, me gustaría mostrar la ventana emergente con el mensaje "Se hizo clic en el enlace ". ¿Cómo implementarías esto? Tal vez llegaría a la misma solución implementada en ['ClickableCustomLayout'] (https://vaadin.com/directory#addon/clickable-custom-layout). Sin embargo, algo no se escala bien y causa el tiempo de espera de JS. Por cierto, ¿cómo recomendarías implementar la interfaz de usuario en la captura de pantalla? –

+0

Aunque estoy de acuerdo con esto, el problema realmente depende de su situación. Actualmente me encuentro creando una tabla con 'solo' 160 filas, pero 52 columnas, mi conjunto de datos genera alrededor de 1600 botones en esta tabla. Esto no es fácil de optimizar.En primer lugar, debe aprender una nueva tecnología (GWT) en segundo lugar, ¿cómo puedo hacer una tabla "mejor" que la del gurú central de Vaadin? Noté rarezas. cuando me desplazo hacia arriba/abajo. Y copia de seguridad. Vaadin parece volver a cargar los mismos datos y no se almacena en caché en el navegador. De todos modos, Joonas, tu ayuda en los foros y aquí está genial, como siempre! –

Cuestiones relacionadas