Loading [MathJax]/extensions/tex2jax.js

2010-06-21

GWTでのXML処理 ~Namespaceありのノードを読み込む問題~

現在調査中なのだが、GWTのクライアント側で、com.google.gwt.xml.clientパッケージ下のXMLライブラリを使う場合、Namespaceの処理ができない?という結論に至っている。厄介なのは、
  • getElementsByTagName()メソッドで、NamespaceのPrefixを付け足しすとそのノードを導けない
  • getNamespaceURI ()メソッドは有効になっている
つまり、ノードとしてはNamespaceを区別しているんだけど、呼び出し等のメソッドが対応していないと。 。。

では、どうすればいいのかというと、
  • getElementsByTagName()の引数は、Namespaceは無視してタグ名だけを記述する
 ということ。

もし、同一名称のタグが存在するのであれば、その区別をする必要があるので、その場合は、
  • getPrefix()でNamespaceのPrefixがとってこれるのでそれを比較する
というなんか情けないことをするしかないようで、、、、、これは、JavaScriptのXMLパーザーの仕様が関係しているのでしょうか?ちょっと個人的には信じられない仕様なので、今後も調査を継続したいところです。


個人的なつぶやき

  • getNamespaceURI ()があるのに、なんでsetNamespaceURI ()がないのか、、、
  • GWTの開発陣営はこの点をどう考えているのかな


2010-06-15

UIBinderで各種Widgetを使ってみる~ラジオボタン、チェックボックス、リストボックス~

各種標準WidgetのUiBinderのXMLの記述方法について、現状把握していることを書いてみます。情報が少ないので、ちょっと間違っているかもしれません。とりあえずの参考にしてください。

リストボックス
項目をxmlで定義する方法はわかりませんでしたが、下記の記述でリストボックスの配置はできますので、あとはJava側で書けばよいかと、、、
  1. <g:listbox ui:field="listBox" visibleitemcount="1">  
  2. </g:listbox>  

ラジオボタン
  • FormPanelの子要素として存在しないといけないようです。
  • ラジオボタンのグループはnameで指定します。
  • Javaからアクセスするためには、ui:fieldを指定します。
  • Java側からは、ラジオボタンの選択部分はgetValue()で入手することになります。
  1. <g:formpanel ui:field="form">  
  2.  <g:verticalpanel>  
  3.  <g:radiobutton name="fruit" ui:field="aaa">りんご</g:radiobutton>  
  4.  <g:radiobutton name="fruit">オレンジ</g:radiobutton>  
  5.  </g:verticalpanel>  
  6.  </g:formpanel>  
チェックボックス
ラジオボタンのようにformPanelの子要素にしなくてもできました。下記のような項目を複数並べてgetValue()で選択されているかどうか取り出すことができます。
  1. <g:checkbox ui:field="checkLab" formvalue="labo">Labo</g:checkbox>  
正しい使い方がわかり次第、随時、修正していきます。また、別のWidgetについても取り上げていきます。

2010-06-10

C++/CLIでHTTPアクセス

以前、ツイッタークライアントの記事で書いた内容と同じですが、C++/CLIでHTTPアクセスする方法として2つ書いておきます。

HttpWebRequestを使うならこちら
  1.   String^ result;  
  2.   String^ url = "ここにURLを書く";  
  3.   
  4.  //IDとパスワードを設定するならここで  
  5.   NetworkCredential^ nc = gcnew NetworkCredential(id,password);    
  6.   try{  
  7.     HttpWebRequest^ request = (HttpWebRequest^)HttpWebRequest::Create(url);  
  8.     request->Credentials=nc;  
  9.     WebResponse^ response = request->GetResponse();  
  10.     StreamReader^ reader =     gcnew StreamReader(response->GetResponseStream());  
  11.     result = reader->ReadToEnd();  
  12.     reader->Close();  
  13.     response->Close();  
  14. }catch(System::Net::WebException^ e){  
  15.       //ここでなんらかのエラー処理をする  
  16.       System::Diagnostics::Debug::WriteLine("エラー:"+ e->Response->ToString());  
  17.       return "";  
  18.   }  

WebClientを使うなら、こんな感じです。
  1.     String^ result;  
  2.     String^ url = "ここにURLを書く";  
  3.       try{  
  4.         WebClient^ client = gcnew WebClient();  
  5.         client->Credentials = nc;  
  6.   
  7.         client->Encoding = Encoding::UTF8;  
  8.   
  9.         array<byte>^ data =client->DownloadData(url);  
  10.         String^ result =Encoding::UTF8->GetString(data);  
  11.         return result;  
  12.   
  13.     }catch(System::Net::WebException^ e){  
  14.         //ここでなんらかのエラー処理をする  
  15.         System::Diagnostics::Debug::WriteLine("エラー:"+ e->Response->ToString());  
  16.         return "";  
  17.     }  
  18. </byte>  


GWTのUIBinderでコンポーネント化を試みる

GWTのUIBinderは、ただ単にUIの記述が楽になると言うだけでなく、UIの部品化(コンポーネント化)を容易に実現することができます。 具体的に言えば、UIBinderにて設計したインタフェース部分は、また別のUIBinderのところで呼び出すことができます。
例えば、あるページの本体構造を定義するMainFormのUI定義ファイルを以下のように定義されていたとします。

MainForm.ui.xml
  1. <g:verticalpanel>  
  2.     <g:label>header</g:label>  
  3.     <g:horizontalpanel>  
  4.         <g:label>left</g:label>  
  5.         <g:label>center</g:label>  
  6.         <g:label>right</g:label>  
  7.     </g:horizontalpanel>  
  8. </g:verticalpanel>  
こ の例では、「heder」の領域とその下に、「left」「center」「right」にエリアが並ぶことになります(便宜上、ラベルを配置しています が、、、)。

このヘッダ領域に表示する内容を別のUIBinderで下記のように設計したとします。
HeaderArea.ui.xml
  1. <ui:uibinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">  
  2.     <ui:style>  
  3.     </ui:style>  
  4.     <g:htmlpanel>  
  5.         <h2>試作システムのヘッダ</h2>    </g:htmlpanel>  
  6. </ui:uibinder>  

このようにUIBinderで定 義したUIを一部は、下記のようにすることでMainFormに記述することができます。

MainForm.ui.xml(変更後)
  1. <ui:uibinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:o="urn:import:org.ochilab.client.widget">  
  2.     <ui:style>  
  3.     </ui:style>  
  4.     <g:verticalpanel>  
  5.         <o:headerarea>  
  6.         <g:horizontalpanel>  
  7.             <g:label>left</g:label>  
  8.             <g:label>center</g:label>  
  9.             <g:label>right</g:label>  
  10.         </g:horizontalpanel>  
  11.     </o:headerarea></g:verticalpanel>  
  12. </ui:uibinder>  

こ のように、定義したUIBinderのクラスのパッケージをimportによりXMLのNamespaceに関連付け、利用するクラス名をタグ名として記 述することで、呼び出すことができます。こ れは、インタフェース部分の分業をはかる際に非常に強力になりますので、そういった意味でもUIBinderはおすすめだと思います。