Home > Java

Java Archive

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • Comments (Close): -
  • TrackBack (Close): -

GWTでHello World

  • 2010-07-05 (Mon)
  • Java

take©です。 GWT (Google Web Toolkit) は Javascript を Java で書けるフレームワークです。 GWT が Java のコードを Javascript に変換してくれるので、クライアントサイドのコーティングも eclipse を使ったコンパイルチェックやコード補完によって効率よく開発が可能です。 今回はごく簡単なHello Worldをメモ。

web.xml

今回はクライアントサイドだけのサンプルなので、web.xmlは空っぽ。

war/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
</web-app>

HTML Page

まず画面を用意する。とはいっても body の中は空っぽ。GWTでは画面を構成する要素 (HTML) を Javascript で組み立てる。
これまでは、 Servlet → JSP → HTML な感じのフローだったが、
GWTでは、 HTML → Javascript (AJAX) → Servlet な感じになる。
これが今までの作り方とだいぶ異なるので慣れる必要がある。 もちろん Javascript の部分は Java で書ける。

<script type="text/javascript" language="javascript" src="sample/sample.nocache.js"></script>
は次に記載する Module をコールするためのもので、GWT が Javascript に変換した Java のコードをここで実行する。

war/sample.html

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" language="javascript" src="sample/sample.nocache.js"></script>
</head>
<body>
</body>
</html>

Module

Module を定義する。GWT の Module は Javascript, HTML, CSS のセットみたいなものでアプリケーションや機能の単位になる。 GWT はクラスパスから *.gwt.xml を探して Module を作成する。

rename-to 属性によって Javascript のパスを変更できる。
HTML に記述した sample/sample.nocache.js の部分がそれにあたる。

source 要素では Java のパッケージ名を指定する。
ここで指定したパッケージ配下の Java コードは GWT が Javascript に変換してくれる。

entry-point 要素では最初に実行される Javascript を指定する。 実際には Java クラスを指定する。Entry Point に指定したクラスはインターフェイス EntryPoint を実装する。

src/jp/ad/netforest/gwt/Sample.gwt.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.3//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.3/distro-source/core/src/gwt-module.dtd">
<module rename-to="sample">
	<inherits name="com.google.gwt.user.User" />
	<source path="client"/>
	<entry-point class="jp.ad.netforest.gwt.client.SampleEntryPoint"/>
</module>

Entry Point

EntryPoint を実装する。ここに書いたコードが Javascript に変換され、sample.html を表示したときに実行される。

src/jp/ad/netforest/gwt/client/SampleEntryPoint.java

package jp.ad.netforest.gwt.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.RootPanel;

public class SampleEntryPoint implements EntryPoint {
	public void onModuleLoad() {
		Button button = new Button("click me!");
		button.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				Window.alert("hello world!");
			}
		});
		RootPanel.get().add(button);
	}
}

実行結果

eclipse で実行してみる。今日はここまで。

20100705_01

OpenSSOでワンタイムパスワード

  • 2009-10-25 (Sun)
  • Java

mattyです。今回は、SSO(シングルサインオン)を実現するJavaのオープンソース・ソフトウェアである  OpenSSO に導入された「ワンタイムパスワード」の機能を検証してみたいと思います。

OpenSSOはSun Microsystemsが中心となって進められており、次期リリースのアーリー・アクセス版が3ヵ月サイクルでリリースされていますが最近リリースされた機能に「ワンタイムパスワード」が含まれています。
(OpenSSOのリリーススケジュールと追加予定機能は こちら)

ワンタイムパスワードとはその名の通り一度しか使えない使い捨てパスワードのことですが、OpenSSOでの実現方法について(上記「こちら」のページに)以下のように記載されています。

ユーザが携帯電話経由でワンタイムパスワードを取得できるようにする機能をOpenSSOに追加する予定です。(SMSのテキストメッセージを利用します。) 現在、提供している多要素認証を置き換えわけではありませんが、ワンタイムパスワードのためのソリューションを別途購入することに抵抗があるお客様に対する、簡単な代替案となります。 このソリューションの主な利点は顧客に携帯電話を物理トークンのデバイスの代わりとして使用させることで、 別途物理トークンデバイスを購入する場合に比べてより低い運用コストを実現可能なことです。

