2012-03-28 11 views
5

私は以下の出力を得たいです。JavaのBetter Html Builder

<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> 

このように、htmlの混合を見ると、残りはJavaロジックから生成されます。 ここで私の質問です - スタンドアロンJava(つまりjspではない)でどのように実装できますか?私はこれを普通のファイルに書き込むことができます。何とか私はそれを醜い解決策と感じています。より良い方法ですか? 基本的に私はJava用の優れたHTMLビルダーを探しています。 既にチェックされているFreemarkerです。 また、私は任意の言語で実装するためにオープンしています。javaは私の好きな言語なので、私はそれを好みます。

+0

「ガガワ」をチェックしましたか? http://code.google.com/p/gagawa/ –

+0

シンプルなテンプレートエンジンを使用できます。このエントリを確認してください:http://stackoverflow.com/questions/3793880/lightweight-template-engine-in-java – mdakin

+0

* "出力を下回りたいです。" *出力が不正です。 [検証サービス](http://validator.w3.org/)を使用してチェックします。 –

答えて

15

Gagawa "開発者は、Webアプリケーションや非Webアプリケーションで整形式HTMLを簡単かつ動的に構築できます。

これは1つのjarファイルを使用する必要があり、ソースコードは自由に閲覧できます。

例...

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

これは、次のHTMLを生成します。

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

<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

このケースでは完璧なソリューションです.thnx – Monojit

2

velocityテンプレートをapacheから使用することができます。 速度はあなたが純粋なJavaに固執する場合は、テンプレートを使用することができますWebまたはアプリケーションサーバー

How Velocity Works

User guide

5

内で実行する必要はありません。例えば

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

.propertiesファイルで、例えば)どこかに保存して、あなたのアプリケーションでStringでそれをロードします。 はその後...

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

を定期的な建物のコードを持っており、最終的にあなたのHTMLを取得:

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

それは完璧ではないかもしれないが、それはあなたが持っているものよりも少し優れています。

+0

それはより良いアプローチです。私はまだ探検しています。ありがとうございます! – Monojit

2

ほとんどの場合、希望するのはtemplating engineです。多くは存在しますが、2人の大男はFreemarkerApache Velocityです。どちらもスタンドアローンアプリケーションで満足しています。あなたはあなたの投稿にFreemarkerを言いましたが、あなたがそれを拒否したように見えます。なぜ私は尋ねることがありますか?

もしあなたがテンプレートエンジンの後でなければ、おそらくjavax.swing.text.Documentjavax.swing.text.html.HTMLEditorKitを使ってコードをDOMに組み込むことができますが、私はそれに対して推奨します。

+0

umm.私は曲線を覚えていると思っています。;)。gagawaを探検してください。 – Monojit

+0

習得しながら(IMO)価値があります。これらのことをコードで処理すると、すばやく醜くなる可能性があります。 –

0

rythmは、高性能(2〜3倍速い速度より)構文のようなRazorを使用し、純粋なJavaのテンプレートですそれは、ユーザー定義のレイアウトテンプレート、ユーザー定義のタグ、さらに多くをサポートしています。完全な機能デモをチェックアウトhttp://play-rythm-demo.appspot.com/

1

Chunkは、無料のオープンソースのJava用テンプレートエンジンです。チャンクはFreemarkerやVelocityと似ていますが、より直感的な構文です。 (SRC /テーマ/ my_template.chtmlで、クラスパス内の場所、例えば)

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:

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

私はループに優しいデータを作成するために、インラインテーブル(チャンクコンビニエンス形式)を使用していますが、任意のオブジェクトtの配列またはリストを使用することができますhatはcom.x5.util.DataCapsuleを実装し、Chunkはテンプレートをレンダリングする前にデータをオブジェクトから正しくコピーします。

最終的な出力:

<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

あなたがアクションを管理も必要wicket.apache.org使用しないで、なぜ、JavaコードでCSSのセットは、テストし、変更するのは難しいのですか?

関連する問題