2012-03-28 10 views
5

Quiero obtener debajo de la salida.Better Html Builder en java

<html> 
<head> 
</head> 
<body> 
<table> 
<tbody> 
<thead> 
Blah Blah table Header--Constant Part 
</thead> 
<tr> 
some text-constant part 
</tr> 
<!---Main Customization Part--> 
for(i=0;i<some value;i++) 
{ 
<tr> 
    for(j=0;j<another value;j++) 
    { 
     if(some condition) 
     { 
      <td class=another varibale>some text</td> 
     } 
     else 
     { 
      <td class=yet another varibale>some text</td> 
     } 
    } 
</tr> 
} 
</body> 
</html> 

Como puede ver es una mezcla de html y generará el resto de la lógica java. Ahora aquí está mi pregunta: ¿cómo puedo implementar en java independiente (es decir, no jsp). Sé que puedo escribir esto en un archivo normal. Pero de alguna manera siento que es una solución fea. ¿Hay alguna manera de hacerlo en algún mejor manera? Básicamente estoy buscando un buen constructor de HTML para Java. Ya marcado-Freemarker. También estoy abierto a implementar en cualquier idioma, ya que Java es mi idioma favorito, por lo que lo prefiero.

+0

¿Has echado un vistazo a "gagawa"? http://code.google.com/p/gagawa/ –

+0

Puedes usar un motor de plantillas simple. Verifique esta entrada: http://stackoverflow.com/questions/3793880/lightweight-template-engine-in-java – mdakin

+0

* "Quiero obtener debajo de la salida". * Esa salida está mal formada. Verifíquelo usando un [servicio de validación] (http://validator.w3.org/). –

Respuesta

15

Gagawa "permite a los desarrolladores crear de manera fácil y dinámica HTML bien formado en aplicaciones web o no web".

Requiere el uso de una jarra y el código fuente está disponible libremente para leer detenidamente.

Un ejemplo ...

Div div = new Div(); 
div.setId("mydiv").setCSSClass("myclass"); 

A link = new A(); 
link.setHref("http://www.example.com").setTarget("_blank"); 

div.appendChild(link); 

Img image = new Img("some alt", "some-image.png"); 
image.setCSSClass("frame").setId("myimageid"); 
link.appendChild(image); 

System.out.print(div.write()); 

Esto produce el siguiente código HTML:

<div id="mydiv" class="myclass"> 
    <a href="http://www.example.com" target="_blank"> 
    <img alt="some alt" src="some-image.png" class="frame" id="myimageid"> 
    </a> 
</div> 
+0

Solución perfecta en este caso.thnx – Monojit

5

Si desea seguir con Java puro, se puede usar plantillas.

Por ejemplo:

... constant html ... 
</tr> 
{variablePart} 
</tr> 
... constant html ... 

Guardar en algún lugar (por ejemplo, en un archivo .properties) y cargarlo en un String en su aplicación. Entonces tienen su código de construcción normal ...

StringBuilder builder = new StringBuilder(); 
for(j=0;j<another value;j++) 
{ 
    if(some condition) 
    { 
     builder.append("<td class=another varibale>some text</td>"); 
    } 
    else 
    { 
     builder.append("<td class=yet another varibale>some text</td>"); 
    } 
} 

Y, finalmente, obtener su código HTML:

String finalHTML = templateHTML.replace("{variablePart}", builder.toString()); 

Puede que no sea perfecto, pero es un poco mejor que lo que tienes.

+0

Es un mejor enfoque. Todavía estoy explorando. ¡Gracias! – Monojit

2

Lo más probable es que lo que quiere es templating engine. Existen muchos pero los dos grandes son Freemarker y Apache Velocity. Ambos están felices en una aplicación independiente. Mencionaste Freemarker en tu publicación, pero parece que la has rechazado. ¿Puedo preguntar por qué?

Si no está buscando un motor de plantillas, podría compilar el DOM en código tal vez usando javax.swing.text.Document y javax.swing.text.html.HTMLEditorKit, pero le recomiendo que no lo haga.

+0

umm.Supongo que aprenderá la curva ...;). Explorará gagawa ahora.puede comprobar la velocidad más tarde. – Monojit

+0

Es (IMO) una curva de aprendizaje valiosa. Manejar estas cosas en el código rápidamente puede ponerse feo. –

0

rythm es un alto rendimiento (de 2 a 3 veces más rápido que la velocidad) plantilla de Java puro que utilizar Razor como sintaxis:

@args String who 
<p> 
@if ("world".equals(who)) { 
    hello @who 
} else { 
    bye @who 
} 
</p> 

Admite la plantilla de diseño definida por el usuario, la etiqueta definida por el usuario y mucho más. Consulte la demostración completa de características en http://play-rythm-demo.appspot.com/

1

Chunk es mi motor de plantillas de código abierto gratuito para Java. Chunk es como Freemarker o Velocity, pero con una sintaxis más intuitiva.

de Chunk encajable "bucle" y "si" etiquetas hacen este tipo de cosas muy fácil:

my_template.chtml (lugar en la ruta de clase, por ejemplo, en src/themes/my_template.chtml)

<html> 
<head> 
</head> 
<body> 
<table> 
<tbody> 
<thead> 
Blah Blah table Header--Constant Part 
</thead> 
<tr> 
some text-constant part 
</tr> 
{!---Main Customization Part--} 
{% loop in $list as $row %} 
<tr> 
    {% loop in $row as $cell %} 
    {% if ($cell.color == "blue") %} 
     <td class="{$class_a}">{$cell.text}</td> 
    {% else %} 
     <td class="{$class_b}">{$cell.text}</td> 
    {% endif %} 
    {% endloop %} 
</tr> 
{% endloop %} 
</tbody> 
</table> 
</body> 
</html> 
java

de ejemplo para trabajar con esta plantilla:

import com.x5.template.Theme; 
import com.x5.template.Chunk; 

... 

Theme theme = new Theme(); 
Chunk html = theme.makeChunk("my_template"); 

html.set("class_a", "blue_cell"); 
html.set("class_b", "plain_cell"); 

String row1 = "[[color,text],[blue,moe],[red,curly],[orange,larry]]"; 
String row2 = "[[color,text],[red,hat],[black,dog],[blue,bottle]]"; 

String[] list = new String[]{row1,row2}; 

html.set("list", list); 

out = getOutputWriter(); 
html.render(out); // or System.out.print(html.toString()) 

out.flush(); 
out.close(); 

he utilizado tablas en línea (un formato de conveniencia Chunk) para crear datos de bucle de usar, pero se puede utilizar matrices o listas de cualquier objeto t hat implementa com.x5.util.DataCapsule y Chunk copiará los datos directamente de sus objetos antes de representar la plantilla.

de salida final:

<html> 
<head> 
</head> 
<body> 
<table> 
<tbody> 
<thead> 
Blah Blah table Header--Constant Part 
</thead> 
<tr> 
some text-constant part 
</tr> 
<tr> 
     <td class="blue_cell">moe</td> 
     <td class="plain_cell">curly</td> 
     <td class="plain_cell">larry</td> 
</tr> 
<tr> 
     <td class="plain_cell">hat</td> 
     <td class="plain_cell">dog</td> 
     <td class="blue_cell">bottle</td> 
</tr> 
</tbody> 
</table> 
</body> 
</html> 
0

Es necesario también gestionar las acciones, Css set en el código de Java es difícil de probar y cambiar, por qué no usar wicket.apache.org?