つまり携帯電話のショートメールサービスを使ってワンタイムパスワードを取得し認証をするという、 ワンタイムパスワードの簡単な代替案なのですね。では実際に設定してみたいと思います。

1) OpenSSOのダウンロードとインストール

OpenSSOダウンロードページより opensso_express_20090901.zip をダウンロードします。
インストールについては詳しく紹介されているサイトが他にありますのでこちらなどを参考にして行ってください。
今回は下記の環境で行いました。

OSCentOS 5.0
JavaJDK 6 Update 16
webコンテナTomcat 6.0.20

2) 管理者権限でログイン

20091026_01.jpg

OpenSSOに管理者権限でログインします。
ログインID「amadmin」と、インストール時に設定したそのパスワードを入力してください。


3) ワンタイムパスワードの設定

20091026_03jpg

「アクセス制御」タブをクリックします。


20091026_04jpg

「/ (最上位のレルム)」をクリックします。


20091026_05jpg

「認証」タブをクリックします。


20091026_07jpg

認証タブ画面の下の方にある認証連鎖欄の「ldapService」をクリックします。 ここには現在「ID・パスワードの認証」のみが設定されてますが、「ワンタイムパスワードの認証」をこれより追加します。


20091026_08jpg

「追加」ボタンを押します。


20091026_09.jpg

1行増えるので、増えた行のインスタンスに「HOTP」を指定してください。これが「ワンタイムパスワード」の認証追加の指定となります。指定したら「保存」ボタンを押します。
保存されると「認証連鎖プロパティーは更新されました。」と表示されるので、次に「認証へ戻る」ボタンを押してください。


4) 残念な事実

20091026_11.jpg

残念なことに日本ではキャリアーを超えてショートメールを送ることは現在はできないようです(来年あたり改正されるようですが)。海外から送る方法もあるようなのですが、、仮に出来ても高額となります。
ですので今回は普通のメールアドレスにワンタイムパスワード情報を送ることにします。 3つ上のキャプチャーの画面で「HOTP」をクリックすると左の画面が表示されますが、これがワンタイムパスワードの設定で、電子メールがデフォルトで送るようになっていますので何もする必要はありません。


5) ユーザーのメールアドレス設定

20091026_10.jpg

次にワンタイムパスワードの送信先メールアドレスの設定が出来ていないので、ユーザー情報に設定します。 「対象」タブをクリックし、今回はdemoユーザーに設定しますので「demo」をクリックしてください。


20091026_12.jpg

「編集」リンクをクリックしてパスワードを設定し、メールアドレス欄にアドレスを入力したら「保存」ボタンを押してください。
「プロファイルが更新されました。」と表示され、これで設定は完了なので画面右上の「ログアウト」ボタンを押してください。
ログイン画面に戻り、実際にワンタイムパスワード認証を行います。


6) ワンタイムパスワード認証

20091025_13.jpg

ログインIDに「demo」、パスワードに設定したパスワードを入力します。


20091025_15.jpg

「OTPコードの要求」ボタンを押すとワンタイムパスワードが設定したメールアドレスに送信されます。 押した後、メールを受信しパスワードを取得したら画面に入力し「OTPコードの送信」ボタンを押してください。


20091025_16.jpg

ログインに成功すると、ユーザー設定画面が表示されます。シングルサインオンの設定がなされていれば、目的のサイトが表示されることになります。



ログインしたら設定されたメールアドレスに一定時間有効なパスワードを送るという機能が手軽に利用できました。 携帯で利用するには、まだショートメールサービスでは利用出来ないので例えばGmailを送信先に指定して、 Gmailの転送設定(ここから来たメールはここに送る)をして携帯に送るなどの工夫が必要ですね。

TomcatでGETパラメータの文字化け対策

  • 2009-10-08 (Thu)
  • Java

take©です。 古い情報になりますが、Tomcat5.xからGETパラメータに対してHttpServletRequest#setCharactorEncoding()による、文字コード指定が適用されなくなっています。
そのため、GETパラメータで日本語などを受け取る場合は文字化けてしまう場合があります。

以下の設定をserver.xmlに追記することで回避できます。
useBodyEncodingForURI="true"

<Connector 
	connectionTimeout="20000" 
	port="8080" 
	protocol="HTTP/1.1" 
	redirectPort="8443" 
	useBodyEncodingForURI="true"/>

Sun Java認定試験

  • 2009-08-25 (Tue)
  • Java

