Archive for 11月, 2005

データセンターで­


さて、今日は技術系の話から少し脱線して季節ねたをかきます。
今、仕事の関係でデータセンターに通っているのですが、
データセンターってとても乾いているし空気も循環しているだけ、
おまけに誇りっぽいと、とても風邪菌が繁殖しやすい環境です。
実際、JavaOneが開催する直前もこのデータセンターに通っていて、
大風邪を引いてしまいました。
病院の先生に無理を言って、点滴を打ってもらったのですが、
開催日の前々日まで熱を出しておりました。
やっと風邪が治りって安心していて
今日また行くと少し喉が痛くなりました。
データセンター等に出かける皆様くれぐれも御気をつけてくださいね。
あと、これから、インフルエンザや風邪のはやるシーズンになりますが、
くれぐれも体調には気をつけましょう。

2005年11月28日 at 8:45 AM

Creator2でValidatorの実装


今日は、JSFのバリデータを取り上げます。
まず、「ValidatorTest」という新規プロジェクトを作成して下さい。
そして、今までと同様、ドラッグ&ドロップにてコンポーネントを貼り付けます。
今回は、「Label」コンポーネントを2つ貼り付けて、プロパティを変更します。
ここでは「名前(漢字)」、「名前(カナ)」とします。
次に、「TextField」を2つ貼り付けてください。
そして「Message」コンポーネントを2つ貼り付けてください。
最後にボタンを2つ貼り付けます。
画面作成イメージ

次に、「TextField」コンポーネントと「Message」コンポーネントとの関連付けを
行います。
「Message」コンポーネント上で「Ctrl+Shiftキーを押した状態で
マウスでドラッグ」してください。そして「TextField」上でドロップしてください。
コンポーネントをドラッグした状態でマウスを移動すると「Message」
コンポーネントが青枠で囲まれて、波線が表示されます。
そして「TextField」上でドロップすると「Message summary for textField**」という
文字列が「Message」コンポーネント上に表示されます。
これで、「TextField」コンポーネントと「Message」コンポーネントの関連付けが完了です。

Validatorの設定(標準Validatorの利用)
それでは、実際にValidatorを使用していきます。
まず始めはJSF標準のValidatorを利用します。
今回は、入力された文字列の長さを検証する「LengthValidator」を使用します。
そして5文字以上10文字以内でなければエラーを出力するようにします。
それでは「TextField」コンポーネントのプロパティより「validator」のコンボボックスを
開き「(new LengthValidator)」を選択して下さい。
すると、プロパティの値は「lengthValidator1」に変更されます。

「maxLength」はValidatorの最大値の設定項目ではありません。
入力値の範囲の設定は、「Outline」タブの「lengthValidator1」を選択し
設定します。
「Outline」タブより「lengthValidator1」を押下してください。
すると、「Properties」タブに「maximum」、「minimum」を設定する項目が
表示されます。ここに適切な値(範囲)を設定してください。
今回は、maximum=15,minimum=5を入力します。

この状態で、プログラムを1度ビルドしてデプロイ、実行してみてください。
すると下記のような実行結果が得られます。
以上で、標準Validatorを使用したサンプルができましたが、如何でしょうか?

補足:
標準Validatorのエラーメッセージは、プロパティの値を上書きしていただく事で
メッセージを変更できます。例えば、LengthValidatorの場合、下記のプロパティを
作成して下さい。(詳細はJSFの関連書籍を参考にしてください。)
message.properties
javax.faces.validator.LengthValidator.MAXIMUM=15文字以上入力できません。
javax.faces.validator.LengthValidator.MINIMUM=5文字以上入力してください。
Validatorの設定(独自Validatorの作成)
次に独自のValidatorを作成しましょう。
まず、「TextField」でマウス右クリックをし「Edit Event Handler」から
「validate」を選択してください。

すると下記のコードが自動的に作成されるかと思います。

public void textField2_validate(FacesContext context, UIComponent component, Object value) {
// TODO: Check the value parameter here, and if not valid, do something like this:
// throw new ValidatorException(new FacesMessage(“Not a valid value!”));
}

この部分に独自コードを実装します。例えば半角カナと空白のみ入力を
受け付けるコードは下記のようになります。

