GlassFishで試したら駄目だったので、Tomcat6で試してみた。
こっちはすんなり起動してHello worldが動いた。
ということで、とりあえずTomcat6で試してみようと思う。
NetBeansでWebアプリ開発となると、Visual Web Packでの開発になると思う…。
今まで重かったり、固まったり、デザイナとファイルの同期が取れずにファイルが壊れたりしたこともあったけど、今回微妙に変わったみたい。
まずは、新規作成。Visual Web Packを選択する。(Spring MVCも気になるけど…)
デザイナが立ち上がる。
StaticTextとButtonを置いてボタンを押したらHello worldが出るようなものを作ろうと思う。
ButtonとStaticTextを置いてみた。結構サクサク動いてる気がする…。
JavaとJSPのコードを見てみると、今までと違う部分があることがわかる。今までは、JSPのButtonやStaticTextのタグにbinding属性が追加されてて、Javaのコードに自動生成されるコンポーネントに対してバインディングされてた。
これで、Javaのコードからコンポーネントに対して色々操作が出来たけど…
表コンポーネントみたいな複雑なコンポーネント(1つのコンポーネントが色々なコンポーネントを含んでるようなケース)だと、コンポーネントを1つ置くだけで数十行のJavaのコードがぼこっと出力される。
Panelと組み合わせたり何だかんだしてると、自動生成だけであっという間に数千行になって、デザイナとJavaのコードの行き来にすごい時間がかかるようになってた。
今回の6.1でそこらへんが改善?されたみたい。
ということで長くなったけど、JSPのコードにbinding属性が無い!Javaのコードにも対応するプロパティ(getter/setter + field)が作られてない!?
これで何個コンポーネント置いてもJavaのコードが超巨大になることはない!!
というわけでデザイナ上のボタンをダブルクリックしてイベントハンドラにコードを書いていこう!
自動生成されるハンドラは下のような感じになる。
public String button1_action() {
// TODO: Process the action. Return value is a navigation
// case name where null will return to the same page.
return null;
}
StaticTextにHello worldを表示するコードが…かけないじゃん。
StaticTextに対応するコードが生成されてませんから。
ということでどうやるのかと言うと、やり方は2パターンある。
- デザイナ上でStaticTextを選択してAdd Binding Attributeを選択してJavaのコードにStaticTextのプロパティを生成させる。
- Javaのコード側に、String型のプロパティを1つ追加して、それとStaticTextのvalueプロパティをバインドさせる。
好みとしては、2番目が好きなのでそちらでしてみることに。
とりあえず、下のようなコードを書いてAlt + Insertを押すとgetter/setterの自動生成が出来る。
private String greetMessage;
greetMessageにチェックを入れてgenerateボタンをクリック
そうすると、下のような感じでgetterとsetterが生成される。
private String greetMessage;
public String getGreetMessage() {
return greetMessage;
}
public void setGreetMessage(String greetMessage) {
this.greetMessage = greetMessage;
}
ここら辺は、6.0からだけどEclipse並になってくれた。以前はフィールドのカプセル化っていうリファクタリングを使えば出来たけど非常に遅かった。
デザイナ側に戻って、StaticTextで右クリックメニューからProperty Bindings...を選ぶ。
StaticTextのtextと、さっき作ったgreetMessageプロパティを選んでApplyをクリックする。
StaticTextの表示がabcになってプロパティウィンドウにはEL式が設定される。
これでgreetMessageとStaticTextのtextプロパティが関連付けれた。
JSP側を見ると、きちんとEL式が指定されているのがわかる。
<webuijsf:form id="form1">
<webuijsf:staticText id="staticText1" style="position: absolute; left: 24px; top: 24px" text="#{Page1.greetMessage}"/>
<webuijsf:button actionExpression="#{Page1.button1_action}" id="button1" style="position: absolute; left: 24px; top: 48px" text="Button"/>
</webuijsf:form>
下準備が出来たので、ボタンのクリックイベントでHello worldをgreetMessageに設定するコードを書く。
public String button1_action() {
greetMessage = "Hello world";
return null;
}
これで多分完成なので、実行をしてみる。F6を押して実行!
うおっ…IE7でボタンが横広になるのまだなおってないのか…
気を取り直してボタンを押してみた。
Hello worldが表示された!

めでたしめでたい。
因みに、ボタンが横に広がる問題は明示的に横幅を指定してやるか、Panelの上にボタンを置くことで解決できる。
まぁバットノウハウ。
下は、パネルの上にボタンを置いた様子。きちんと表示されてる。
