2010年6月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年6月15日火曜日

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

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

リストボックス
項目をxmlで定義する方法はわかりませんでしたが、下記の記述でリストボックスの配置はできますので、あとはJava側で書けばよいかと、、、


ラジオボタン
  • FormPanelの子要素として存在しないといけないようです。
  • ラジオボタンのグループはnameで指定します。
  • Javaからアクセスするためには、ui:fieldを指定します。
  • Java側からは、ラジオボタンの選択部分はgetValue()で入手することになります。

 
 りんご
 オレンジ
 
 
チェックボックス
ラジオボタンのようにformPanelの子要素にしなくてもできました。下記のような項目を複数並べてgetValue()で選択されているかどうか取り出すことができます。
Labo
正しい使い方がわかり次第、随時、修正していきます。また、別のWidgetについても取り上げていきます。

2010年6月10日木曜日

C++/CLIでHTTPアクセス

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

HttpWebRequestを使うならこちら
    String^ result;
    String^ url = "ここにURLを書く";

   //IDとパスワードを設定するならここで
    NetworkCredential^ nc = gcnew NetworkCredential(id,password);  
    try{
      HttpWebRequest^ request = (HttpWebRequest^)HttpWebRequest::Create(url);
      request->Credentials=nc;
      WebResponse^ response = request->GetResponse();
      StreamReader^ reader =     gcnew StreamReader(response->GetResponseStream());
      result = reader->ReadToEnd();
      reader->Close();
      response->Close();
  }catch(System::Net::WebException^ e){
        //ここでなんらかのエラー処理をする
        System::Diagnostics::Debug::WriteLine("エラー:"+ e->Response->ToString());
        return "";
    }


WebClientを使うなら、こんな感じです。
    String^ result;
    String^ url = "ここにURLを書く";
      try{
        WebClient^ client = gcnew WebClient();
        client->Credentials = nc;

        client->Encoding = Encoding::UTF8;

        array^ data =client->DownloadData(url);
        String^ result =Encoding::UTF8->GetString(data);
        return result;

    }catch(System::Net::WebException^ e){
        //ここでなんらかのエラー処理をする
        System::Diagnostics::Debug::WriteLine("エラー:"+ e->Response->ToString());
        return "";
    }


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

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

MainForm.ui.xml
    
        header
        
            left
            center
            right
        
    
こ の例では、「heder」の領域とその下に、「left」「center」「right」にエリアが並ぶことになります(便宜上、ラベルを配置しています が、、、)。

このヘッダ領域に表示する内容を別のUIBinderで下記のように設計したとします。
HeaderArea.ui.xml

    
    
    
        

試作システムのヘッダ


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

MainForm.ui.xml(変更後)

    
    
    
        
        
            left
            center
            right
        
    


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