public void textField2_validate(FacesContext context, UIComponent component, Object value) {
// TODO: Check the value parameter here, and if not valid, do something like this:
// throw new ValidatorException(new FacesMessage(“Not a valid value!”));
if(value instanceof String){
if(isKatakanaString((String)value) == false){
showErrorMessage(“カタカナを入力してください。”);
}
}else{
showErrorMessage(“不正な値です。”);
}
}
/**
* 引数で与えられた文字列をMessageコンポーネントに表示する。
*
* @param value – エラーメッセージ
*/
private void showErrorMessage(String errorMessage){
FacesMessage message = new FacesMessage(errorMessage);
message.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(message);
}
/**
* 入力された文字がカタカナかを判定する。
*
* @param value – 判定する文字列
* @return true:全角・半角カタカナ・全角空白・空白 false:不正文字列
*/
private boolean isKatakanaString(String value){
logger.debug(“isKatakanaString() started.”);
boolean returnValue = false;
for(int i=0;i<value.length();i++){
char code = value.charAt(i);
//カタカナと全角空白・半角空白ならばOK
/*
if(code >= 0x30a1 && code <= 0x30fe){ //全角カナ
returnValue = true;
}else if(code == 0x3000 ||
*/
if(code == 0x20){ //半角空白・全角空白
returnValue = true;
}else if(code >= 0xff61 && code <= 0xff9f){ //半角カナ
returnValue = true;
}else{
returnValue = false;
return returnValue;
}
}
return returnValue;
}

上記で、showErrorMessage()メソッドは重要ですが、ここで独自のエラーメッセージを
設定し、ValidatorException()を送出しています。
上記のコードの実行結果は下記の通りです。
実行例1

実行例2

補足
独自Validatorは、実際のプロジェクトでは標準Validatorを利用する以上に
よく使われるかと思います。しかし、isKatakanaString()メソッドのように切り分ける事で
JSFに精通していないJavaエンジニアも検証用のコードを記述することが可能になります。
そこでこのValidatorの実装はできるだけ作業分担しましょう。
最後に、今回紹介したValidatorも重要ですが、今後AJAXと併用してリアルタイムで
バリデーションを行う機能や入力補完機能と共に使われることも多くなってくるのでは
ないかと思いますので是非下記もチェックしてみてください。
https://bpcatalog.dev.java.net/nonav/ajax/textfield-jsf/design.html(AJAX Auto-Completion)
https://bpcatalog.dev.java.net/nonav/ajax/validation/design.html(Realtime Valiadtion)
次回は、コンバータかFileUploadを紹介します。

2005年11月24日 at 5:00 PM

NetBeans4.1でSun Java System WS6.1にデプロイ


さて、今日はちょっとしたTipsを御紹介します。
NetBeansで開発をしていてSun Java System Web Server 6.1(AppServer7.x)に
Webアプリケーションをデプロイしたいという方はいないでしょうか?
NetBeans4.1で正式にサポートされているサーバは下記です。
NetBeansサーバプラグインより

  • Java.net GlassFish Java EE 5 server (the Open Source Reference Implementation and production quality for Java EE 5 specification)

  • Sun Java System Application Server 8.1 (A free J2EE 1.4 compliant application server from Sun)

  • JBoss 4

  • WebLogic 9

  • WebSphere 6


私は、過去の案件でWeb Server6.1にデプロイをしたいという状況がありました。
その際、NetBeans4.1ではデフォルトでWS6.1が対応していなかった為、
自分でsun-web.xmlファイルを変更しました。
web/WEB-INFディレクトリ配下にsun-web.xmlファイルがあります。
これを、下記のようにsun-web-app_2_3-0.dtdベースに変更してみてください。
すると、NetBeans4.1でもWebServer6.1上に問題なくデプロイさせ動作させる
ことができます。

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE sun-web-app PUBLIC “-//Sun Microsystems, Inc.//DTD Sun ONE Application Server 7.0 Servlet 2.3//EN” “http://www.sun.com/software/sunone/appserver/dtds/sun-web-app_2_3-0.dtd”>
<sun-web-app>
<context-root>/webapp</context-root>
<class-loader delegate=”true”/>
<jsp-config>
<property name=”classdebuginfo” value=”true”>
<description>Enable debug info compilation in the generated servlet class</description>
</property>
<property name=”mappedfile” value=”true”>
<description>Maintain a one-to-one correspondence between static content and the generated servlet class’ java code</description>
</property>
</jsp-config>
</sun-web-app>

2005年11月23日 at 11:00 PM

Creator2でGoogle WebServiceを実装する


さて、本日は予定を変更してGoogleの検索WebServiceをCreator2で実装します。
作成するWebアプリケーションは、テキストフィールドに入力された検索キーワードを元に
Googleに問い合わせ、検索結果を表示するアプリケーションです。
作成イメージ

