サーバの障害等で出るのが送れてたNetBeans6.0.1の日本語版がやっとこさでました。
今まで別で配布されていた、Visual Web PackがNetBeans6から統合されてきたのでガンガン使えたら使っていこうと思います。
でも、結構くせのあるコイツと仲良くやっていくにはどうやるのがいいだろう?
皆はどうやってるんだろう?という疑問を解決するために、小さなサンプルをこさえてみました。
というわけで作るものは、ボタンを押すと表になんかデータが表示されて、表の各行にあるボタンを押すと別画面に遷移してから選択した行のデータが表示されてるっていうものにしました。
早速プロジェクトを作成。SampleWebって名前でルートパッケージはcom.wankuma.kazukiです。
もちろんVisual JavaServer FacesはONにしてね。
新規作成直後の画面は下のような感じ。

とりあえず、個人的に最初にすることはSessionBean1とApplicationBean1とRequestBean1をさくっと消す。
Page1でエラーが出るけど気にしないでPage1もさくっと消す。
気を取り直して 新しいページフラグメントを作成する。名前はHeader.jspf。
幅100%で高さ48pxくらいに設定しておこう。StaticTextも置いてタイトルを格好良く作る。
ヘッダができたし、Index.jspという名前でページを作る。
ページには、さっき作ったページフラグメントを上部に設置。
ボタンと表も置いていって適当な画面をでっちあげる。
この画面に適当なデータを表示してみようと思う。
とりあえず、nameとageを持つPersonクラスを作成!
package com.wankuma.kazuki;
public class Person {
private int age;
private String name;
// ここでalt + insert
}
コメントにあるように、alt + insertを押すと下みたいなものがぽろっと出てくる。
矢印キーで取得メソッドおよび設定メソッドを選択するとgetter/setterの生成が可能。
チェックを入れて生成を押すとさくさくっと出来上がり。
ここらへんお手軽になりました。
次にDataProviderを作ります。ObjectListDataProviderっていうとても使えそうなやつがいるんだけど、画面にぽとっと落としても肝心のObjectTypeプロパティが設定できない。
いつも自分でObjectListDataProviderを継承して、各型向けのDataProviderをこしらえてます。
package com.wankuma.kazuki;
import com.sun.data.provider.impl.ObjectListDataProvider;
import java.util.List;
public class PersonDataProvider extends ObjectListDataProvider {
public PersonDataProvider(List list) {
this();
setList(list);
}
public PersonDataProvider() {
setObjectType(Person.class);
}
}
これを画面のプロパティとして追加します。
Index.javaの適当な位置に下の内容を追加。
private PersonDataProvider personDataProvider;
public PersonDataProvider getPersonDataProvider() {
return personDataProvider;
}
public void setPersonDataProvider(PersonDataProvider personDataProvider) {
this.personDataProvider = personDataProvider;
}
そしてデザイナに戻るも、さっき追加したプロパティがナビゲータウィンドウに出てこない…。
このバグFIXされたって聞いたんだけどなぁ。おかしい。なおって無い。
デザイナを閉じて開きなおしたら表示された。前はプロジェクトをクリーンビルドしプロジェクト自体を閉じて開きなおさないといけなかったことを考えると大きな進歩かも。
気を取り直して表にpersonDataProviderを関連付ける。
nameとageを表示する列は自動ででるので、ボタン用の列を先頭に追加する。
Index.jspのデザイナ画面に置いてあるはずのヘッダ用のページフラグメントが表示されてない…
ここらへんもあやしい。
ナビゲータウィンドウを見てみる限り、デザイナ上で表示されてないだけでちゃんとあるっぽいから気にしないでおこう。
次は、検索ボタンをクリックしたときの処理。
本当なら、ここからロジックを受け持つクラスを呼び出す形になるはずだけど、今回は適当なデータをListに突っ込んでDataProviderにセットすることにする。
public String button1_action() {
List<Person> people = new ArrayList<Person>();
for (int i = 0; i < 10; i++) {
Person p = new Person();
p.setName("太郎" + i);
p.setAge(i);
people.add(p);
}
personDataProvider = new PersonDataProvider(people);
return null;
}
ここまで出来たら確認のために実行!
404エラーorz
そうだ、Index.jspを開始ページにするのを忘れてた。気を取り直して実行。
実行してボタンを押すと
データが表示される
表にあるexecボタンを押すと
悲しいかなデータが消えちゃう。
これは意図した動作なので気にしない。DataProviderはJSFのコンポーネントじゃないのでリクエストを跨ぐと消えてしまう。
ということで自前でどうにかしてとっとかないといけない。
色々考えた結果、destroyでデータをsessionに入れてinitでsessionからデータを取得するようにした。
@Override
public void init() {
...(略)...
// sessionからデータを取得
personDataProvider = (PersonDataProvider) getValue("#{sessionScope.personDataProvider}");
}
@Override
public void destroy() {
// sessionにデータを設定
setValue("#{sessionScope.personDataProvider}", personDataProvider);
}
これでリクエストを跨いでも表にデータが表示されるようになる。
次に、遷移先画面を作っていく。View.jspという名前で作ってHeader.jspfを置いてGridPanelを置いてcolumnsを2にしてStaticTextを4つ置く。
それらしくプロパティを設定して下のような画面を作る。
View.javaの方に移ってPerson型のプロパティpersonを作る。
private Person person;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
このPersonプロパティのnameとageをさっき画面に置いたStaticTextにバインドする。
この画面に表示するPersonオブジェクトは、Index.jspから貰う手はずになってる。(Index.jspのほうにはそういうコード書いて無いけど)
ということで、initにリクエストからPersonオブジェクトを取得するようなコードを書いた。
@Override
public void init() {
...(略)...
this.person = (Person) getValue("#{requestScope.person}");
}
ここまで出来たらあと少し。ページナビゲーションでIndexからViewへの遷移を定義する。
Indexの表に置いたボタンのアクションイベントで、リクエストにPersonオブジェクトをつめるだけだ。
public String button2_action() {
RowKey rowKey = (RowKey) getValue("#{currentRow.tableRow}");
setValue("#{requestScope.person}", personDataProvider.getObject(rowKey));
// 画面遷移する前にゴミ掃除
personDataProvider = null;
return "case1";
}
これで実行!!
検索ボタン押して…
適当な行のexecボタンを押すと…
お~ちゃんと出た~。
作りながら記事書いてたから結構内容ぐちゃぐちゃになってしまった。