こんにちは。mattyです。
プログラム言語はひたすら書いて他人のコードを読んでいいとこ取りしたりしながら上達するものだと思います。

その+アルファとしてSun Java認定試験の問題を解いてみるのも面白いのではないかと思い、 しばらく1日1問づつ開発メンバー何人かにやってみてもらいました。

実務では到底書かないようなプログラムコードやコンパイラがあればすぐに分かることが 問題になっていたりするのですが、実務とは別の角度からJava言語の理解度を問われ、解いてもらった後話に花が咲いたりと面白かったので幾つかご紹介したいと思います。

Q1

char型の宣言として有効なものを全て選んでください。
  1. char c1 = 01111;
  2. char c2 = 'babe';
  3. char c3 = 0xfeed;
  4. char c4 = \u1111;
  5. char c5 = '\ibabe';
  6. char c6 = '\ubabe';
  7. Q2

    次のコードがあります。
    public class Sample
    {
      public static void main(String[] args)
      {
        try {
          System.out.print("Try ");
        }
        finally {
          System.out.println("Finally");
        }
      }
    }
    
    結果はどうなりますか。(1つ選択)
    1. 例外を指定していないので、コンパイルできない
    2. catch句を指定していないので、コンパイルできない
    3. Try
    4. Try Finally
    5. Q3

      結果はどうなりますか。
      public class Sample
      {
        public static void main(String[] args)
        {
          String s1 = "abc";
          String s2 = "def";
          String s3 = s2;
          s2 = "ghi";
          System.out.println(s1 + s2 + s3);
        }
      }
      
      1. abcdefghi
      2. abcdefdef
      3. abcghidef
      4. abcghighi
      5. コンパイルエラー
      6. 実行時に例外が投げられる



      Q1の回答

      a,c,f
      b・・・char型リテラルに複数の文字は入らないのでバツです
      d・・・単一引用符がないのでバツです
      e・・・「\i」で始まっているのでバツです

      Q2の回答

      d
      try句の後にcatch句かfinally句少なくともどちらか一方あればいいと、eclipseならすぐ教えてくれますね。try句だけだと怒りますね。

      Q3の回答

      c
      これは理解しておかないと危険な部類の知識ですね。



      出題範囲が体系的にまとめられているので、 Java言語の知識を整理するのに役立ちますね。

COUNT関数とClassCastException

  • 2009-06-29 (Mon)
  • Java

バーボンです。最近のブームはClassCastExceptionです。
PostgresDBアクセス時、COUNT関数を使って得られた結果をList<Object>()に入れ、 後に値をInteger型にしようとしたときのことです。

*流したSQL
SELECT blood_type, COUNT(*) FROM staff 
GROUP BY blood_type 
ORDER BY blood_type
たとえばこんな感じで
List<Object> bloodCountList = staffDao.countBloodGroup();
Map<BloodGroup, Integer> bloodCountMap 
    = new LinkedHashMap<BloodGroup, Integer>();

for (Iterator i=bloodCountList.iterator(); i.hasNext();) {
    listElement = (Object[])i.next();
    bloodCountMap.put((BloodGroup)listElement[0], (Integer)listElement[1]);
}
…

これを実行するとjava.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integerというエラーが出ました。Longを使った覚えがないので調べてみたところ

1.COUNT関数の戻り値(Postgres,Oracle)のデフォルトはbigint型というデータ型で、整数の記録のため8バイトの領域が割り当てられるものである。そして、コンパイル時の対応するJavaの型はjava.lang.Long→エラーのLong型の正体。

そうするとこのままLong型をInteger型にするしかなさそうです。

2.Long型→Integer型への変換は、Long,Integerの親である、Numberクラスにbyte, double, float, int, long, short型のそれぞれにキャストできるメソッドがあるので、今回はその中のintValue()を使います。(Integerというかint型にしてます。JDK1.5以降の恩恵により、int→Integerの変換はAutoBoxingしてもらいます。)

http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Number.html

java.lang.Object

-java.lang.Number

-java.lang.Integer

直してキャストしてみます。

bloodCountMap.put((BloodGroup)listElement[0], ((Number)listElement[1]).intValue());

これを実行するとエラーは消えました。

Home > Java

Recent Comments
Recent Trackback
Search
Meta
Links
Feeds

Page Top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。