まず、実際にGoogleのWebServiceを利用する前に、Google Web APIについて、
簡単に御紹介します。
Google Web APIを使用するとWebアプリケーションの開発者は
自身のサイト上で直接Googleに問い合わせ、世界中のWebサイトを検索できるようになります。
GoogleはSOAPとWSDLを使用しているため、JavaやPerl等を使用して利用が可能です。
Googleが提供しているサービスとして以下があります。

  • 検索

  • キャッシュの取得

  • スペルチェック


Google Web APIに関する詳細は下記を御参照ください。
Google Web APIs (beta)
次に、実際にアプリケーションを構築する前に、事前に準備していただく事が
一つだけあります。
それは、Google上でアカウントを作成していただく事です。
アカウントを取得後、「ライセンスキー」を取得してください。
ライセンスキーを使用すると1ライセンスキー辺り、1日に1000回まで検索することが
可能です。
ライセンスキーを取得するまでの大まかな流れは下記となりますので、
下記に従いライセンスキーを入手してください。

  • Googleへの登録

  • Googleからメールを受信

  • 受信したメールに記述されているURLにアクセス

  • ライセンスキーが記述されたメールを受信


ライセンスキーのサンプルを下記に示します(最後10桁は変更してます)。
kZ7RVhlQFHKFUh/ZN8h7epABCDEFGHIJ
問題なく、ライセンスキーは入手できましたか?
それでは、実際にGoogleの検索Webアプリケーションを作成していきましょう。
まず、今までと同様新規プロジェクトを作成してください。
プロジェクト名として「GoogleSearch」を指定してください。
次に、画面上に表示するコンポーネントをドラッグ&ドロップにて貼り付けてください。
ここでは、検索キーを入力するテキストフィールド「TextField」と、実行ボタン
「Button」、検索結果を表示するテーブル「Table」を貼り付けて下さい。

次に、検索結果を表示する表(テーブル)に対して、データプロバイダを指定します。
ここでは、デフォルトのデータプロバイダに変え、「Object Array Data Provider」を
指定します。
「Palette」タブより「Data Providers」を選択し「Object Array Data Provier」
を表示してください。このプロバイダを画面デザイン上の「Table」へドラッグ&ドロップ
します。

これにより、自動的に「Page1.java」に下記のコードが追加されます。

private ObjectArrayDataProvider objectArrayDataProvider1 = new ObjectArrayDataProvider();
public ObjectArrayDataProvider getObjectArrayDataProvider1() {
return objectArrayDataProvider1;
}
public void setObjectArrayDataProvider1(ObjectArrayDataProvider oadp) {
this.objectArrayDataProvider1 = oadp;
}

次に、WebServiceをプロジェクト上に配置します。
「Servers」タブより、「Web Services」→「Samples」→「GoogleSearch」を
選択してください。そして「GoogleSearch」を画面デザイン上にドラッグ&ドロップ
します。
すると、「Outline」タブ上に「googleSearchClient1」というプロパティが表示されている
事が確認できます。
(本来は上のデータプロバイダの指定の前にこの項目をやったほうがいいのですが、、)

次に、プロパティを追加します。追加するプロパティはGoogleからの検索結果を
格納する為の配列となります。
追加方法は、「Projects」タブの「Page1.java」ファイルを選択し、
マウス右クリックしてください。すると「Property」が表示されますので、
これを選択実行します。

「Property」を選択すると下記の画面が表示されます。
それぞれの項目に値を入力し、「OK」ボタンを押下してください。

プロパティの追加により、「Page1.java」に下記のコードが追加されます。

private webservice.googlesearchservice.ResultElement[] resultElement;
public webservice.googlesearchservice.ResultElement[] getResultElement() {
return this.resultElement;
}
public void setResultElement(webservice.googlesearchservice.ResultElement[] resultElement) {
this.resultElement = resultElement;
}

次に、先ほど作成した「Object Array Data Provider」と「resultElement」を対応させます。
まず、「Outline」タブより「objectArrayDataProvider1」を選択しプロパティ設定画面を
確認します。ここで「array」の要素のコンボボックスを押下すると、「resultElement」が
追加されていることが確認できますので、これを選択します。
これで、「Object Array Data Provider」と「resultElement」の対応付けが完了です。
それでは画面デザインに戻ってください。Tableのデータは今までの操作で
「resultElement」の値を対応付けさせました。
そこで「resultElement」の構成要素から表示項目を選択します。
表示項目の選択は、「Table」よりマウス右クリックにて「Table Layout」を選択します。

