2012-03-28 17 views
5

Chcę uzyskać poniżej wydajności.Lepsze konstruktora HTML w 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> 

Jak widać, jest to mieszanka html i wygeneruje resztę z logiki Java. Oto moje pytanie - jak mogę zaimplementować w autonomicznej java (tj. Nie jsp). Wiem, że mogę napisać to do normalnego pliku. Ale jakoś czuję, że to brzydkie rozwiązanie. Czy jest jakiś sposób, aby to zrobić w niektórych ładniejszy sposób? Zasadniczo szukam dobrego konstruktora HTML dla java. Już sprawdzone - Freemarker. Jestem również otwarty na wdrożenie w dowolnym języku, ponieważ java jest moim ulubionym językiem, więc wolę go.

+0

Czy sprawdziłeś "gagawa"? http://code.google.com/p/gagawa/ –

+0

Możesz użyć prostego mechanizmu szablonowego. Sprawdź ten wpis: http://stackoverflow.com/questions/3793880/lightweight-template-engine-in-java – mdakin

+0

* "Chcę uzyskać wyniki poniżej." * To wyjście jest zniekształcone. Sprawdź to za pomocą [usługi walidacji] (http://validator.w3.org/). –

Odpowiedz

15

Gagawa "umożliwia programistom łatwe i dynamiczne tworzenie dobrze sformułowanych kodów HTML w aplikacjach internetowych lub innych niż aplikacje internetowe".

Wymaga użycia jednego słoika, a kod źródłowy jest swobodnie dostępny do przeglądania.

Przykład ...

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()); 

To daje następujący kod 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

Idealne rozwiązanie w tym przypadku.thnx – Monojit

5

Jeśli chcesz trzymać się z czystego Java, można użyć szablonów.

Na przykład:

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

zapisać go gdzieś (powiedzmy, w pliku .properties) i załadować go w String w swojej aplikacji. Następnie mają swój kod regularną budowę ...

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>"); 
    } 
} 

I wreszcie dostać HTML:

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

może nie być idealne, ale to jest trochę lepiej niż to, co masz.

+0

Jest to lepsze podejście. Nadal eksploruję. Dzięki! – Monojit

2

Najprawdopodobniej to, czego potrzebujesz, to templating engine. Wiele istnieje, ale dwóch dużych chłopców to Freemarker i Apache Velocity. Oboje są zadowoleni z samodzielnej aplikacji. Wspomniałeś Freemarkera w swoim poście, ale wygląda na to, że go odrzuciłeś. Czy mogę zapytać, dlaczego?

Jeśli nie jesteś po templating engine można budować DOM w kodzie może przy użyciu javax.swing.text.Document i javax.swing.text.html.HTMLEditorKit, ale polecam przeciwko niemu.

+0

umm.Myślę, że krzywa uczenia się;). Eksplorowanie gagawa teraz może sprawdzić prędkość później. – Monojit

+0

Jest to (IMO) warta poznania krzywa. Obsługa tych rzeczy w kodzie może szybko stać się brzydka. –

0

rythm jest wysokiej jakości (2 do 3 razy szybciej niż prędkość) czystego szablonu Java, które wykorzystują Razor jak składni:

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

Obsługuje zdefiniowany przez użytkownika szablon układu, znacznik zdefiniowany przez użytkownika i wiele więcej. Zamówienie pełnej wersji demonstracyjnej pod adresem http://play-rythm-demo.appspot.com/

1

Chunk to mój darmowy silnik szablonów open-source dla Javy. Chunk jest jak Freemarker lub Velocity, ale z bardziej intuicyjną składnią.

kawałek za gniazdowa "pętla" i "jeśli" tags zrobić tego rodzaju rzeczy bardzo proste:

my_template.chtml (miejsce w ścieżce klasy, na przykład w 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

próbki do pracy z tego szablonu:

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(); 

użyłem wbudowanych tabel (format convenience Chunk), aby utworzyć dane pętli w obsłudze, ale można korzystać z tablic lub list dowolnego obiektu t hat implementuje com.x5.util.DataCapsule and Chunk skopiuje dane bezpośrednio z twoich obiektów przed renderowaniem szablonu.

wyjście końcowa:

<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

Trzeba również zarządzać działań, zestaw CSS w kodzie Java jest trudne do sprawdzenia i zmiany, to dlaczego nie skorzystać wicket.apache.org?