個人的に、成長し続けてくれたらNetBeansのうりの機能になると思ってたVisual JSFですが、一緒にバンドルされてたWoodstockコンポーネントの開発終了に伴い、残念な結果に終わってしまいました。
個人的な楽しみとしても、仕事としても使っていたためorzって感じでした。
Woodstockの代替として、ICE Facesというものを使うことが推奨されているっぽいです。
ICE FacesのWebサイトに行ってみると、「ICEfaces 1.8.0 Project Integration plugin for NetBeans 6.7 Beta」という文字が!?
つい先日でたNetBeans 6.7 Betaで使えるようになっているとな。素晴らしい。
ということで、軽く使ってみた。
Visual JSFとICE Facesのインストール
ICE FacesのNetBeansプラグインを使うためには、Visual JSFのプラグインが必要になります。(追記:もうちょい後で判明しますが、このVisual JSFのインストールは必須じゃありませんorz)
これは、デフォルトでは入っていないため、ツールのプラグインからVisual JSFとVisual JSF Runtimeをインストールします。
次に、ICE Facesのサイトから、ICEfaces-1.8.0-NetBeans-6.7beta-modules.zipをダウンロードして任意のフォルダに展開します。(ダウンロードにはユーザ登録が必要です)
展開した中にある以下の2つのnbmファイルを、NetBeansのツールのプラグインのダウンロード済みからインストールします。
- org-icefaces-netbeans-modules-lib.nbm
- org-icefaces-netbeans-modules-web-frameworks.nbm
以上でインストールは完了です。
こんにちは世界!
インストールが終わったので早速使ってみます。
使ってみることが目的なので、プログラミングという素晴らしい世界へようこそ!という意味が込められているであろうHello worldを作成します。
まず、新規プロジェクト
Java WebのWeb アプリケーションを選択
icehelloという名前にする
サーバーには、一番無難そうなGlassFish2を選択する
そして…ICEfacesを選択します
ここで気づいてしまいました。こいつVisualじゃね~!
RADな環境を期待していたのに、この手順で作成すると…
普通のエディタが表示されてしまいます。
リリースノートを詳しく見ていると、こんな記述がありました。
Visual Web ICEfaces module (Visual Web Project with Design Time and Run Time Support) is separated to a stand alone module, due to release at a later date. See ICE-4433 for more details
どうも、Visualなのは別モジュールとして独立して後でリリースすることになるから待っててねということなのだろうか。
本当にやりながらBlogを書いているのでこんなことになってしまいました。
でも、このまま突っ走ります!!
RADじゃなくても、プログラミングが素晴らしいことには変わりない!こんにちは世界!
ということで、気を取り直して作成していきます。
jspxの作成
デフォルトで、welcomeJSF.jspxというファイルが作られていますが、名前が好みじゃないので消して、新規にファイルを作っていきます。
Webページの右クリックメニューから、新規のその他を選択します。
カテゴリJavaServer FacesのJSF JSPページを選択します。
JSP ファイル名をhelloworldにして、オプションで「JSP ドキュメント(XML構文)」を選択します。(重要)
管理ビーンの作成
次に、上で作成したJSPに対応する管理ビーンを作成します。
まず、ソースパッケージにicehelloというパッケージを作成します。
そして、icehelloパッケージに新規作成からJSF 管理対象 Beanを選択します。
クラス名をHelloWorldBeanにします。その際、スコープがrequestであることも確認してください。
そうすると、以下のようなクラスが作成されます。(コメントは消しています)
package icehello;
public class HelloWorldBean {
public HelloWorldBean() {
}
}
ついでに、faces-config.xmlにも定義が追加されています。
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
<managed-bean>
<managed-bean-name>HelloWorldBean</managed-bean-name>
<managed-bean-class>icehello.HelloWorldBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
</faces-config>
HelloWorldBeanの作成
このまま引き続きHelloWorldBeanを作っていきます。
HelloWorldBeanは、入力値を表すString型のプロパティと、出力の値を表すString型のプロパティを持ち、ボタンのアクションに対応するメソッドを持ちます。
ボタンのアクションに対応するメソッドが実行されると「こんにちは、入力値さん。プログラミングの素晴らしい世界へようこそ!」という内容を出力を表すプロパティにセットするものとします。
因みに、各々の英名は以下のようにします。
- 入力値:inputValue
- 出力値:outputValue
- ボタンのアクション:greet
まず、inputValueとoutputValueを作成します。
HelloWorldBeanのprivateフィールドとしてinputValueとoutputValueを定義します。
public class HelloWorldBean {
// 入力値
private String inputValue;
// 出力値
private String outputValue;
public HelloWorldBean() {
}
}
定義したら、コンストラクタの1行下あたりにカーソルを持ってきてAlt + Insertを押して「取得メソッドおよび設定メソッド」を選択します。
そうすると、チェックボックスのある画面が出てくるのでinputValueとoutputValueにチェックを入れて生成ボタンを押します。
これで、getter/setterが作成されます。
次に、greetメソッドを作成します。
JSFのアクションに関連付けるメソッドは、戻り値がString型で、引数が無いものになります。ここの説明はたいしたことが無いので、コードだけ載せておきます。
public String greet() {
outputValue = "こんにちは、" + inputValue + "さん。プログラミングの世界へようこそ!";
return null;
}
以上で、HelloWorldBeanの実装を終わります。
わき道:単体テストもしてみよう
ちょっとわき道にそれますが、HelloWorldBeanの単体テストもしてみます。
HelloWorldBeanクラスでCtrl + Shift + Uをおすと、自動的にJUnitのテストの雛形を作成してくれます。
JUnit4を選んだ次の画面で、デフォルトのまま了解を押します。
そうすると、getter/setterも含めたテストが作成されるので、greetのテストメソッドのみになるように整理します。
package icehello;
import org.junit.Test;
import static org.junit.Assert.*;
public class HelloWorldBeanTest {
@Test
public void testGreet() {
System.out.println("greet");
HelloWorldBean instance = new HelloWorldBean();
String expResult = "";
String result = instance.greet();
assertEquals(expResult, result);
// TODO review the generated test code and remove the default call to fail.
fail("The test case is a prototype.");
}
}
一応この時点でCtrl+F6を押して実行して、テストが赤になることを確認しておくと確実です。
次に、テストの中身を作ります。単純なのでさくっと。
HelloWorldBean instance = new HelloWorldBean();
instance.setInputValue("田中");
assertNull("greetでは画面遷移しないのでnullが返る", instance.greet());
assertEquals("greet呼出し後にoutputValueの値が更新されている",
"こんにちは、田中さん。プログラミングの世界へようこそ!",
instance.getOutputValue());
Ctrl + F6を押すとテストが実行されて青になるはずです。
ちょっと脱線ですが、UnitTestの方法でした。
画面の作成
helloworld.jspxを仕上げていきます。
titleをHello worldにします。
そして、bodyタグの中身を消して、パレットにあるFormをbodyタグの中にぽとっと落とします。
パレットのFormをつまんで