次に、項目中よりタイトル(title)・要約(snippet)・URLを選択します。
以上で表示項目の選択は完了です。

以上が終了すると画面デザインは下記のように変更されていることが
確認できます。

最後に、ボタン押下時の処理を記述してください。
画面デザインで、ボタンをダブルクリックしてJavaソースエディタを開いてください。
そして下記のコードを記述してください。
  #下記では便宜上、例外処理等、詳細な実装は抜いています。
  

public String button1_action() {
String searchString = (String)textField1.getText();
try{
GoogleSearchClient sclient = getGoogleSearchClient1();
GoogleSearchResult result = sclient.doGoogleSearch(“kZ7RVhlQFHKFUh/ZN8h7epABCDEFGHIJ”, //Googleライセンスキー
searchString, //検索キーワード
0,
10, //検索結果の最大件数
false,
“lang_ja”,
false,
null,
null,
null);
resultElement = result.getResultElements();
objectArrayDataProvider1.setArray(resultElement);
}catch(Exception e){
return “error”;
}
return null;
}

上記のコードを実装後、ビルド・デプロイして実行してください。
Google検索Webアプリケーションの実行結果、下記の画面が表示されます。

補足:
「Servers」タブで「GoogleSearch」を選択した際に、処理可能な内容(メソッド)が表示されますが、
Creator2上から簡単にテストできます。
「GoogleSearch」より「doGoogleSearch」を選択してください。
ここで、マウス右クリックにて「Test Method」という項目が表示されます。
これを選択してください。

「Test Method」にて表示される画面にて必要項目を入力し「Submit」ボタンを押下します。
すると、「Results」欄に結果が表示されます。

以上で、Creator2を使用したWebサービスの使い方について説明しましたが、如何ですか?
とても簡単にWebサービスを利用できますよね!!
他にもWebサービスに関するサンプルが多くあるので、是非試してみてください。
また、今回は、とりあえずGoogleのWebServiceを使ってみるということが目的だったため、
WSDLの登録や表示項目についての詳細は取り上げませんでした。
(リンクを押下しても画面遷移されない等。)
この辺は、また後日説明します。
次回は、ナビゲーションか、バリデータどちらかを紹介する予定です。

2005年11月21日 at 10:30 PM

James GoslingのT-Shirtsなげコンテストも開始

James GoslingのBlogによると、
来年、サンフランシスコで開催されるJavaOne2006のT-Shirts投げコンテストの方も
スタートし始めたようです。皆様も是非クールなT-Shirts投げ機を考えて、
JavaOneの無料チケットをゲットしていただければと思います。

http://blogs.sun.com/roller/page/jag

2005年11月17日 at 6:50 PM

UIコンポーネントとDBのバインド


さて、本日は、UIコンポーネントとDBのバインドについて説明します。
今回のプログラムは、前回のプログラムを少し改造して作成を行います。
実行結果:
DBより人間の名前を取得しドロップダウンリスト(コンボボックス)上に
表示させます。
そして、リストより名前を選択し、ボタンを実行すると対応する人に対して、
「こんにちは、***さん」と表示するプログラムを作成します。
事前情報:
まず、プログラムを作成する前に、事前情報を少し話しします。
今回、ここで提供したい情報はCreator2がJDBCのRowSetをサポートしている
  ということです。
JSR 114: JDBC Rowset Implementations
このJDBC RowSet(行セット)テクノロジにより、Creatorでは、
データベースにドラッグ & ドロップでグラフィカルに
アクセスしたり、照会をグラフィカル編集したりできます。
加えて、JDBC 互換の為、Creator から、広範囲の SQL データベース
を利用できるようになります。
プログラムの作成:
さて、前置きはここまでにして、実際にプログラムを作成していきましょう。
まず、前回のプロジェクトからテキストフィールドを削除してください。
削除は、テキストフィールドを選択し、マウスの右ボタンをクリックします。
そして、「Delete」を選択実行するとコンポーネントを削除できます。

そしてDropDownListコンポーネントをドラッグ&ドロップにて、
画面に貼り付けてください。すると下記の画面が表示されます。

ここで、下記の「outline」パレットを確認してください。
デフォルトで設定されている、dropDownListコンポーネントのオプションの値が
確認できます。仮に現在の状態でプログラムを実行するとドロップダウンリスト
(コンボボックス)には「Item1」、「Item2」、「Item3」の文字列が表示され
選択可能になっていることが確認できます。

