2011年7月26日火曜日

GWTでURLのパラメータの取得

GWTでURLのパラメータの取得ってどうやるのかと
調べていたら意外に簡単に出来ることがわかった。


Window.Locationというクラスを利用すれば出来る。

Location.getParameter(”val”)

と書けば、

http://hoge/?val=xxxx

というようなURLのvalの値を取得することが出来る。

2011年7月25日月曜日

GWTのログ機能

GWTにはログ機能がある。
それをいじってみた。
本家のドキュメントはこちら。

http://code.google.com/webtoolkit/doc/latest/DevGuideLogging.html


java.util.loggingクラスをエミュレートしたログクラスが用意されており、
クライアント側、サーバ側の両方にログを出力することが出来るようです。

手順は簡単で、下記の2ポイントだけ。

.gwt.xmlファイルに下記の記述の追加。

<inherits name="com.google.gwt.logging.Logging"/>

 <set-property name="gwt.logging.logLevel" value="SEVERE"/>
 <set-property name="gwt.logging.enabled" value="FALSE"/> 
 <set-property name="gwt.logging.consoleHandler" value="DISABLED"/>


ログハンドラの種類は、
SystemLogHandler
DevelopmentModeLogHandler
ConsoleLogHandler
FirebugLogHandler
PopupLogHandler
SimpleRemoteLogHandler
などがあり、必要に応じてENABLE,DISABLEを設定する。


ソースには、通常の java.util.loggingクラスを利用した方法と同様に記述
 Logger logger = Logger.getLogger("NameOfYourLogger");
 logger.log(Level.SEVERE, "ログ");


SimpleRemoteLogHandler をENABLEにするとサーバ側にログが記録されるようになる。

これをこのまま実行するとサーブレットが定義されていないというようなエラーが
出てしまうので、web.xmlにログ記録用のサーブレットを定義しておく必要がある。

< servlet >
< servlet-class>com.google.gwt.logging.server.RemoteLoggingServiceImpl </servlet-class > 
< servlet-name >logger < /servlet-name >
< /servlet >
< servlet-mapping >
< servlet-name>logger </servlet-name >
< url-pattern>/(ここは、環境によって変更する)/remote_logging </url-pattern >
< /servlet-mapping >

2011年7月16日土曜日

Javaで件数に上限のあるキャッシュの作成

Javaで件数に上限のあるキャッシュの作成ってどうやるのが普通なんだろうと
いろいろ調べてみる。
LinkedHashMapを利用するとすごく簡単にFIFOタイプLRUタイプのキャッシュが
簡単に出来ることがわかった。

FIFO…最初に入ったやつ(古いものから追い出す)タイプ
LRU…一番最後に利用されたものから追い出すタイプ

こんな簡単に実装できるとはびっくりした。

下記がサンプルです。

import java.util.LinkedHashMap;
import java.util.Map.Entry;

public class CacheSample {

 private static class FIFOCache<K,V> extends LinkedHashMap<K,V>{
  /**
   * 
   */
  private static final long serialVersionUID = 1L;
  private int maxEntries;
   public FIFOCache(int maxEntries) {
    super(maxEntries,(float) 0.75,false);
    this.maxEntries=maxEntries;
   }
   protected boolean removeEldestEntry(Entry<K,V> eldest) {
    return size()>maxEntries;
   }
 }
 private static class LRUCache<K,V> extends LinkedHashMap<K,V>{
  /**
   * 
   */
  private static final long serialVersionUID = 1L;
  private int maxEntries;
   public LRUCache(int maxEntries) {
    super(maxEntries,(float) 0.75,true);
    this.maxEntries=maxEntries;
   }
   protected boolean removeEldestEntry(Entry<K,V> eldest) {
    return size()>maxEntries;
   }
 }
 public static void main(String[] args) {
  System.out.println("FIFOの場合");
  //上限50個のFIFOキャッシュを作成
  FIFOCache<Integer,String> fifocache = new FIFOCache<Integer,String>(50);
  testCache(fifocache);
  System.out.println("LRUの場合");
  //上限50個のLRUキャッシュを作成
  LRUCache<Integer,String> lrucache = new LRUCache<Integer,String>(50);
  testCache(lrucache);

 }
 private static void testCache(LinkedHashMap<Integer,String> cache) {
  for (int i=0;i<50;i++){
   cache.put(new Integer(i), "HOGE"+i);
  }
  System.out.println(cache.get(new Integer(0)));
  for (int i=50;i<70;i++){
   cache.put(new Integer(i), "HOGE"+i);
  }
  if (cache.containsKey(new Integer(0))){
   System.out.println("0が残っている");
  }else{
   System.out.println("0が消えている");
  }  
 }
}

2011年7月2日土曜日

GWTで外部リンクを張る処理の記述方法

GWTでリンクを張る場合に、HyperLinkとかいうクラスを使うのかな
と思ってみてみたけど、どうやらこれではないようでした。

http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/user/client/ui/Hyperlink.html

一応、下記のページを参考にしながら方法を書いてみる。

http://code.google.com/webtoolkit/doc/latest/DevGuideSecuritySafeHtml.html

まず、最初に、SafeHtmlTemplates を継承した下記のようなクラスを作成する。
これにより、htmlを返す

 public interface LinkHtmlTemplates extends SafeHtmlTemplates {
     @Template("<a href=\"{0}\"  target=\"_blank\">{1}</a>")
     SafeHtml makeLinkHtml(String url, String linkText);
   }


次に、下記のような記述でkオブジェクトの生成をする。

 private static final LinkHtmlTemplates LINK_TEMPLATES =
       GWT.create(LinkHtmlTemplates.class);

そんで、これを使って、下記のような感じでSafeHtmlを生成する。


 SafeHtml ihtml = LINK_TEMPLATES.messageWithLink(getBTSUrl(numPart), numPart);
 sb.append(ihtml);

こんな感じで書くと、リンクを張るようなものができました。