bodyタグの中にぽとっと落とす
そうすると、rootタグにice名前空間が追加されて、ice:formタグがbodyタグ内に作成されます。この時点で、helloworld.jspxは以下のようになります。
<jsp:root xmlns:ice="http://www.icesoft.com/icefaces/component" version="2.1" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
<jsp:directive.page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"/>
<f:view>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Hello world</title>
</head>
<body>
<ice:form>
</ice:form>
</body>
</html>
</f:view>
</jsp:root>
同じ要領で、ice:formタグの中にInputTextと、CommandButtonと、OutputTextを置いていきます。若干インデントが崩れるので、Alt + Shift + Fでインデントを整えておきます。
次に、以下のようにバインドをしていきます。
- InputTextの値: HelloWorldBeanのinputValueプロパティ
- CommandButtonのアクション: HelloWorldBeanのgreetメソッド
- OutputTextの値: HelloWorldBeanのoutputValueプロパティ
バインドは、EL式で書けるうえに補完がきくので素敵です。
JSFの管理ビーンの補完
管理ビーンのメソッドやプロパティの補完
EL式の設定が終わった後のhelloworld.jspxは以下のようになります。
(バインド以外に、ボタンに表示される値も設定しています)
<ice:form>
<ice:inputText value="#{HelloWorldBean.inputValue}">
</ice:inputText>
<ice:commandButton value="挨拶ボタン" action="#{HelloWorldBean.greet}">
</ice:commandButton>
<ice:outputText value="#{HelloWorldBean.outputValue}">
</ice:outputText>
</ice:form>
以上で完成です。
実行してみよう
最後に実行してみます。
実行前にicehelloプロジェクトのプロパティの実行から
相対 URLを空にします。
web.xmlのソースタブの開始ファイルをhelloworld.jspxにします。
そして、F6を押して実行すると…
ボタンのある画面が表示されます。
テキストフィールドに適当な名前を入れて挨拶ボタンを押すとメッセージが表示されます。
もちろん、画面のちらつきはありません。AJAXですから。
以上!