UIコンポーネントとDBテーブルのバインド
この状態は、まだDBにはバインドされていませんが、これからdropDownList
コンポーネントをDBのテーブルにバインドする方法を行います。
今回は、DBテーブルとしてCreator2にデフォルトで登録されている、「Person」
テーブルにバインドします。
補足:CreatorはデフォルトでPointBaseという簡易データベースサーバが同梱されています。
手順として、まず「Server」タブを選択します。「Server」タブ中の「Data Sources」
ツリーより、「Trabel」→「Tables」→「PERSON」テーブルを表示させます。
そして、「PERSON」テーブルをドラッグ&ドロップでdropDownListコンポーネント上に
配置します。
すると、dropDownListコンポーネント上に表示されていた、「Item1」の項目は
「abc」という文字列に変わります。

ここで、ドロップダウンリスト上で選択可能な表示項目、そして選択した後の
実行結果を設定します。ドロップダウンリスト上でマウス右クリックを押下して
ください。すると下記の項目が表示されます。ここで「Bind to Data」を実行します。

「Bind to Data」を実行すると下記の画面が表示されます。
ここで、「Value Field」と「Display Field」を選択します。
今回の例では、表示も実行結果も人間の名前を設定したい為、両方ともに、
「PERSON.NAME」を選択し「OK」ボタンを押下してください。
これで、UIコンポーネントとDBへのバインドは完了です。
とても簡単ですよね!!

さて、それではこのプログラムの実装を行いたいと思います。
前回のプロジェクトと同様、画面デザインに戻って、「こんにちは」ボタンを
ダブルクリックしてください。

すると、button1_action()メソッドを記述する画面が表示されるかと思います。
ここで、下記のコードを記述してください。

public String button1_action(){
//TODO: Replace with your code
String name = (String) dropDown1.getSelected();
String splitnames[] = name.split(“,”);
staticText1.setText(“こんにちは” + splitnames[1] + “さん!!”);
return null;
}

コードを若干説明します。ドロップダウンリストをドラッグ&ドロップした際、
dropDown1というIDが割り当てられ、そしてCreatorにより自動的に
下記のコードが生成されています。今回、DropDownクラスのインスタンスメソッド
getSelected()を実行し、選択された値を取得しています。
取得した文字列(名前)は、”,”(カンマ)によって分割されたFirstNameと
LastNameとなっています。今回LastNameだけを表示させるため、文字列を分割して
表示させています。

private DropDown dropDown1 = new DropDown();
public DropDown getDropDown1() {
return dropDown1;
}
public void setDropDown1(DropDown dd) {
this.dropDown1 = dd;
}

さて、上記のコードを記述したら、後は「Build」して実行します。
無事コンパイル(Build)は完了しましたか?実行すると下記のような
実行結果が得られるかと思います。

最後に、先ほどは表示名と返り値を共に「PERSON.NAME」としましたが、
色々と変えて実行してみてください。
以上で、UIコンポーネントとDBテーブルとのバインドについて説明しましたが、
問題なくできたでしょうか?
次回は、HTMLの<TABLE>(表)に対してDBテーブルをバインドさせる方法について
記載する予定です。

2005年11月16日 at 9:07 AM

Yahoo AJAX 対応 (an aerial photograph.)


YahooもGoogle Mapと同様マウスでスクロール可能な地図を
発表したようです。(β版のようですが)。これも最近話題の、
AJAX(Asynchronous JavaScript+XML)という技術で実装されています。
下記の写真はSun Microsystemsの用賀オフィスを航空写真で表示した
地図ですが、マウスで中心を移動させるとスムーズに画像が切り替わります。

さて、紹介はさておき、今後Webアプリケーションを作成していく上で、
今後も益々AJAXは使用されてくるようになるかと思います。
AJAXとJSFを組み合わせた使い方は世の中に数多く報告されてきていますが、
下記にSun Java Studio Creatorを使用したAJAX JSFのサンプル作成チュートリアルが
記載されていますので、御紹介します。
http://developers.sun.com/prodtech/javatools/jscreator/ea/jsc2/learning/tutorials/textcompletion.html

2005年11月15日 at 9:00 AM

過去の投稿


Java Champion & Evangelist

ご注意

このエントリは個人の見解であり、所属する会社の公式見解ではありません

カレンダー

2005年11月
    12月 »
 123456
78910111213
14151617181920
21222324252627
282930  

カテゴリー

Twitter

clustermap

ブログ統計情報

  • 955,229 hits

Feeds